我有一台带有 2 个 WAN 接口的服务器,eth1
并且eth2
. 每个人都有一个连接的路由器,它为他们提供这些 IP:192.168.3.101
和192.168.1.101
.
问题是我想完全避免流量通过eth1
,而是创建一个tun0
隧道,所有流量eth1
都应该接收。
我可以完全控制我的程序应该使用哪个接口(MPTCP 将使用它可以访问服务器的所有接口),所以我准备了一个简单的 OpenVPN 客户端/服务器配置(绑定到local 192.168.3.101
),带有服务器 IP192.168.99.1
和客户端 IP 192.168.99.2
。有了这个我有一个工作界面,我可以192.168.99.1
毫无问题地发送/接收数据。
现在,当我想ifconfig.co
使用 interface 向(例如)发送/接收数据时,问题就来了tun0
。我虽然它会做的是将数据发送eth1
到我的服务器,然后我的服务器将流量重定向到ifconfig.co
,但这不是正在发生的事情。它只是断开连接:
如果我尝试使用接口eth1
并且eth2
一切都按预期工作。
我已经不间断地阅读/尝试了很多东西大约 7 个小时,现在我真的迷路了。我不确定发生了什么或我做错了什么。
我认为是路由问题,因为当我尝试 tcpdump 上面的命令时,服务器上什么也没有显示。收到零个数据包。这就是我现在所拥有的:
我看到一切都彼此平等,但是eth0
/eth1
正在工作而tun0
不是。
以防万一,这是我的 OpenVPN 配置(一个简单的点对点配置):
;SERVER
dev tun
ifconfig 192.168.99.1 192.168.99.2
secret /etc/openvpn/static.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
;CLIENT
dev tun
remote XXXXXXXXXXXX
resolv-retry infinite
local 192.168.3.101
lport 0
ifconfig 192.168.99.2 192.168.99.1
secret /etc/openvpn/static.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key
注意:我知道 VPN IP 的约定是10.*
,但我不顾一切地更改192.168.*
为具有与其他 2 个接口类似的配置。
这一切的原因是解决这个问题的想法:https ://github.com/Ysurac/openmptcprouter/issues/670#issuecomment-533816813
您正在尝试实现基于路由隧道模式的解决方案,但您的问题描述在我看来非常适合桥接分接模式。
OpenVPN 不仅可以隧道 IP 数据包。它还可以对整个以太网数据包进行隧道传输。简而言之,您可以将“mode tun”替换为“mode tap”,并删除 OpenVPN 配置中的所有 IP 地址分配。同时删除所有非默认路由规则。然后,在您的操作系统的帮助下,您可以在 eth1 和 tap 接口之间架起一座桥梁。
在 Debian (/etc/network/interfaces) 中:
接下来,我们需要指示 OpenVPN 在启动后将 tapX 添加到 br0(这将转到 OpenVPN 配置):
为什么需要脚本安全性,请参阅https://community.openvpn.net/openvpn/wiki/OpenVPNBridging
up.sh 脚本:
它使用 bridge-utils brctl,因为这个配置是在 debian 7 上完成的。现代系统应该使用现代 iproute2 套件中的 ip 实用程序,而不是过时的 bridge-utils、iputils 等;我将把它留作家庭作业,如何使用 ip 向网桥添加接口,这并不难。
你看,我什至没有配置任何 IP 地址。这是因为我的 OpenVPN 设备只会将以太网数据包从物理接口桥接到虚拟接口并返回。在 OSI 网络模型中,这算作第 2 层桥接,即好像您有一个以太网交换机。
运行 OpenVPN 的远程系统(“CLIENT”)将具有其分接头接口,就好像它被插入到“SERVER”的 eth1 被插入的同一以太网交换机中一样:
您可以在远程系统 ("CLIENT") 上运行 DHCP 客户端,它应该从 LAN 中的 DHCP 服务器接收 IP 地址。您也可以在那里进行桥接,这就像您使用以太网电缆连接您的远程站点一样。想象一下,就像您在一个站点到另一个站点之间运行一条长光路,并将这些网络与它连接起来。
如果你想让“SERVER”也加入这个网络,你在br0本身上配置IP地址,为此你将“manual”替换为“static”甚至“dhcp”,这根本不会影响它的切换功能。
Linux Netfilter 设置(防火墙)需要特别注意。前段时间有一个 sysctl 变量控制桥接数据包是否通过“filter FORWARD”链传递,net.bridge.bridge-nf-call-iptables=1。在现代系统上,AFAIK,默认为 0。如果你有它,要么将它设置为 0(在 /etc/sysctl.conf 中),要么具有在交换机端口之间传递数据包的规则。请参阅 iptables 手册中的“physdev match”。
请注意,您为系统指定的“服务器”和“客户端”名称纯粹是装饰性的,并不反映它们的协议角色。从 OpenVPN 的角度来看,两个系统是平等的,因为您将 OpenVPN 配置为“传统”点对点模式。OpenVPN 中还有专用的“客户端-服务器”模式,其中确实有两个不同的角色,多个客户端可以连接到单个 OpenVPN 服务器。我在这里提出的想法也适用于该模式。
另外,请注意,OpenVPN 没有始终使用 10.* 的约定。任何成熟的生产级 VPN 解决方案都不会有这样的约定。您始终使用网络设计所需的网络编号。
UPD:在虚拟机内部测试网桥时,确保虚拟机管理程序允许在 VM 端口使用多个 MAC 地址。在 Hyper-V 中,该功能称为 MAC Spoofing,应该启用。