将流量从桥接接口(已分配 IP)路由到不同本地接口上的另一个网络

将流量从桥接接口(已分配 IP)路由到不同本地接口上的另一个网络

我在 Ubuntu 20.04 上,在本地运行连接到主机桥接接口的虚拟机 (KVM)。桥接器(以及连接到它的所有虚拟机)通过 DHCP 从同一网络上的 DSL/路由器获取其 IP。

VM 主机上的桥接接口如下所示:

br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.188.22  netmask 255.255.255.0  broadcast 192.168.188.255
        inet6 fe80::2172:1869:b4cb:ec84  prefixlen 64  scopeid 0x20<link>
        inet6 2a01:c22:8c21:4200:6dd0:e662:4f46:c591  prefixlen 64  scopeid 0x0<global>
        inet6 2a01:c22:8c21:4200:8d92:1ea5:3c93:3668  prefixlen 64  scopeid 0x0<global>
        ether 00:d8:61:9d:ad:c5  txqueuelen 1000  (Ethernet)
        RX packets 1512101  bytes 2026998740 (2.0 GB)
        RX errors 0  dropped 12289  overruns 0  frame 0
        TX packets 849612  bytes 1582945488 (1.5 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我已经在主机上启用了 IP 转发,并将虚拟机配置为使用主机作为网关。

虚拟机内部的路由如下:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.22  0.0.0.0         UG    0      0        0 eth0
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

VM 主机上的路由:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.1   0.0.0.0         UG    425    0        0 br0
10.8.0.1        10.8.0.17       255.255.255.255 UGH   50     0        0 tun0
10.8.0.17       0.0.0.0         255.255.255.255 UH    50     0        0 tun0
172.28.52.0     10.8.0.17       255.255.255.0   UG    50     0        0 tun0
192.168.4.0     10.8.0.17       255.255.255.0   UG    50     0        0 tun0
192.168.5.0     10.8.0.17       255.255.255.0   UG    50     0        0 tun0
192.168.10.0    10.8.0.17       255.255.255.0   UG    50     0        0 tun0
192.168.50.0    10.8.0.17       255.255.255.0   UG    50     0        0 tun0
192.168.100.0   10.8.0.17       255.255.255.0   UG    50     0        0 tun0
192.168.188.0   0.0.0.0         255.255.255.0   U     425    0        0 br0
192.168.188.1   0.0.0.0         255.255.255.255 UH    425    0        0 br0
213.238.34.194  192.168.188.1   255.255.255.255 UGH   425    0        0 br0
213.238.34.212  10.8.0.17       255.255.255.255 UGH   50     0        0 tun0

从虚拟机内部访问 192.168.188.0/24 网络和公共互联网上的 IP 工作正常,但我似乎无法弄清楚如何将流量从虚拟机内部路由到可通过虚拟机主机本身的“tun0”接口访问的任何 IP/网络。

/proc/sys/net/ipv4/ip_forward 设置为“1”,我已手动(使用 iptables -F)清除了所有表/链中的所有防火墙规则以避免任何干扰......我还需要做什么才能从其中一个虚拟机内部执行(例如)“ping 192.168.50.2”?

这是我在尝试从其中一台虚拟机内部访问 192.168.50.212(“tun0”网络上的一台机器)时,在虚拟机主机上运行“tcpdump -i br0 host”捕获的内容:

在此处输入图片描述

如何让连接到本地“br0”接口的虚拟机也能与只能通过本地“tun0”设备访问的网络建立连接?

答案1

忽略这个问题很长一段时间后(我找到了另一种解决方法)我终于强迫自己再次尝试这个问题。

事实证明,修复方法出奇的简单:只需在 tun0 接口上启用伪装就可以了。

#!/bin/bash

iptables -A FORWARD -i br0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

显然,这只有在您已在 VM 主机上启用路由并让 VM 使用 VM 主机的 IP 作为其默认网关时才能正常工作(或者需要在网络的“真实”默认网关上添加静态路由,并为 VPN 隧道另一端的每个子网添加静态路由,让这些路由指向 VM 主机)。

相关内容