Debian修改ufw的iptables规则

目的允许Podman容器流量转发

1、修改 UFW 的默认转发策略

编辑 UFW 配置文件

vim /etc/default/ufw

找到 DEFAULT_FORWARD_POLICY 这一行

将默认转发策略其值从 DROPDENY 修改为 ACCEPT

# 修改前
# DEFAULT_FORWARD_POLICY="DROP"

# 修改后
DEFAULT_FORWARD_POLICY="ACCEPT"

2、在 UFW 的 before.rules 中添加特定规则

查看podman网络配置

#列出podman网络
podman network ls
#查询网络名称配置
podman network inspect xxx

在输出中找到 subnets 字段,你会看到一个类似 "10.88.0.0/16" 的网段。记下这个网段。

编辑 UFW 的 before.rules 文件

vim /etc/ufw/before.rules

在文件顶部(在 \*filter 之后)添加以下规则

#
# rules.before
#
# Rules that should be run before the ufw command line added rules.
# See the ufw-framework(8) manual page.

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]

# 在这里添加你的规则,允许转发到 Podman 网络
# 请将 10.88.0.0/16 替换为你上一步查到的实际网段
-A ufw-before-forward -d 10.88.0.0/16 -j ACCEPT

# Don't delete these required lines, otherwise there will be errors
... (文件剩余部分,不要动) ...

重新加载 UFW

ufw reload
ufw disable && ufw enable

需要指定IP才能访问,下面修改规则

-A ufw-before-forward -d 10.88.0.0/16 -j ACCEPT
#修改成
-A ufw-before-forward -s 192.168.5.4 -d 10.88.0.0/16 -j ACCEPT

基础命令格式

iptables 命令的通用格式:

iptables [-t 表名] <操作选项> <链名> [匹配条件] [-j 动作]

1. 操作选项(核心)

选项作用
-A追加规则到链的末尾
-I插入规则到指定位置(默认插在开头)
-D删除链中的规则
-F清空指定链 / 表的所有规则(谨慎用)
-L列出链中的所有规则(查看规则)
-P设置链的默认策略(如默认拒绝所有)
-N创建自定义链
-X删除自定义链
-Z清空规则的计数器(包数 / 字节数)

2. 常用匹配条件

条件说明
-p tcp/udp/icmp/all指定协议(all 匹配所有)
-s 192.168.1.1/24指定源 IP / 网段
-d 10.0.0.1/24指定目的 IP / 网段
--dport 80目的端口(仅 TCP/UDP)
--sport 22源端口(仅 TCP/UDP)
-i eth0入站网卡(如 eth0)
-o eth0出站网卡(如 eth0)

3. 常用动作(Target)

动作说明
ACCEPT允许数据包通过
DROP丢弃数据包(无任何提示)
REJECT拒绝数据包,返回错误提示(如 --reject-with icmp-port-unreachable
SNAT源地址转换(如内网访问外网)
DNAT目的地址转换(如外网访问内网服务)
MASQUERADE动态 SNAT(适用于 IP 不固定的场景,如拨号上网)
LOG记录日志到 /var/log/messages,需配合 --log-prefix "iptables: "

实战常用命令示例

1.基础查看与清空

# 查看filter表(默认)所有链的规则(带端口/IP解析,显示计数器)
iptables -L -n -v
# 查看nat表的规则
iptables -t nat -L -n -v
# 清空filter表所有链的规则(仅清空,不修改默认策略)
iptables -F
# 清空nat表所有链的规则
iptables -t nat -F
# 重置计数器(包数/字节数)
iptables -Z

2. 配置过滤规则(filter 表)

# 1. 设置默认策略(谨慎!先确保自己能SSH登录,否则会被锁)
# 默认拒绝所有入站、转发,允许所有出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 2. 允许回环网卡(lo)(必须加,否则本机内服务通信会出问题)
iptables -A INPUT -i lo -j ACCEPT

# 3. 允许已建立的连接(如SSH登录后,响应包能回来)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 4. 允许SSH端口(22)访问(替换为你的SSH端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 5. 允许HTTP(80)和HTTPS(443)访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 6. 允许指定IP(192.168.1.100)访问22端口,拒绝其他IP
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

# 7. 拒绝ICMP ping(禁ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

3. 配置 NAT 规则(nat 表)

# 1. SNAT:让内网192.168.1.0/24通过外网网卡eth0访问互联网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 公网IP

# 2. 动态SNAT(适用于拨号上网,IP不固定)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 3. DNAT:将外网8080端口转发到内网192.168.1.20的80端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.20:80
# 同时要在filter表允许转发(如果默认FORWARD是DROP)
iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 80 -j ACCEPT

4. 删除规则

# 方法1:按规则内容删除
iptables -D INPUT -p tcp --dport 22 -j ACCEPT

# 方法2:按规则编号删除(先查编号,再删)
iptables -L INPUT --line-numbers  # 查看INPUT链规则编号
iptables -D INPUT 3  # 删除INPUT链第3条规则

四规则保存与重启生效

iptables 规则默认是临时的,重启系统后会丢失,需要保存:

# CentOS 6/7
service iptables save  # 保存规则到/etc/sysconfig/iptables
# 或手动保存
iptables-save > /etc/sysconfig/iptables

# 恢复规则
iptables-restore < /etc/sysconfig/iptables

# Ubuntu/Debian
apt install iptables-persistent  # 安装持久化工具
iptables-save > /etc/iptables/rules.v4  # 保存IPv4规则
ip6tables-save > /etc/iptables/rules.v6  # 保存IPv6规则
# 重启生效
systemctl restart netfilter-persistent

总结

  1. iptables 核心是「表 - 链 - 规则」模型,filter 表负责过滤(最常用),nat 表负责地址转换。
  2. 规则的核心逻辑是「匹配条件 + 动作」,配置时建议先设默认策略,再放行必要端口 / IP。
  3. 规则默认临时生效,需通过 iptables-save 保存,避免重启后丢失。

关键注意事项

  • 配置 INPUT 链默认 DROP 前,务必先放行 SSH 端口和已建立的连接,否则会远程断开且无法登录。
  • 做端口转发时,除了配置 nat 表的 DNAT,还要确保 filter 表的 FORWARD 链允许对应的数据包。
  • 生产环境建议先在测试机验证规则,再部署到正式环境。