iptables使用总结

需求:开放linux服务器特定端口访问,同时允许服务器对外访问其它资源

iptables在零配置情况下,服务器端口是开放访问的(在sysctl的ip_range之内)。也就是说在服务器上的某个端口上有服务程序对外监听,则外网可直接访问该服务,同样的服务器上的程序对外网的访问也是没有阻挡的。但现在的网络环境错综复杂,全裸奔跑总是不合适的,所以iptables防火墙还是要跑一跑的。

解决方案:

首先开放指定端口,则其余端口是应该禁止访问的。当然如果是远程服务器,第一步应该做的应该是开放22端口的tcp访问

iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

命令其实很好理解(理解了也就好记了)在INPUT链上的第一位置插入一条规则(这里用-I而不是-A主要是想:不管INPUT链是空还是已有规则都让该规则放在首位)也就是tcp协议(-p就是protocl协议的意思)目标地址22的数据包都接受,有了这个我们就基本能保证ssh不会被干掉了。接下来就是开放我们需要的其他端口

iptables -A INPUT -p tcp --dport port -j ACCEPT

这里直接用-A往input链后面挂载就好了(只要前面没有drop all 或者 reject all这一类的规则就好,iptables的所有链的规则都是位置敏感的,数据包会一个个通过规则直到满足规则条件被执行)。开放了我们需要的端口但其他的端口还是没有被阻隔!所以还要加一条

iptables -A INPUT -j REJECT

执行REDECT或者DROP都是可以的,不同的是对访问者而言前者可以得到拒绝连接而后者只能等待超时。目前为止基本满足了开放指定端口阻隔其他端口的访问了,但是也带来了一个问题

curl https://www.baidu.com

没有回应了,what the fuck!!! 原因在于INPUT链都被REJECT了,虽然OUPUT都是ACCEPT但是数据包可以出去却回不来。这个需要怎么解决!其实通过iptables的手册我们可以找到除了对协议进行匹配外,还可以对连接状态进行匹配的参数- -state

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT   

我们只要允许已建立的或相关连的通行(需要放在iptables -A INPUT -j REJECT前),服务器就可以正常访问外部资源了。这里有一个问题,熟悉tcp连接的都知道,ESTABLISHED状态是在3次握手成功后

动图来自这里
握手阶段的数据包为什么没有被墙,按说iptables是在IP层就能动作的,这也是我不太了解的地方,还望知道的大神不吝赐教!
直接用iptables 命令添加的规则是关机丢失的,如果想要保存就得使用命令

iptables-save > filename

保存至文件,下次开机只需要

iptables-restore filename

也就可以了

续:

通过自己对iptables的state状态机制的Google搜索,最终大概理解了之前的问题。iptables 中的state状态只有四个(tracked模式下的数据包,其实这四个状态是用户状态并非内核状态。内核状态会有很多而tcp的三次握手中的状态是内核状态)NEW,ESTABLISHED,RELATED,INVALID这其中:

NEW
NEW状态告诉我们数据包是我们看到的第一个数据包。 这意味着conntrack模块在特定连接中看到的第一个数据包将被匹配。 例如,如果我们看到一个SYN数据包,它是我们看到的连接中的第一个数据包,它将匹配NEW
ESTABLISHED
ESTABLISHED状态已经看到两个方向的流量,然后将持续匹配这些数据包。进入ESTABLISHED状态的唯一要求是一个主机发送一个数据包,稍后它会从另一个主机获得一个回复。 NEW状态将在收到回复数据包后通过防火墙更改为ESTABLISHED状态
RELATED
当一个连接与另一个已经建立的ESTABLISHED连接相关时,它被认为是RELATED。 这意味着,对于要被视为RELATED的连接,我们必须首先建立一个被认为是ESTABLISHED的连接。 然后,ESTABLISHED连接将在主连接之外生成连接。 如果conntrack模块能够理解它是相关的,则新生成的连接将被视为RELATED
INVALID
INVALID状态意味着无法识别数据包或者没有任何状态。 这可能是由于多种原因造成的,例如系统内存不足或ICMP错误消息不响应任何已知连接

所以此ESTABLISHED可能并非彼ESTABLISHED,只要主机发出请求回复到达防火墙即被视为ESTABLISHED。可能理解的还不是非常透彻,估计还是要啃源码呢。有一个iptables的教程讲的还是很详细的,不过是英文的。

你可能感兴趣的:(linux,iptables,linux)