我有两台虚拟机(在 VirtualBox 中),它们都是 Ubuntu Server 18.10 (cosmic):
- 第一个
Server
有两个网卡:一个在 NAT 中,另一个在 intnet 中 - 第二台机器
Client
只有一个网卡,位于 intnet 中,可以进行通信Server
现在我想创建Server
一个网关,因此我启用了 IP 转发(通过修改sysctl.conf
,重新启动它等等)。
当我检查sudo ufw status
(打开Server
)时,它显示inactive
。好的。但我无法 ping 任何外部 IP 地址,直到我使用以下命令Client
将 iptables 设置为打开Server
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
只要按下 Enter 键,输入的 ping 命令Client
就会起作用。但是为什么 UFW 处于非活动状态呢?
答案1
UFW 不活跃与此无关。
用iptables
通俗的话来说,你必须无论如何,在 NAT 表中设置MASQUERADE
规则以使流量能够转发出站。否则,系统将不知道如何处理数据包。即使您直接使用iptables
来操纵*filter
规则(设置INPUT
、OUTPUT
等访问控制列表等,甚至只是设置ALLOW
这些策略集上的所有流量),情况仍然如此 - NAT 始终在起作用,您必须添加 NAT 规则以使转发的流量伪装成服务器的主 IP 发送到 Internet。
因此,无论是否使用 UFW,您都必须添加规则,以便让系统了解如何转换数据包并通过服务器将其路由到 Internet,以及如何自动处理反向路由。
这个 Github GIST我发现它很好地解释了如何为 UFW 执行此操作:
最后一步是将 NAT 添加到 ufw 的配置中。在 /etc/ufw/before.rules 的过滤规则之前添加以下内容。
# NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Forward traffic through eth0 - Change to match you out-interface -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE # don't delete the 'COMMIT' line or these nat table rules won't # be processed COMMIT
答案2
我也有类似的观察,但在我的例子中,下面发生了
- 我已经禁用了 ufw
- 重新启动 ubuntu 服务器后,PING 测试不会从一个接口遍历到另一个接口
- 如果我启用/禁用 ufw 并重试,它就会起作用
我正在使用 Ubuntu 18.04