iptables是Linux中的防火墙,在Linux中可以过滤数据包。下面简单的介绍下iptables的应用。
①iptables在Linux中有五个钩子函数(hook function)
PREROUTING:数据包进入了主机,但是还没有被路由的阶段。
INPUT:数据包进入到主机内部。
FORWARD:数据包将由从本主机转发出去。
POSTROUTING:数据包马上由本级发送出去。
OUTPUT:数据包从本主机发送出去。
②iptables在Linux中的四个链
fileter:可以应用在 INPUT FORWARDOUTPUT上面
nat:可以应用在PREROUTINGPOSTROUTING OUTPUT上面
mangle:可以应用在PREROUTINGPOSTROUTING OUTPUT INPUT FORWARD。
raw:可以应用在PREROUTINGOUTPUT上面。
③iptables通用匹配
-s:指定过滤数据包的源地址。
-d:指定过滤数据包的目标地址。
-p:指定过滤的协议类型。
-i:指定过滤的数据包进入的网卡接口。
-o:指定过滤的数据包流出的网卡接口。
-j:对指定的数据包的动作
I:ACCEPT---------接受指定的数据包。
II:DROP----------丢弃指定的数据包。
III:REJECT-------丢弃指定的数据包。
eg:对192.168.5.1访问192.168.5.10的http数据包进行丢弃的操作
iptables –A INPUT –s 192.168.5.1 –d192.168.5.10 –p tcp --dport 80 –j DROP
eg:对192.168.5.1访问192.168.5.10的http数据包进行接受的动作
iptables –A INPUT –s 192.168.5.1 –d192.168.5.10 –p tcp –doprt 80 –j ACCEPT
iptables –A OUTPUT –s 192.168.5.10 –d192.168.5.1 –p tcp –sport 80 –j ACCEPT
在对接受的数据包进行处理的时候,需要注意的是数据包一来一回的双向处理。
对自定义的iptables规则就行保存
service iptables save
iptables –L –nv --line-numbers //查看自定义的防火墙规则。
④管理规则
-A:添加一条规则,添加的位置在规则的末尾。
-I:添加一条规则,如果省略添加的位置,默认的添加的位置在规则的最上方。
-D:删除一条规则。
-R:对某条指定的规则进行修改。
对链进行管理:
-F:清空一条链上面的所有的规则。
-P:更改制定链的默认规则。
-N:自定义一条新的空链。
-X:删除一个自定义的空链。
⑤扩展选项使用
eg:对于http的服务请求,192.168.5.1服务器段进行连接状态的控制
iptables –A INPUT -d 192.168.5.1 –p tcp –dport 80 –m state–state NEW,ESTABLISHED –j ACCEPT
iptables –A OUTPUT –s 192.168.5.1 –p tcp–sport 80 –m state –state ESTABLISHED –j ACCEPT
//服务器对于INPUT服务器的NEW和ESTABLISHED状态的报文给予响应,对于OUTPUTon服务器的报文只响应ESTABLISHED类型的报文。
eg:多端口的相应
iptables –A INPUT –d 192.168.5.1 –p tcp –m–multiport –destination-ports 21,22,80 –m state –state NEW,ESTABLISHED –jACCEPT
//在INPUT链上给予21,22,80端口并且是NEW或者是ESTABLISHED的报文放行处理。
eg:编写规则,一个IP地址的ssh连接最多可以有三个。当超过三个的时候过5分钟之后在进行连接处理。
iptables –A INPUT –d 192.168.5.1 –p tcp–dport 22 –m connlimit –connlimit-above 3 –j DROP
iptables –A INPUT –d 192.168.5.1 –p tcp–dport 22 –m state –state NEW –m recent –set –name SSH //记录访问ssh的新的连接,记录来源IP地址。
iptables –A INPUT –d 192.168.5.1 –p tcp–dport 22 –m state –state NEW –m recent –update –seconds 300 –hitcount 3 –nameSSH –j DROP //当超过三次之后,300秒内不许连接—seconds和—hitcount 必须和—update一起使用。
eg:在请求http的过程中,如果请求的页面还有H7N9则不允许显示
iptables –A OUTPUT –d 192.168.5.1 –p tcp–dport 80 –m string –algo kmp –string “H7N9” –j DROP
//注意方向是OUTPUT方向。
⑥nat:
DNAT:目标地址转换
SNAT:源地址转换
eg:访问外网时,将192.168.5.0/24地址转化为172.16.10.1
iptables –A POSTROUTING –s 192.168.5.0/24 –jSNAT –to-source 172.16.10.1
iptables –A POSTROUTING –s 192.168.5.0/24 –jSNAT MASQUERADE //如果需要转化的地址是一个动态变化的地址,那么可以使用MASQUERADE来进行自动的转换。
eg:当访问外放的服务器172.16.10.1的时候转换到内网的192.168.5.1进行访问
iptables –A PREROUTING –d 172.16.10.1 –p tcp–dport 80 –j DNAT –to-destination 192.168.5.1
同样可以进行端口映射
iptables –A PREROUTING –d 172.16.10.1 –p tcp–dport 80 –j DNAT –to-destination 192.168.5.1:8080
⑦在打开了iptables的过程中。利用lsmod|grepip 可以查看加载了那些模块。在Linux6.4系统中,在/proc/sys/net/nf_conntrack_max可以查看iptables允许的最大的连接数量。如果一个服务器非常繁忙的话,当连接数量超过了配置文件的数量的时候,那么就会有大量的请求被丢弃。在/proc/net/nf_conntrack中记录了当前连接的状态信息。这些状态信息也可以利用iptstate来查看。