我在 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
让我们看看我是否可以更好地解释一下:
假设你有一个主机某处在互联网上向您的网络发送 IP 数据包。为了便于讨论,我们假设它来自 IP 地址
1.2.3.4
。vlan254
包裹从或链接到达您的网络ppp0
。然后转发到您网络上的目的地(即通过uplink3
)。现在,收到包裹的人必须回复,因此它会发送一个带有目的地地址的包裹
1.2.3.4
。由于
uplink1
和都有到其中任意一个的uplink2
路径可作为有效路径,因此包将通过具有最低度量的链接转发,即。1.2.3.4
uplink1
这基本上就是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(例如 1194和1195) 并使用标记将所有回复通过一个或另一个链接转发到互联网。