![在 7 个子网之间进行路由,其中 2 个子网具有动态分配的 IP](https://linux22.com/image/1612334/%E5%9C%A8%207%20%E4%B8%AA%E5%AD%90%E7%BD%91%E4%B9%8B%E9%97%B4%E8%BF%9B%E8%A1%8C%E8%B7%AF%E7%94%B1%EF%BC%8C%E5%85%B6%E4%B8%AD%E2%80%8B%E2%80%8B%202%20%E4%B8%AA%E5%AD%90%E7%BD%91%E5%85%B7%E6%9C%89%E5%8A%A8%E6%80%81%E5%88%86%E9%85%8D%E7%9A%84%20IP.png)
我在极其复杂的路由方案中使用 RaspberryPi(Raspbian OS),我可以管理它直到子网数量达到五个:)
目前我有以下接口,如ifconfig所示:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.251 netmask 255.255.255.0 broadcast 192.168.1.255
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.44.1 netmask 255.255.255.0 broadcast 192.168.44.255
ether b8:27:eb:b9:ca:47 txqueuelen 1000 (Ethernet)
eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.45.1 netmask 255.255.255.0 broadcast 192.168.45.255
ether b8:27:eb:b9:ca:47 txqueuelen 1000 (Ethernet)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.35.0.74 netmask 255.255.255.255 destination 10.35.0.73
tun1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.35.0.18 netmask 255.255.255.255 destination 10.35.0.17
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.42.1 netmask 255.255.255.0 broadcast 192.168.42.255
wlan1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.46.1 netmask 255.255.255.0 broadcast 192.168.46.255
eth0提供与外界的互联网访问(固定IP)
tun0和tun1是与不同 VPN 服务器的 VPN 接口,它们从各自的服务器动态分配 IP(这似乎是核心问题)
wlan0和WLAN1是 wifi 网络(作为接入点!)应该路由全部他们的流量通过tun0和tun1, 分别
eth0:1和eth0:2是与以下设备共享硬件的接口:eth0(RaspberryPi 上只有一个以太网端口),并且应提供与wlan0和WLAN1,而是连接到有线客户端。
DHCP 服务器在 RaspberryPi 上运行,以确保wlan0和WLAN1向无线客户端分配各自类别的地址。当然,共享线路上不提供 DHCP —— 我配置了每个客户设备通过 192.168.44.1 或 192.168.45.1 路由其流量,具体取决于我希望它们连接到哪个 VPN(或不连接到 VPN)。
如果还不是很清楚,以下是我必须处理的所有网络:
eth0,192.168.1.1/24(上行互联网)
eth0:1, 192.168.44.1/24(通过 tun0 的下行有线客户端)
eth0:2, 192.168.45.1/24(通过 tun1 的下游有线客户端)
tun0,10.35.0.74/32(第一个上行 VPN)
tun1,10.35.0.18/32(第二个上游 VPN)
wlan0,192.168.42.1/24(通过tun0的下行无线客户端)
wlan0,192.168.46.1/24(通过tun1的下行无线客户端)
请注意,这是当前的配置中,VPN 服务器提供的 IP 以粗体显示。
该问题表示为大胆的- VPN 服务器提供的 IP 在每次重新连接后都会动态更改(即使没有,也可能更改)。对我来说,如果所有地址都是固定的,那么即使是这种多路路由也很容易弄清楚。使用一个 VPN、一个无线和 eth0:1 也很容易,因为 VPN 服务器推送默认路由连接时,其余的都很简单。无论如何,我知道要为一个 wifi 设置一个 NAT,以便将其路由到一个 VPN
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
如图所示:
https://pimylifeup.com/raspberry-pi-vpn-access-point/
然而,两个 VPN 连接我必须防止服务器干扰我的路由,当然我可以这样做:
pull-filter ignore redirect-gateway
在 VPN 客户端配置文件中。
在我这样做之后,我迷失了。流量显然没有被路由到tun0或者tun1。VPN 服务器和我之间的区别在于,服务器可以推送确切的路线它知道确切的 IPVPN 接口(服务器决定),我不知道!
我尝试使用iptables,仅基于网络设备名称,但到目前为止我还没有成功。有人能建议我可以采取的正确路线来设置此路由吗?
答案1
VPN 服务器和我之间的区别在于,服务器可以推送准确的路由,因为它知道 VPN 接口的准确 IP(服务器确定它),而我不知道!
您不需要。您的 VPN 客户端创建的“tun”接口是“第 3 层”接口,根本不使用路由网关地址 - 您只需通过整个设备路由流量即可获得相同的结果。例如:
ip route add <dstA>/24 dev tun0
ip route add <dstB>/24 dev tun1
或者如果您希望它基于客户端 IP 地址:
ip route add 0.0.0.0/0 dev tun0 table 10
ip rule add pref 100 from 192.168.44.0/24 lookup 10
(在以太网、Wi-Fi 或“tap”等第 2 层接口上,同一个接口会根据您发送数据包的 MAC 地址将您连接到多个本地设备。您在路由中指定的“网关”或“通过”地址仅用于一件事:它会被解析为 MAC 地址。
但是,诸如“tun”或“ppp”之类的第 3 层接口根本没有 MAC 寻址 - 它们只有两端,并且没有“在线”主机和“远程”主机之间的区别。因此,路由不需要网关,因为无论您发送什么,数据包总是到达同一个目的地,在本例中是 VPN 服务器。)
最后,如果你做过需要知道默认网关地址,您可以让 VPN 客户端告诉您 – 例如 OpenVPN 支持--up
接收有关网络配置的所有信息的脚本。
eth0:1 和 eth0:2 是与 eth0 共享硬件的接口
由于历史原因,ifconfig 会告诉你这些谎言。这些“别名”接口实际上在 Linux 上已经存在很长时间了;如今,操作系统将它们作为单个 eth0 接口进行管理,该接口只是分配了多个地址。
另外需要注意的是,出于与上一节相同的原因,客户端使用 eth0:1 和 eth0:2 作为网关并没有太大区别——它们的 IP 地址都解析为完全相同的 MAC 地址。只能通过客户端自己的源 IP 地址来区分数据包。