多 WAN 路由器上的 OpenVPN 服务器

多 WAN 路由器上的 OpenVPN 服务器

我在 MultiWAN 路由器(基于 Ubuntu)上有一个 OpenVPN 服务器。问题是,传入的数据包不会从它们进入的同一个 WAN 接口离开。我已经使用 iptables MARK 规则与 ip 规则进行了测试,但无法解决问题。我知道,我可以在 openvpn 配置上定义local 79.1.2.3传出 ip,但如果可能的话,我希望它更灵活。如果重要的话,OpenVPN 端口协议是 UDP。

$ ip r s|grep default
default via 83.1.2.3 dev vlan254 metric 1 
default via 79.1.2.3 dev ppp0 metric 2 
default via 192.168.0.251 dev vlan10 metric 3 onlink 

$ ip rule s
0:      from all lookup local 
100:    from all fwmark 0x1 lookup uplink1 
101:    from 83.1.2.3 lookup uplink1 
102:    from all to 83.1.2.3 lookup uplink1 
200:    from all fwmark 0x2 lookup uplink2 
201:    from 79.1.2.3 lookup uplink2 
300:    from all fwmark 0x3 lookup uplink3 
301:    from 192.168.0.254 lookup uplink3 
302:    from all to 192.168.0.254 lookup uplink3 
32766:  from all lookup main 
32767:  from all lookup default 

# iptables -L -vn -t mangle
Chain PREROUTING (policy ACCEPT 4785K packets, 5178M bytes)
 pkts bytes target     prot opt in     out     source               destination         
4785K 5178M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
3985K 5035M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
  351 46210 MARK       all  --  vlan254 *       0.0.0.0/0            0.0.0.0/0            MARK set 0x1
 3865  242K MARK       all  --  ppp0   *       0.0.0.0/0            0.0.0.0/0            MARK set 0x2
  351 46210 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1 CONNMARK save
 3865  242K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x2 CONNMARK save

Chain INPUT (policy ACCEPT 1658K packets, 1114M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 3127K packets, 4063M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1534K packets, 1241M bytes)
 pkts bytes target     prot opt in     out     source               destination         
1534K 1241M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
 657K  103M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
    0     0 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:55394 MARK set 0x2
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1 CONNMARK save
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x2 CONNMARK save

Chain POSTROUTING (policy ACCEPT 4639K packets, 5303M bytes)
 pkts bytes target     prot opt in     out     source               destination         
4639K 5303M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
3743K 4164M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
   90  7560 MARK       all  --  *      vlan254  0.0.0.0/0            0.0.0.0/0            MARK set 0x1
57161 3664K MARK       all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0            MARK set 0x2
 896K 1140M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK save

因此,传入的数据包来自上行链路 2,但离开上行链路 1(默认网关)。

有什么想法可以解决我的问题吗?

答案1

让我们看看我是否可以更好地解释一下:

  1. 假设你有一个主机某处在互联网上向您的网络发送 IP 数据包。为了便于讨论,我们假设它来自 IP 地址1.2.3.4

  2. vlan254包裹从或链接到达您的网络ppp0。然后转发到您网络上的目的地(即通过uplink3)。

  3. 现在,收到包裹的人必须回复,因此它会发送一个带有目的地地址的包裹1.2.3.4

  4. 由于uplink1和都有到其中任意一个的uplink2路径可作为有效路径,因此包将通过具有最低度量的链接转发,即。1.2.3.4uplink1

这基本上就是10.4.2. Inbound traffic Using Multiple Connections to the Internet 来自我上面的链接


然而你想要的是:

  • 如果流量通过 进入,uplink1则任何回复都将通过 发出uplink1
  • 同样,任何来自的 IP 包uplink2也将使用 进行回复uplink2

这意味着你将顺利地进入 的世界multihomed networking

现在我假设您使用了标记包的功能,以便跟踪包的来源?遗憾的是,标记仅在您有需要通过不同路径路由的 IP 包时才有用,具体取决于最初使用哪个端口号作为源端口或目标端口。

我的链接中的替代解决方案是让您的服务器监听 2 个 IP 地址,然后执行一种反向 NAT,其中所有入站流量都转发到其中一个 IP 地址,具体取决于所使用的链接。

然后,您可以根据服务器的源 IP 地址通过正确的链接转发流量。

您也可以在两个不同的端口上运行 OpenVPN(例如 11941195) 并使用标记将所有回复通过一个或另一个链接转发到互联网。

相关内容