即使iptables filter表的资料已经烂大街了,但是我还是决定拿他作为我的一篇。至于为什么不用其他的?不会。并且标题的浅析并不是低调,是因为真的不深:)
我想我还是直接说 -m参数吧:
> 1. -m state 检查状态,四中状态值
- NEW:新建的连接是这种状态
- ESTABLISHED:已经联机成功的联机状态
RELATED:
INVALID:
是的,有两个为空,我实在不知道怎么测试他们,如果有想法,可以看一下这一篇: https://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协议里,还是有一点存在感的~
转载于:https://blog.51cto.com/11154846/2044068