Open jinhucheung opened 8 years ago
防火墙是整个数据包进入主机前的第一道关卡,那什么是防火墙?防火墙有什么机制?防火墙可以实现与不能实现的功能有哪些?其实Linux防火墙主要通过Netfilter与TCP Wrapper两个机制来管理,通过Netfilter可以实现让Private IP
主机上网,也可以让Internet连接到LAN中主机,所以防火墙相当重要
在Linux 学习之服务器篇 网络安全与主机基本防护:网络升级/限制端口/SELinux中我们可以知道,数据包进入主机时,会通过防火墙/服务程序/SELinux/文件系统,防火墙作为保护主机的第一道关卡,其主要功能是限制某些服务的数据进出
所以防火墙主要任务是在规划出:
Linux实现防火墙功能有一些三种形式:
Netfilter
其通过分析数据包表头信息来限制其访问与处理一些动作(比如转换来源/目标的IP地址或端口信息),主要分析OSI的第二/三/四层TCP Wrapper
控管程序对于数据包的处理OR丢弃,主要以程序名来限制数据包Proxy
通过代理服务器,中转我们主机的数据包,同时起到保护主机的作用前面提到Netfilter防火墙主要是分析数据包表头信息,其进行的分析工作主要有:
只不过即使有防火墙的限制,可是也不能说我们主机安全,比如我们向Internet开放WWW服务,由于要允许Internet上主机都可以连接我们主机的80端口,所以这些数据包要通过防火墙,达到服务进程处,这些数据包要是携带病毒,防火墙也是没办法处理的
TCP Wrappers是通过客服端想要连接的程序名,然后分析客服端的IP,来决定是否放行的
其通过配置文件/etc/hosts.{allow|deny}
来管理
支持TCP Wrappers
服务分为两类,分别是:
super damon(xinted)
所管理的服务libwrap.so
函数库的服务(可通过ldd
来查看)TCP Wrappers
的配置文件/etc/hosts.{allow|deny}
,其语法如下
<service(program name)>:<ip/domain/hostname>:action
其中hosts.allow
设置程序放行的ip,而hosts.deny
则相反,优先级上,hosts.allow
高于hosts.deny
当两个文件都不存在时,Linux默认以放行来处理
Linux实现Netfilter功能(数据包过滤)的软件是iptables
,其内核所提供,在效能上非常好
Netfilter防火墙是通过设定一条条规则来过滤数据包的,而这些规则在匹配数据包上有顺序(由上到下识别),匹配成功后就执行相应的action
,不再往下匹配
如果都不匹配,那等着此数据包的就是Poliey
(预设动作)了
比如下图,当一个数据包匹配rule 01
,就满足,执行其action -- [DROP],那么该数据包就会被主机给丢弃
由于防火墙有很多条规则,为了方便则是某类动作,我们将一组规则整合成chain(链)
,比如处理进入的数据包的规则组称为INPUT
,处理发出的数据包的规则组称为OUTPUT
,
而再将这些链组合在一起,专门针对某些功能,那就是table
了
iptables预设有以下三个table
,如下图
各表相关的功能如下
filter
主要跟进出主机的数据包有关,预设table为filter
INPUT
主要跟进入主机的数据包有关FORWARD
主要跟转递数据包有关,与nat table
相性高OUTPUT
主要跟主机发出的数据包有关nat
主要对数据包中目标/来源的IP与port进行修改
PREROUTING
在路由判断前进行的规则,主要修改目标IP/portPOSTROUTING
在路由判断后进行的规则,主要修改来源IP/portOUTPUT
与发出的数据包有关mangle
主要与数据包的flags有关当数据包在防火墙规则匹配过程中,各表与链的相关性如下图
虽然上图很复杂,但我们可以看出iptables控制的三种数据包的流向:
iptables-save [-t table]
iptables -F
清除所有的已制定的规则iptables -X
清除所有使用者制定的chainiptables -Z
所有chain的计数与流量统计都归0iptables -F INPUT
清空 filter表INPUT所有规则 iptables -D INPUT 3
删除input的第3条规则 iptables [-t tables] -P [INPUT,OUTPUT,FORWARD等] [ACCEPT,DROP]
# iptables [-AI 链名] [-io 网络接口] [-p 协议] \
> [-s 來源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
参数说明:
AI 链名
针对某条链进行规则的 "插入" 或 "累加"
A
在链的尾部增加一条规则I
在链的头部插入一条规则,成为第一条规则io 网络接口
:设置数据包进出的网络接口
i
数据包所进入的接口,如INPUT
链搭配o
数据包所出去的接口,如OUTPUT
链搭配p 协议
:设置此规则适用的数据包格式
tcp/udp/icmp等
s 来源 IP/网域
:设定此规则的数据包來源,可指定 IP或网域,例如:
d 目标IP/网域
: 设置此规则的数据包目标j
:后接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG) iptables [-AI 链] [-io 网络接口] [-p tcp,udp] \
> [-s 來源IP/网域] [--sport 端口范围] \
> [-d 目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]
参数:
--sport 端口范围
:限制來源的端口,端口可以是连续的,例如 1024:65535--dport 端口范围
:限制目标的端口匹配数据包的mac地址
iptables -A INPUT [-m mac] [--mac-source mac地址 ] -j action
匹配数据包的状态:
iptables -A INPUT [-m state] [--state 状态] -j action
数据包的状态有:
INVALID
无效的数据包,例如资料破损的数据包ESTABLISHED
已经连线成功的连续状态NEW
想要新建立连线的数据包状态RELATED
表示这个数据包是与我们主机发出去的数据包有关iptables -A INPUT [-p icmp] [--icmp-type 类型] -j action
类型是icmp包的类型,比如8
是echo request
,用于ping
连接
内核也一些功能,来处理网络状态:
/proc/sys/net/ipv4/tcp_syncookies
抵制基于SYN Flooding的DOS攻击/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
抵制基于Ping Flooding的DOS攻击/proc/sys/net/ipv4/conf/*/rp_filter
逆向路径过滤,抵挡一些不合理的数据包 /proc/sys/net/ipv4/conf/*/log_martians
记录不合法的IP来源通常一些简单的防火墙规则有以下:
规则归0
: 清除所有已经存在的规则预设政策
: 除了INPUT链预设为DROP,其他预设为ACCEPT信任本机
: 开放lo接口回应数据包
: 让主机主动向外要求而回应的数据包可以进入本机(ESTABLISHED,RELATED)信任用户
: 非必要,可以让LAN的来源可访问主机资源NAT服务在于修改数据包的来源/目标的Socket Pair,其关注的是nat表的PREROUTING链(修改目标的Socket Pair)与POSTROUTING(修改来源的Socket Pair)
如上图所示,SNAT通常用于让LAN的主机通过服务器的Public IP连上Internet
设置方法:iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
$innet
是LAN的network,如192.168.100.0/24
$EXTIF
是对外的网络接口,如eth0MASQUERADE
让IP伪装成数据包出去(-o)的网络接口上的IP或者设置成,经由eth0出去的数据包,将它们的来源IP改成 192.168.1.210-192.168.1.220
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.210-192.168.1.220
如上图所示,DNAT通过用于Internet主机访问LAN中的主机
设置方法:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.100.10:80
将从eth0进入且目标端口是80的数据包,都转移到192.168.100.10:80上
Index