Debian修改ufw的iptables规则
目的允许Podman容器流量转发
1、修改 UFW 的默认转发策略
编辑 UFW 配置文件
vim /etc/default/ufw
找到 DEFAULT_FORWARD_POLICY 这一行
将默认转发策略其值从 DROP 或 DENY 修改为 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
总结
iptables核心是「表 - 链 - 规则」模型,filter表负责过滤(最常用),nat表负责地址转换。- 规则的核心逻辑是「匹配条件 + 动作」,配置时建议先设默认策略,再放行必要端口 / IP。
- 规则默认临时生效,需通过
iptables-save保存,避免重启后丢失。
关键注意事项
- 配置
INPUT链默认DROP前,务必先放行 SSH 端口和已建立的连接,否则会远程断开且无法登录。 - 做端口转发时,除了配置
nat表的DNAT,还要确保filter表的FORWARD链允许对应的数据包。 - 生产环境建议先在测试机验证规则,再部署到正式环境。