在 7 个(七个!)子网之间路由,其中​​ 2 个具有动态分配的 IP

xmp*_*25a 3 networking linux vpn wireless-networking routing

我在一个极其复杂的路由方案中使用 RaspberryPi(Raspbian OS),我可以管理它,直到子网数量为 5 :)

目前,我有以下接口,如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
Run Code Online (Sandbox Code Playgroud)

eth0提供对外界的互联网访问(固定 IP)

tun0tun1是连接不同 VPN 服务器的 VPN 接口,它们从各自的服务器获得动态分配的 IP(似乎是核心问题)

wlan0wlan1是 wifi 网络(用作接入点!),它们应该分别通过tun0tun1路由所有流量

eth0:1eth0:2是与eth0共享硬件的接口(RaspberryPi 上只有一个以太网端口),应该提供与wlan0wlan1相同的功能,但提供给有线客户端。

DHCP 服务器在 RaspberryPi 上运行,以确保wlan0wlan1将各自类别中的地址分发给其无线客户端。当然,共享线路上没有提供 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服务器在连接时推送默认路由,剩下的就很简单了。无论如何,我知道要为一个路由到一个 VPN 的 wifi 设置 NAT

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

如图所示:

https://pimylifeup.com/raspberry-pi-vpn-access-point/

但是,要拥有两个 VPN 连接,我必须防止服务器干扰我的路由,当然我可以这样做:

pull-filter ignore redirect-gateway
Run Code Online (Sandbox Code Playgroud)

在 VPN 客户端配置文件中。

在我这样做之后,我迷路了。流量显然不会路由到tun0tun1。VPN服务器和我的区别在于服务器可以推送确切的路由,因为它知道VPN接口的确切ip(服务器确定),我不知道!

我尝试使用iptables设置路由,完全基于网络设备名称,但到目前为止我没有成功。任何人都可以建议我可以采取的正确路线(原文如此)来设置此路线吗?

use*_*686 6

VPN服务器和我的区别在于服务器可以推送确切的路由,因为它知道VPN接口的确切ip(服务器确定),我不知道!

你不需要。您的 VPN 客户端创建的“tun”接口是“第 3 层”接口,根本不使用路由网关地址——您只需通过整个设备路由流量即可获得相同的结果。例如:

ip route add <dstA>/24 dev tun0
ip route add <dstB>/24 dev tun1
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望它基于客户端 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
Run Code Online (Sandbox Code Playgroud)

(在以太网、Wi-Fi 或“tap”等第 2 层接口上,同一接口根据您将数据包发送到的 MAC 地址将您连接到多个本地设备。您使用的“网关”或“通过”地址在路由中指定仅用于一件事:它被解析为 MAC 地址。

但是,诸如“tun”或“ppp”之类的第 3 层接口根本没有 MAC 地址——它们只有两端,并且“on-link”和“distant”主机之间没有区别。所以路由不需要有网关,因为无论你发送什么,数据包总是到达同一个目的地,在这种情况下是 VPN 服务器。)

最后,如果您确实需要知道默认网关地址,您可以让 VPN 客户端告诉您——例如 OpenVPN 支持--up接收有关网络配置的所有信息的脚本。

eth0:1 和 eth0:2 是与 eth0 共享硬件的接口

他们是 ifconfig 出于历史原因告诉您的谎言。这些“别名”接口在 Linux 上实际上已经存在很长时间了;现在,操作系统将它们作为单个 eth0 接口进行管理,该接口只是分配了多个地址。

另一方面,出于与上一节相同的原因,使用 eth0:1 和 eth0:2 作为网关的客户端之间没有真正的区别——它们的 IP 地址都解析为完全相同的 MAC 地址。数据包只能通过客户端自己的源 IP 地址来区分。