如何使用内部接口作为桥接器执行 NAT

如何使用内部接口作为桥接器执行 NAT

(来自 AskUbuntu 的重复问题)我有以下网络图: 网络图

192.168.0.0/24 网络,有 4 个 Web 服务器(.1、.2、.3、.4)。其中有 2 个 Ubuntu 14.04(VM1 和 VM2)。它们都有 2 个物理接口(eth0 和 eth1)。以及一个 L2TP 以太网隧道,配置如下:

root@vm1:~# modprobe l2tp_eth
root@vm1:~# ip l2tp add tunnel tunnel_id 1000 peer_tunnel_id 2000 encap udp local 10.0.0.1 remote 10.0.1.1 udp_sport 6000 udp_dport 5000
root@vm1:~# ip l2tp add session tunnel_id 1000 session_id 3000 peer_session_id 4000

root@vm2:~# modprobe l2tp_eth
root@vm2:~# ip l2tp add tunnel tunnel_id 2000 peer_tunnel_id 1000 encap udp local 10.0.1.1 remote 10.0.0.1 udp_sport 5000 udp_dport 6000
root@vm2:~# ip l2tp add session tunnel_id 2000 session_id 4000 peer_session_id 3000

在每个虚拟机上,我都在 eth1(连接到 192.168.0.0 网络)和 l2tpeth0 接口(隧道)之间配置了一个桥接器。在/etc/network/interfacesVM2 中:

auto l2tp
iface l2tp inet static
        address 192.168.0.6
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        bridge_ports l2tpeth0 eth1
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

现在,位于 192.168.0.5 的服务器向远程地址 172.0.0.1 发送一个数据包。它的路径用橙色虚线表示(它被桥接器捕获并通过隧道发送)。我的任务是让它遵循蓝色虚线路径 - 在 VM1 上进行 NAT 并通过 eth1 接口。在 VM2 上,我配置了一个简单的 NAT:

iptables -t nat -A POSTROUTING -o eth0 -j LOG
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

但它没有帮助——我没有看到任务中的数据包/var/log/syslog(虽然有一些)。

万一:

root@vm2:~#  cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
root@vm2:~# cat /proc/sys/net/ipv4/ip_forward
1

那么问题是如何对仅发往特定目的地的数据包进行 NAT?例如,从 192.168.0.4 到 192.168.0.1 的流量使用隧道,并且不会被 NAT(这就是我首先使用隧道的原因)

答案1

解决方案非常简单。配置显示正常。但 192.168.0.5 和 .6 VM 没有使用已配置的网关 192.168.0.6,并将 L2 帧发送到 192.168.0.254,因此无法到达 l2tp 接口 IP 堆栈。这些不是标准设备,而是 Cisco WMS。

相关内容