如何使用 iptables 和 iproute2 在 Ubuntu 主机中模拟 NAT 网络?

如何使用 iptables 和 iproute2 在 Ubuntu 主机中模拟 NAT 网络?

我想模拟虚拟机的 NAT 网络模式,而不使用任何特定于 vm 的工具。详细目标如下:

  • 虚拟机具有内部网络 IP10.8.20.0/24
  • 物理网卡eno1有 IP192.168.1.233
  • VM 可以访问互联网
  • 网络可以通过端口绑定访问虚拟机(即192.168.1.233:9080 -> 10.8.20.3:80

为了更简单,我们可以使用 veth peers 来模拟 VM 的 TAP,而不是实际设置 VM。

所以我设置的网络是:

# Create internal bridge my-bridge
ip link add my-bridge type bridge
ip link set dev my-bridge up

# Create a veth peer, my-guestb connected to my-bridge, vpx-guesta has IP 10.8.20.3
ip link add my-guesta type veth peer name my-guestb
ip link set my-guestb master my-bridge
ip addr add 10.8.20.3/24 dev my-guesta
ip link set dev my-guesta up
ip link set dev my-guestb up

从现在起,很明显我们无法从 ping 通互联网vpx-guesta

我读了很多关于如何在 Ubuntu 中创建 NAT 的博客,但都不起作用。我做了以下事情:

iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -o eno1 MASQUERADE
iptables -A FORWARD -i eno1 -o my-guesta -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i my-guesta -o eno1 -j ACCEPT

通过这样做,我想从 ping 互联网my-guesta,但没有成功。

我应该链接eno1my-bridge吗?如果是,我该如何管理 IP 和路由表?如果不是,我该怎么办?

  • 主机:ubuntu 22.04
  • ip_forward 为 1
  • accept_local 为my-guesta1

相关内容