最终目标(ASCII 图)
WAN->Router->Server->GRE Tunnel->VM network->VM #1, etc.
我应该先解释一些事情。
我有一台运行 Proxmox (Debian 8.7 x64) 的服务器。它与互联网的连接是 eth0(位于 NAT 后面,并带有 GRE 协议转发)
GRE 接口 (gre1) 由主机上运行的自定义守护程序创建和监控,但除此之外不涉及防火墙规则或路由。GRE 隧道中此机器的 IP 为 192.168.168.2,远程端点为 192.168.168.1
我有一个网桥设置 (vmbr0)。以下是相关配置。
auto vmbr0
iface vmbr0 inet static
address 10.2.0.1
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.2.0.0/24' -o gre1 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.2.0.0/24' -o gre1 -j MASQUERADE
在 GRE 隧道的另一端的机器上,我已经将 iptables 正确配置为 NAT,并且可以通过在主机上使用 ping -I gre1 来 ping 192.168.168.1 和外部目的地,但是在 VM 内部,我可以 ping 192.168.168.2 和 .1,但不能 ping 外部目的地。
我怀疑这个问题的解决方案是一些路由表 foo,因为我之前确实通过用 192.168.168.1 替换主机上的默认网关路由并通过 192.168.1.1(我的路由器)手动为 GRE 隧道端点创建路由来使它工作,但是这也强制所有主机流量通过 GRE 隧道,这是我所不想要的,只有 VM 流量。
为了强制所有流量(包括主机流量)通过 GRE 隧道,我这样做了。
ip route add GRE_TUNNEL_ENDPOINT via 192.168.1.1 # to avoid running the GRE tunnel in itself
ip route change default via 192.168.168.1
也许有一些源路由策略是合适的?
谢谢