iptables

iptables

Posted by alovn on June 25, 2023

工作模式

iptables两种工作模式:一种是用做NAT路由器,另一种是用做主机防火墙。对于数据包而言在两种工作模式下,分别有以下两种主要流向:

  • PREROUTING → FORWARD → POSTROUTING
  • PREROUTING → INPUT → 本机OUTPUT → POSTROUTING

规则表

iptables会根据不同的数据包处理功能使用不同的规则表。它包括如下三个表:filter、nat和mangle。

  • filter是默认的表,包含防火墙过滤规则。内建的规则链包括:INPUT、OUTPUT和FORWARD。
  • nat表包含源地址、目的地址及端口转换使用的规则,内建的规则链包括PERROUTING、OUTPUT和POSTROUTING。
  • mangle表包含用于设置特殊的数据包路由标志的规则。这些标志随后被filter表中的规则检查。内建的规则链包括:PREROUTING、INPUT、FORWARD、POSTR OUTING和OUTPUT。

规则链

规则表对应的相关规则链的功能如下:

  • INPUT链:当一个数据包由内核中的路由计算确定为本机的数据包时,将应用此规则。
  • OUTPUT链:本机向外发送数据包时,将应用此规则。
  • FORWARD链:当收到需要转发给其它地址的数据包时,将应用此规则,需要启用linux内核中的ip_forward功能。
  • PREROUTING链:在对数据包做路由选择之前,用于修改目的地址(DNAT)。
  • POSTROUTING链:在对数据包做路由选择之后,用于修改源地址(SNAT)。

iptables的语法如下:

1
iptables [-t 表名] <-A| I |D |R > 链名[规则编号] [-i | o 网卡名称] [-p 协议类型] [-s源IP地址|源子网][--sport源端口号] [-d目标IP地址 | 目标子网][--dport目标端口号] <-j 动作>​​

默认策略

当数据包不符合链中任意一条规则时,iptables将根据该链预先定义的默认策略来处理数据包。

默认策略的定义格式为:

1
iptables [-t 表名]  <-P> <链名> <动作>​​

参数说明如下:

  • [-t 表名] 指默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
  • <-P> 定义默认策略。
  • ​​​<​链名>​​ 指默认策略将应用于哪个链,可以使用INPUT、OUTPUT、FORWARD、PREROUT ING、OUTPUT和POSTROUTING。
  • <动作>​​ 处理数据包的动作,可以使用ACCEPT(接收数据包)和DROP(丢弃数据包)。

查看规则

查看iptables规则的命令格式如下:

1
iptables [-t 表名] <-L> [链名]
  • -L 可以查看指定表中哪个链的规则列表, 如果不指明哪个链,则将查看某个表中所有链的规则列表。
  • –line-numbers:查看规则列表时,同时显示规则在链中的顺序号。

编辑规则

编辑规则的参数说明:

  • [-t 表名] 定义默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
  • -A 新增一条规则,该规则将会增加到规则列表的最后一行,该参数不能使用规则编号。
  • -I 插入一条规则,原本该位置上的规则将会往后顺序移动,如果没有指定规则编号,则在第一条规则前插入。
  • -D 从规则列表中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
  • -R 替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号。
  • [规则编号] 在插入、删除和替换规则时使用,编号按照规则列表的顺序排列,规则列表中第一条规则的编号为1。
  • [-io 网卡名称]​ i用于指定数据包从哪块网卡进入,o用于指定数据包从哪块网卡输出。如eth0.
  • -p 可以指定规则应用的协议,包含TCP、UDP和ICMP等。
  • -s后面接源主机的IP地址或子网地址。
  • –sport后面接数据包的IP源端口号。
  • -d后面接目标主机的IP地址或子网地址。
  • –dport后面接数据包的IP目标端口号。
  • <-j 动作>

下面是处理数据包的动作及说明:

  • ACCEPT:允许接收数据包。
  • DROP:丢弃数据包。
  • REDIRECT:将数据包重新转向到本机或另一台主机的某一个端口,通常实现透明代理或对外开放内网的某些服务。
  • REJECT:拦截该数据封包,并发回封包通知对方。
  • SNAT:源地址转换,即改变数据包的源地址。例如:将局域网的IP(10.0.0.1/24)转化为广域网的IP(203.93.236.111/24),在NAT表的POSTROUTING链上进行该动作。
  • DNAT:目标地址转换,即改变数据包的目的地址。例如:将广域网的IP(203.93.236.111/24)转化为局域网的IP(10.0.0.1/24),在NAT表的PREROUTING链上进行该动作。
  • MASQUERADE:IP伪装,即常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP由ISP分配动态,如果主机的IP地址是静态固定的,就要使用SNAT。
  • LOG:日志功能,将符合规则的数据包相关信息记录在日志中,以分析和排错。

清除规则

在新建规则时,往往需要清除原有的旧规则,以免它们影响新设定的规则。如果规则较多,逐条删除就会十分麻烦,此时可以使用iptables提供的清除规则参数达到快速删除所有规则的目的。

格式为:

1
iptables   [-t表名]  <-F | Z>​​
  • [-t 表名] filter、nat或mangle,若未指定则默认使用filter表。
  • -F 删除指定表中的所有规则
  • -Z 将指定表中的数据包计数器和流量计数器归零

状态

iptables被称为有状态机制的防火墙,可以按包状态匹配。iptables共有四种状态:

  • NEW:如果你的主机向远程机器发出一个连接请求,这个数据包的状态是NEW。
  • ESTABLISHED:在连接建立之后(完成TCP的三次握手后),远程主机和你的主机通信数据的状态为ESTABLISHED。
  • RELATED:和现有联机相关的新联机封包。像FTP这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有的21端口上建立好连接后发送命令,用20或其他端口传送的数据(FTP-DATA),其状态是RELATED。
  • INVALID:无效的数据包,不能被识别属于哪个连接或没有任何状态,通常这种状态的数据包会被丢弃。

如果有一台主机不提供任何服务,那么,可以禁止其他的机器向你的机器发送任何连接请求,命令如下:

1
​iptables -A INPUT -m state --state NEW -j DROP​​

该规则是将所有发送到这台机器上的数据包(状态是NEW的包)丢弃,也就是不允许其他的机器主动发起对你的机器的连接,但是你却可以主动连接其他的机器,不过仅仅是连接而已,连接之后的数据是ESTABLISHED状态的。这时,再加上下面这一条语句就可以允许所有已经建立连接,或者与之相关的数据通过:

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