如何通过UFW配置实现端口转发同时阻断内网服务器的互联网访问
如何通过UFW配置实现端口转发同时阻断内网服务器的互联网访问
嘿,我来帮你搞定这个问题!你的核心需求是保留外网通过网关转发端口访问内网服务器的功能,同时彻底阻止内网服务器主动访问互联网,但网关本身要能正常上网对吧?咱们一步步来调整UFW规则,解决这个问题:
第一步:确保网关开启IP转发(必做)
端口转发依赖内核的IP转发功能,先确认它已经开启:
- 编辑sysctl配置文件:
sudo nano /etc/sysctl.conf
- 找到
net.ipv4.ip_forward这一行,把它改成:
net.ipv4.ip_forward=1
- 让配置立即生效:
sudo sysctl -p
另外,还要确保UFW允许转发,编辑/etc/ufw/sysctl.conf,确认下面这行是开启的:
net.ipv4.conf.all.forwarding=1
第二步:重置UFW规则(清除旧规则干扰)
如果之前的规则混乱,先重置到默认状态:
sudo ufw reset
第三步:设置基础默认规则
咱们给网关自身留足外网访问权限,同时默认拒绝外部主动连接:
sudo ufw default deny incoming sudo ufw default allow outgoing
第四步:允许外网访问转发端口和网关SSH
保留你需要的端口转发和网关自身的SSH访问:
# 允许外网访问内网服务器的转发SSH端口(10000-10010) sudo ufw allow in 10000:10010/tcp # 允许外网访问内网服务器的转发服务端口(10100-10110) sudo ufw allow in 10100:10110/tcp # 允许外网SSH登录网关本身 sudo ufw allow in 22/tcp
第五步:限制内网服务器的互联网访问
这是关键步骤——咱们允许内网服务器和网关、内网其他机器通信,但彻底阻断它们访问外网:
- 先允许内网网段内的所有双向通信(网关和内网服务器、内网服务器之间都能正常通信):
sudo ufw allow in from 192.168.0.0/24 to 192.168.0.0/24 sudo ufw allow out from 192.168.0.0/24 to 192.168.0.0/24
- 拒绝内网服务器(192.168.0.100-110)访问非内网的地址(也就是外网):
# 用网段批量限制192.168.0.100-110,这个网段刚好覆盖目标范围 sudo ufw deny out from 192.168.0.100/28 to any not in 192.168.0.0/24
如果你想更精准(比如只限制100到110,不包含其他机器),也可以逐个添加规则:
sudo ufw deny out from 192.168.0.100 to any not in 192.168.0.0/24 sudo ufw deny out from 192.168.0.101 to any not in 192.168.0.0/24 # ... 一直到192.168.0.110
第六步:确保端口转发的NAT规则正常
你之前应该已经配置了DNAT规则来实现端口转发,比如在/etc/ufw/before.rules文件里添加了类似下面的内容(如果还没加,现在补上):
*nat :PREROUTING ACCEPT [0:0] # 示例:转发网关10022端口到x1的22端口 -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.0.100:22 # 其他内网服务器的转发规则同理,比如x2的22对应10023,以此类推 # ... COMMIT
添加后记得重启UFW生效。
第七步:启用并验证规则
最后重新加载UFW并启用:
sudo ufw reload sudo ufw enable
现在来测试你的场景:
- ✅ 外网用
ssh -p 10000 <网关公网IP>应该能正常登录x1 - ✅ 登录网关后,
ssh x1能正常访问内网服务器 - ✅ 网关自身
ssh <公网IP>可以正常访问互联网 - ❌ 在内网服务器x1上执行
ssh <公网IP>会被阻断,无法连接
为什么之前的规则失效?
你之前的默认outgoing是deny,但只允许了内网和网关的双向通信,却没明确拒绝内网访问外网的流量。另外,网关自身的外网访问也被默认规则限制了,导致要么网关和内网断连,要么规则没覆盖到内网向外的流量,所以出现了那些问题。
备注:内容来源于stack exchange,提问作者est13




