在机器上加防火墙策略时,一直都是抄来抄去,没有细细研究,今天在一个新的主机上,手动添加了几条策略发现了两个问题
1 本机的访问居然也拦截了
2 本机无法访问外网了

于是,把以前的防火墙配置策略拿过来看了看,发现少了以下两条
1 iptables -A INPUT -i lo -j ACCEPT
2 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

第一条很好理解,放开对于本机环回端口的访问。惭愧呀,我还以为本机的访问防火墙是不管的。
第二条加上后,就可以连接外网了,为什么就不太清楚了,研究了一下午,结果如下。

首先是几个状态的解释
NEW,ESTABLISHED,RELATED,INVALID。
NEW状态:主机连接目标主机,在目标主机上看到的第一个想要连接的包
ESTABLISHED状态:主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态。
RELATED状态:主机已与目标主机进行通信,目标主机发起新的链接方式,例如ftp
INVALID状态:无效的封包,例如数据破损的封包状态

设置下面的策略,从外网访问主机并在主机抓包看的话,可以看到,只有第一个syn包被防火墙放过,主机发出的syn ack包被外网收到后,外网回应了一个ack包,但这个ack被拦截了。
所以主机不停的重发syn ack,外网不停的重发ack。
iptables -A INPUT -m state --state NEW -j ACCEPT

而添加ESTABLISHED后,只要主机回应了包,就认为进入了ESTABLISHED状态,于是放行。下面的策略等于放开防火墙,允许外网连接。
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

如果不添加下面的策略,从主机访问外网,测试抓包来看,主机发出syn包后,外网回应了一个syn ack,但这个syn ack 被防火墙拦了。所以外网会不停重发syn ack,主机无法与外网建立连接,不能外连。
添加下面策略后,只要外网回应了syn ack,就认为是连接成功了,会采取放行。
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT