即使iptables filter表的资料已经烂大街了,但是我还是决定拿他作为我的一篇。至于为什么不用其他的?不会。并且标题的浅析并不是低调,是因为真的不深:)
我想我还是直接说 -m参数吧:
> 1. -m state 检查状态,四中状态值
-
- NEW:新建的连接是这种状态
-
- ESTABLISHED:已经联机成功的联机状态 RELATED: INVALID: 是的,有两个为空,我实在不知道怎么测试他们,如果有想法,可以看一下这一篇: http://blog.51cto.com/waringid/517656 那其实第一个和第二个都很好测试的,我还是直接拿出例子吧: 拿个也被玩烂的例子,自己可以ping通别人,但是别人ping不通你。 因为没有连接,所以只使用ESTABLISHED就好了,那么代码大概是: iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT (当然其实我也不明白为什么没有连接状态,他依然判断的到) 哦~还有一种方法可以实现:你ping的通别人,别人ping不通你: 因为icmp包是有type的,type大概是: 0:ping应答 8:ping请求 所以,实现各个的功能的代码大概是: iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT 关于这个例子有个有趣的东西。 如果有个人在你设置前ping通了你,并且不断开。大概这样: 那即使你设置完:iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT 这句话后,他依然ping的通,在centos下,如果他断开后再ping,就不行了,但是在win10短时间内似乎都可以ping的通
还有一个new状态,当然就是有连接的时候啦,比如,http和ssh。 那就再举个例子。你可以ssh别人但是别人ssh不了你 建议先想一下,比如可能是这样的: iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT -p 指定tcp协议 --dport 指定默认的ssh端口 NEW表示新建的连接,尝试一下连接。你可能等到死也等不到结果了 试一下,抓个包就知道为什么了。 注意看返回包22是源端口啊,所以当然是改成 iptables -A INPUT -p tcp --sport 22 -m state --state NEW -j ACCEPT 你会发现,wc还是不行,于是你尝试改成 iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT wc,可以了,你会想是不是加了NEW之后,才可以的,错了~ 即使只有一个:iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT也可以ssh,不要问我为什么,不知道。。。
难道你没有问题吗,那NEW什么时候用? 有一个很经常用到的协议,http,起码NEW在HTTP协议里,还是有一点存在感的~