iptables学习笔记

2018-12-07  本文已影响3人  书上得来终觉浅

参考 第九章、防火墙与 NAT 服务器

不同Linux内核,有不同的报文过滤软件

iptables用来设置报文的过滤规则和匹配动作,这些规则和动作都是通过iptables这个工具设置到netfilter上,当有报文进出时,netfilter会根据定义的规则从上到下的逐一匹配,当某个报文匹配到一条规则后,执行该条规则的相关动作,如果没有匹配到任何一条规则,执行默认的动作。

上面的描述中,有一点是很重要的,就是规则定义的顺序,这个需要在实际情况具体考虑。

iptables 中的表(table)与链(chain)

iptables预设了3张表(由tables可以看出有多张表),每张表中有不同的链chain,我们的规则和动作就存放在chain中。也可以自定义iptables的表,iptables预定的表包括:

iptables的工作流程如下:

iptables的请求响应工作流程:报文进入 --> nat(PREROUTING) --> 路由判断 --> filter(INPUT) --> Linux程序 --> 路由判断 --> nat(OUTPUT) --> filter(OUTPUT) --> nat(POSTROUTING) --> 报文传出

iptables的转发流程:报文进入 --> nat(PREROUTING) --> 路由判断 --> filter(FORWARD) --> nat(POSTROUTING) --> 报文传出

由上面可以看出,如果当我们不做NAT时,该流程还可以进一步简化为至filter表相关的链。

iptables 语法

查看防火墙规则命令

命令iptables [-t tables] -L [chain] -n -v用来查看防火墙规则

举例查看filter表的INPUT链的规则,因为默认是filter表,这里就省略了-t filter的选项。

iptables -L INPUT -nv

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 208M   67G ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
38372 2678K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
1854K  113M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
38253 2193K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
 342K   19M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
 1236 58500 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
 2153  135K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:1521

...

492K   99M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

结果的第一行Chain INPUT (policy ACCEPT 0 packets, 0 bytes)指出当前的链表是INPUT,而括号中的policy ACCEPT表示的是INPUT链的默认规则是放行,不过最后一条规则表示拒绝所有的输入请求,也就是如果前面的规则都没有匹配到的话,那就是要拒绝这个报文。

表头说明

command命令

命令都是以大写开头

选项

选项一般都是小写

iptables命令实例

清除本机防火墙 (filter) 的所有规则,-F删除filter表下所有chain的规则,-X删除自定义的chain,-Z把chain的统计数(pkts,bytes)置零

# 先确保INPUT的默认策略为ACCEPT后在清空规则,防止在设置规则时不能远程登录的情况。
iptables -P INPUT ACCEPT

iptables -F
iptables -X
iptables -Z

设置链的默认策略都为ACCEPT。INPUT链在最后加上拒绝所有输入的规则,

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

设置规则:已建立或相关联的报文都通过,只要是不合法报文就丢弃。实际上就是文章开头的查看iptables规则的第一条规则。允许icmp协议通过。

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

设置应用的规则,这里以sshd和http服务为例,应为第一条规则已经设定了RELATED,ESTABLISHED的都能通过,这里只需要检查状态NEW就行了。

iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

设置拒绝不满足条件的规则,这里有两种方式,一种是设置默认策略为DROP,第二种是设置最后一条规则为拒绝所有。我比较推荐使用设置默认策略为DROP,这样在后面添加规则时,可以直接用-A选项加在最后,如果使用第二种方式的话,不方面用-A选项,因为-A是加载所有规则的最后,第二种方法会拦截后面新加的规则。

iptables -P INPUT DROP
# 或者设置最后一条规则为拒绝所有
# iptables -A INPUT -j REJECT

查看和保存

iptables -L INPUT -nv --line-number

#将规则保存到配置文件/etc/sysconfig/iptables中,下次开机后该规则仍然有效
service iptables save

#iptables-save 是查看当前的规则,并没有保存到/etc/sysconfig/iptables中
iptabes-save
上一篇 下一篇

猜你喜欢

热点阅读