二十五、iptables

wangzhaoyang 发布于 2025-08-04 77 次阅读 网络工程中的Linux系统 无~ 2115 字


iptables 配置与管理

iptables 是 Linux 系统中的默认防火墙工具,通过定义规则来控制进出服务器的流量。iptables 可以根据 IP 地址、端口号、协议类型等特征进行流量过滤,广泛用于包过滤和 NAT(网络地址转换)等功能。

1. 查看当前 iptables 配置

查看当前的 iptables 规则:

[root@localhost ~]# iptables -L

查看更详细的规则(包括字节统计信息):

[root@localhost ~]# iptables -L -v

查看规则链(例如 INPUTOUTPUTFORWARD 等):

[root@localhost ~]# iptables -L INPUT

2. iptables 基本结构

iptables 使用 链(Chain) 来管理规则,常见的链有:

  • INPUT:处理所有进入本机的网络流量。
  • OUTPUT:处理所有从本机发出的网络流量。
  • FORWARD:处理所有通过本机转发的流量(用于路由器)。

每个链都有一系列规则,规则是按顺序处理的。规则匹配时,流量会按顺序处理,直到遇到符合条件的规则。

3. 链的默认策略

每个链都有一个默认的处理策略(如 ACCEPT 或 DROP)。可以通过以下命令查看默认策略:

[root@localhost ~]# iptables -L -n

可以设置默认策略(例如,设置 INPUT 链的默认策略为 DROP):

[root@localhost ~]# iptables -P INPUT DROP

4. 常用 iptables 命令

  • 接受流量:允许某种流量通过防火墙。
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

这条规则表示接受所有访问本机 80 端口的流量。

  • 拒绝流量:拒绝某种流量通过防火墙。
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT

这条规则表示拒绝所有访问本机 80 端口的流量。

  • 删除规则:删除某个特定的规则。
[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j ACCEPT
  • 清空所有规则:清除所有规则并恢复默认策略。
[root@localhost ~]# iptables -F
  • 设置日志记录规则:记录某些流量的日志。
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP_ACCESS: "

5. 常用选项

  • -A: 添加规则(Append)。
  • -D: 删除规则(Delete)。
  • -L: 列出规则(List)。
  • -P: 设置默认策略(Policy)。
  • -F: 清空规则(Flush)。
  • -I: 在链的顶部插入规则(Insert)。
  • -j: 指定目标动作(例如:ACCEPT、DROP、REJECT、LOG)。
  • -p: 指定协议(如 TCP、UDP)。
  • --dport--sport: 指定目标端口和源端口。
  • -s: 指定源 IP 地址。
  • -d: 指定目标 IP 地址。

6. 一些常见的配置示例

  • 允许 SSH 访问:允许外部通过 22 端口(SSH)访问服务器。
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • 允许 HTTP 和 HTTPS 流量:允许外部访问 80 和 443 端口(HTTP 和 HTTPS)。
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • 禁止来自某个 IP 的流量:阻止来自某个 IP 地址(例如 192.168.1.100)的流量。
[root@localhost ~]# iptables -A INPUT -s 192.168.1.100 -j DROP
  • 允许本地流量:允许来自本机的流量。
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
  • 限制单个 IP 的连接数:限制某个 IP 在 60 秒内只能进行 10 次连接。
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

7. 保存和恢复规则

iptables 默认的规则在系统重启后会丢失,因此需要保存规则。

  • 保存当前规则
[root@localhost ~]# service iptables save

或者在 CentOS 7 及更高版本使用:

[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
  • 恢复规则
[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables

8. 防火墙配置持久化

在 CentOS 7 及更高版本,firewalld 是默认的防火墙管理工具,如果你希望使用 iptables,可以禁用 firewalld 并启用 iptables 服务:

禁用 firewalld

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

启用 iptables

[root@localhost ~]# systemctl start iptables
[root@localhost ~]# systemctl enable iptables

9. 查看、备份和恢复规则

  • 查看 iptables 规则:
[root@localhost ~]# iptables -S
  • 将当前规则备份到文件:
[root@localhost ~]# iptables-save > /path/to/backup-file
  • 从备份文件恢复规则:
[root@localhost ~]# iptables-restore < /path/to/backup-file

10. 常见问题排查

  • 规则不生效:确保正确保存规则并重启防火墙服务,使用 iptables-saveiptables-restore 来保存和恢复规则。
  • 连接问题:检查是否设置了错误的默认策略或未开放必需的端口。
  • 错误日志:查看 /var/log/messages 中的日志以排查 iptables 配置问题。

SNAT 和 DNAT 配置

1. SNAT(源网络地址转换)

SNAT 用于修改数据包的源地址,通常在路由器上使用,以便使出站流量的源地址为路由器或防火墙的公网 IP 地址。它通常用于让多个内网主机共享一个公网 IP。

配置 SNAT

假设你的内网网络地址为 192.168.1.0/24,并且你希望将所有从内网发出的流量的源地址修改为路由器的公网地址 203.0.113.1,可以使用以下命令:

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
  • -t nat: 指定使用 NAT 表。
  • -A POSTROUTING: 将规则添加到 POSTROUTING 链,这意味着它会在数据包离开本机时生效。
  • -s 192.168.1.0/24: 匹配源 IP 地址为内网的流量。
  • -o eth0: 表示流量通过 eth0 网卡出去(通常是连接到互联网的网卡)。
  • --to-source 203.0.113.1: 将源 IP 地址修改为公网地址 203.0.113.1
示例:动态 SNAT(MASQUERADE)

如果你希望防火墙或路由器自动选择自己的外部 IP 地址,可以使用 MASQUERADE,它是 SNAT 的动态版本,通常用于动态 IP 地址的情况。

[root@localhost ~]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这条规则表示所有从内网发出的流量的源 IP 地址都将被修改为 eth0 网卡的 IP 地址。

2. DNAT(目标网络地址转换)

DNAT 用于修改数据包的目标地址,通常用于端口转发或将外部请求转发到内网的指定主机。常用于将公网 IP 上的请求转发到局域网内的服务器上。

配置 DNAT

假设你有一个内网服务器的 IP 地址 192.168.1.100,你希望将访问公网的 8080 端口的流量转发到内网服务器的 80 端口,可以使用以下命令:

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
  • -t nat: 使用 NAT 表。
  • -A PREROUTING: 将规则添加到 PREROUTING 链,这意味着规则将在数据包进入本机时生效。
  • -p tcp --dport 8080: 匹配所有访问本机 8080 端口的 TCP 流量。
  • --to-destination 192.168.1.100:80: 将目标地址修改为 192.168.1.100,并将目标端口修改为 80。
示例:结合 SNATDNAT 实现端口转发

如果需要在进行 DNAT 的同时修改返回流量的源地址,可以结合使用 SNATMASQUERADE。例如,将外部访问 8080 端口的流量转发到内网服务器的 80 端口,并且保证返回的流量源地址正确:

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
[root@localhost ~]# iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j SNAT --to-source 203.0.113.1
  • PREROUTING 链的规则将流量从 8080 端口转发到内网服务器的 80 端口。
  • POSTROUTING 链的规则确保从内网返回的流量通过 SNAT 被正确地修改源地址。

3. 常见场景

  • 多个内网主机共享一个公网 IP:使用 MASQUERADESNAT 实现。
  • 将外部访问转发到内网主机:使用 DNAT 配合端口转发。
  • 动态 IP 地址的 NAT 配置:使用 MASQUERADE 进行源地址转换。

4. 保存与恢复 NAT 配置

iptables 中的普通规则一样,SNATDNAT 的配置需要持久化。可以通过以下命令保存配置:

[root@localhost ~]# service iptables save

或者在 CentOS 7 及以上版本使用:

[root@localhost ~]# iptables-save > /etc/sysconfig/iptables

恢复配置:

[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables