如何用内部接口作为网桥来执行NAT

(从AskUbuntu dublicate问题)我有一个下面的networking图: networking图

192.168.0.0/24networking与4个networking服务器(.1,.2,.3,.4)。 其中有2个Ubuntu 14.04(VM1和VM2)。 它们有两个物理接口(eth0和eth1)。 和一个L2TP以太网隧道,configuration方式如下:

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 

在每个虚拟机上,我都有一个configuration在eth1(连接到192.168.0.0 net)和l2tpeth0接口(隧道)之间的brigde。 在VM2的/etc/network/interfaces中:

 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。 它的path用橙色的虚线显示(它被brigde捕获并通过隧道发送)。 我的任务是使它遵循蓝色虚线path – 在VM1上获得NAT并通过eth1接口。 在VM2我有一个简单的NATconfiguration:

 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.1stream量使用隧道,并没有得到NAT(这就是为什么我有一个隧道的第一位)

解决scheme非常简单。 configuration显示是好的。 但192.168.0.5和.6虚拟机没有使用configuration的网关192.168.0.6,并发送L2帧到192.168.0.254因此没有到达l2tp接口IP堆栈。 这些不是标准的设备,而是思科的WMS。