iptables是配置netfilter过滤功能的用户空间工具。netfilter才是防火墙真正的安全框架,netfilter位于内核空间。我们可以理解iptables为一种命令行工具。
iptables处理数据包的定义方法有,放行(accept)、拒绝(reject)、丢弃(drop)等。
netfilter才是真正的防火墙,它是内核的一部分,那它要起作用,就需要在内核中设置关卡,所有进出报文都要通过这些关卡,经过检查,符合放行条件的才能放行,反之阻止。
filter:用来对数据包进行过滤;
nat:用来修改数据包的IP地址、端口信息;网络地址转换
mangle:用来修改数据包服务类型、生存周期,为数据包设置标记,实现流量整形、策略路由等。报文解析封装。
raw:决定是否对数据包进行状态跟踪
优先级关系:raw--mangle--nat--filter
input:收到访问本机地址的数据包时,将应用此链中规则;
output:本机向外发送数据包时,应用此链中规则;
forward:收到需要转发给其它地址的数据包时,应用此链中规则;
prerouting:在对数据包做路由选择之前,将应用此链中规则;
postrouting:在对数据包路由选择之后,将应用此链中的规则
表 | 链(钩子) |
raw | REROUTING、OUTPUT |
mangle |
REROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING |
nat | REROUTING、OUTPUT、POSTROUTING(centos7中还有INPUT) |
filter | INPUT、FORWARD、OUTPUT |
一般场景报文流向:
到本机某进程的报文:PREROUTINGX->INPUT
由本机转发的报文:PREROUTING->FORWARD->POSTROUTING
由本机的某进程发出报文(一般为响应报文):OUTPUT->POSTROUTING
-t:跟表名
-n:不解析IP地址
-v:显示计数器信息、数据包数量和大小
--line-numbers:显示规则序号
-L:链名
# iptables -t filter -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 382 28397 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 15 1170 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 244 packets, 31201 bytes)
num pkts bytes target prot opt in out source destination
centos7默认是firewalld而不是iptables,若要使用iptables,需要先禁用firewalld再安装iptables并启用
禁用firewalld:
#systemctl status firewalld
#systemctl stop firewalld
#systemctl disable firewalld
下次启用firewalld并让它自己启动:
#systemctl start firewalld
#systemctl enable firewalld
安装iptables:
#yum install iptables-services
#systemctl start iptables
#systemctl enable iptables
如果使用centos6,其默认为iptables,启动其服务
#services iptables start
在指定表的指定链的尾部添加一条规则,-A+链名表示在对应链的末尾添加规则,(-t可以省略,默认为filter):
iptables -t 表名 -A 链名 匹配条件 -j 动作
#iptables -t filter -A INPUT -s 192.168.42.139 -j DROP
在指定表的指定链的首部添加一条规则,-I+链名表示在对应链的开头添加规则:
iptables -t 表名 -I 链名 匹配条件 -j 动作
#iptables -t filter -I INPUT -s 192.168.42.139 -j ACCEPT
在指定表的指定链的指定位置添加一条规则:
iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
#iptables -t filter -I INPUT 3 -s 192.168.42.139 -j REJECT
允许所有ssh访问
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
仅允许B主机对A 主机的apache访问
iptables -t filter -A INPUT -s 192.168.42.137 -p tcp --dport 80 -j ACCEPT
ACCEPT:允许数据包通过。
DROP:丢弃数据包,不给任何回应信息。
REJECT:拒绝数据包通过,必要会给发送端一个响应信息,客户端刚请求就会收到拒绝信息。
SNAT:源地址转换。
MASQUERADE:SNAT特殊形式,适用于动态、临时会变的IP上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。即除了记录外不对数据包做任何其它操作,任然让下一条规则取匹配。
iptables -t 表名 -D 链名 规则序号
删除INPUT中的第三条
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# iptables -t filter -D INPUT 3
iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
按照具体匹配条件与动作进行删除。
# iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.42.137 -j ACCEPT
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT tcp -- 192.168.42.137 0.0.0.0/0 tcp dpt:80
iptables -t filter -D INPUT -p tcp --dport 80 -s 192.168.42.137 -j ACCEPT
iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
删除指定表指定链中的所有规则(慎用)
iptables -t 表名 -F 链名
删除所有规则
iptables -F
修改规定表中指定链的指定规则,-R+链名
iptables -t 表名 -R 链名 规则序号 规则原本匹配条件 -j 动作
#iptables -t filter -R INPUT 3 -S 192.168.42.137 -j ACCEPT
设置指定表的指定链的默认策略:
iptables -t 表名 -P 链名 动作
#iptables -t filter -P FORWARD ACCEPT
保存:
# iptables-save > /etc/sysconfig/iptables
重载(现有规则会被覆盖):
#iptables-restore < /etc/sysconfig/iptables
#services iptables save
#iptables-save > /etc/sysconfig/iptables
#iptables-restore < /etc/sysconfig/iptables
当规则中同时存在多个匹配条件时,多个条件之间默认存在“与”的关系,即报文必须同时满足所有条件,才能被规则匹配。
-s:用于匹配报文的源地址,可同时指定多个源地址,每个IP用逗号隔开,也可以指定为一个网段
# iptables -t filter -I OUTPUT -s 192.168.42.137,192.168.42.138 -j DROP
# iptables -t filter -I INPUT -s 192.168.42.0/24 -j ACCEPT
# iptables -t filter -I INPUT ! -s 192.168.42.0/24 -j ACCEPT
-d:用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP用逗号隔开,也可以指定为一个网段
# iptables -t filter -I OUTPUT -d 192.168.42.137,192.168.42.138 -j DROP
# iptables -t filter -I INPUT -d 192.168.42.0/24 -j ACCEPT
# iptables -t filter -I INPUT ! -d 192.168.42.0/24 -j ACCEPT
-m limit --limit 1000/s设置最大平均匹配速率
-m limit --limit-burst 15 设置一开始匹配的最大数据包数量
-m limit --limit 5/m --limit-burst 15一开始能匹配的数量包数量为15个,每匹配到一个,limit-burst值减1,所以匹配到15个时,该值为0,以后没过12s,limit-burst值会加1,表示又能匹配到1个数据包
--limit-burst:类比“令牌桶”算法,指定令牌桶中令牌的最大数量
--limit:类比“令牌桶”算法,用于指定令牌桶中的新生令牌的频率,单位s、m
、h、d。
注意:--limit-burst的值要比--limit的大,limit本身没有丢包的功能,所以需要第二条规则一起才能实现限速功能。
--monthdays day1[,day2] 在每个月的特定天匹配
--timestart hh:mm:ss 在每天的特定时间开始匹配
--timestop hh:mm:ss 在指定时间停止匹配
--weekdays day1[,day2] 在每个星期的指定工作日匹配,值可以是1-7
#iptables -A INPUT -i eth0 -m time --weekdays 1,2,3 -j ACCEPT
#iptables -A INPUT -i eth0 -j DROP
#iptables -I FORWARD -s 192.168.42.139 -m time --timestart 16:10 --timestop 18:10 -j ACCEPT
#iptables -I FORWARD -d 192.168.42.139 -m time --timestart 16:10 --timestop 18:10 -j ACCEPT
-m --state NEW:第一次连接
RELATED:相关联的连接
ESTABLISHED:已连接
INVALID:无法识别的
UNTRACKED:无法追踪的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
--connlimit-above:限制上限
--connlimit-mask:按照网段做限制
#iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
# iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
--algo:指定对应的匹配算法,可用算法bm、kmp
--string:指定需要匹配的字符串
#iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
使用iprange模块,可以指定一段连续的IP地址范围,用于匹配报文的源地址或者目标地址
--src-range:源地址范围
--dst-range:目标地址范围
#iptables -t filter -A INPUT -m iprange --src-range 192.168.42.1-192.168.42.130 -j DROP
#iptables -t filter -A INPUT -m iprange --dst-range 192.168.42.1-192.168.42.130 -j DROP
#iptables -t filter -A INPUT -m iprange !--src-range 192.168.42.1-192.168.42.130 -j DROP
报文在经过iptables的链时会匹配链中规则,匹配到规则执行对应动作,若链中规则都无法匹配到当前报文,则使用链的默认策略,链的默认策略通常为ACCEPT或DROP。
当链的默认策略为ACCEPT时,(黑名单机制)对应的链中没有任何规则,就接受所有报文;对应链中存在规则,但规则没匹配到报文,报文还是会被接受。
当链的默认策略时DROP时,(白名单机制)对应链中没有配置任何规则,就表示拒绝所有报文,对应链存在规则,但这些规则没有匹配到报文,报文还是会被拒绝
#iptables -A INPUT -s 192.168.42.147 -j ACCEPT
设置默认拒绝(最好不要用)
iptables -P INPUT DROP
#iptables -A INPUT -p tcp -s 192.168.42.147 -j DROP
设置拒绝所有IP访问(慎用)
#iptables -A INPUT -p tcp -j DROP