VM Public 有 2 块网卡 ens32 与 ens33,分别接着内网与外网,ens33 配置的 IP 地址是 192.168.254.216/24
VM Private 只有 1 块网卡 ens32 只与内网连接,ens32 配置的 IP 地址是 192.168.254.218/24
我们的目标是想通过在 VM Public 上启用 Proxy Arp 使 VM Private 可以直接与 ens33 那头的 192.168.254.254 直接通信,达到类似 VM Public 内的 ens32 与 ens33 桥接的效果
虚拟机启动之后,我们在 VM Public 直接 ping VM Private 的地址,由于 VM Public ens33 与 VM Private ens32 并不在同一个广播域内,所以是不通的:
# ping 192.168.254.218 PING 192.168.254.218 (192.168.254.218) 56(84) bytes of data. From 192.168.254.216 icmp_seq=1 Destination Host Unreachable From 192.168.254.216 icmp_seq=2 Destination Host Unreachable
此时我们在 VM Public 上为 192.168.254.218 这个地址加一条路由,指定这个地址是在 ens32 那侧的网络内,然后再看看 ping 的效果
# ip route add 192.168.254.218 dev ens32
# ping 192.168.254.218 PING 192.168.254.218 (192.168.254.218) 56(84) bytes of data. 64 bytes from 192.168.254.218: icmp_seq=1 ttl=64 time=0.689 ms 64 bytes from 192.168.254.218: icmp_seq=2 ttl=64 time=0.505 ms
也就是说,加完这条路由之后,VM Public 已经可以与 VM Private 之间互通了,但是现在在 VM Public 外的机器 Gateway 想访问 Private 还是无法访问到的
# ping 192.168.254.218 PING 192.168.254.218 (192.168.254.218) 56(84) bytes of data. From 192.168.254.216 icmp_seq=1 Destination Host Unreachable From 192.168.254.216 icmp_seq=2 Destination Host Unreachable
此时我们就需要打开 VM Public 机器上的 ip forward 与 proxy arp
echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/conf/ens32/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/ens33/proxy_arp
然后,在 Gateway 上直接 ping 192.168.254.218 就直通了!
# ping 192.168.254.218 PING 192.168.254.218 (192.168.254.218) 56(84) bytes of data. 64 bytes from 192.168.254.218: icmp_seq=1 ttl=64 time=0.689 ms 64 bytes from 192.168.254.218: icmp_seq=2 ttl=64 time=0.505 ms
如果想把这些配置持久化,就需要把这些配置保存到配置文件中
systemctl disable NetworkManager
/etc/sysconfig/network-scripts/route-ens32 192.168.254.218 dev ens32
/etc/sysctl.conf net.ipv4.ip_forward = 1 net.ipv4.conf.default.proxy_arp = 1