我正在设置一个桥接器,用于连接单个共享“以太网空间”中的两个或多个不相交的物理网络(例如,我希望一切都像插入一个以太网交换机一样工作)。我的两个网络都将位于 NAT 后面,因此我正在云端设置一个具有公共 IP 的服务器,该服务器将接受来自客户端的连接(它将有进一步的桥接 tap0 和 eth0 接口,但我还没有做到这一点)。
编辑(原因):我需要跨客户站点进行工作广播。这将大大降低人们在这些站点上进行其他所有操作的复杂性。(/编辑)。
现在,我弄清楚了如何通过 VPN 进行 TAP 桥接,我按照 OpenVPN 的桥接教程进行了操作,(https://openvpn.net/community-resources/ethernet-bridging/)。我在两个客户端测试节点和服务器上都安装了 bridge-start 和 bridge-stop 脚本。我将设置简化为 3 个固定的私有 IPV4 IP:
服务器:网桥 br0(一个接口,tap0)192.168.104.2 客户端 1:网桥 br0(一个接口,tap0)192.168.104.3 客户端 2:网桥 br0(一个接口,tap0)192.168.104.5
我可以启动 openvpn 服务器,然后客户端连接。之后,我可以顺利地从一个客户端 ping 服务器。或者另一个客户端。但是。在我的配置中,服务器只接受来自第一个连接的客户端的一个连接!第二个连接超时,服务器甚至没有打印出检测到的“连接”尝试(我对 OpenVPN 使用了 UDP)。
对我来说点对点服务器模式。现在,我更深入地研究了 OpenVPN 参考资料,并发现了以下内容:
从 OpenVPN 2.0 开始,支持多客户端 TCP/UDP 服务器模式,可以通过--模式服务器选项。在服务器模式下,OpenVPN 将在单个端口上监听传入的客户端连接。所有客户端连接都将通过单个 tun 或 tap 接口路由。
然后进一步进行桥接:
--server-bridge ['nogw'] 类似于 --server 的辅助指令,旨在简化以太网桥接配置中 OpenVPN 服务器模式的配置。
当然,我在服务器配置中使用了“server-bridge”指令。请注意,这里的文档没有提到“多客户端”模式!现在,我的问题是:多客户端 TAP 桥接OpenVPN 服务器实际上支持吗?当我使用 --server-bridge 时,服务器显然会停止监听新连接,但我找不到任何原因。
对我来说,额外的问题是,如果支持多客户端,那么我需要以某种方式告诉服务器为每个连接启动新的 tapX 接口(这样它们就可以连接到服务器上的桥接 br0,例如:
服务器:桥接 br0(tap0、tap1、tap2、tap3...tapN)192.168.104.2
我根本找不到办法,因为关于桥接的教程有一些令人困惑的配置错误。例如:
dev tap
dev-node tap-bridge
这里的“tap-bridge”是什么意思?应该是 br0 吗(正如在同一个教程页面的 bridge-start 脚本中提到的那样)?
目前我只看到“采取更大的锤子解决方案”,即为 N 个客户端运行 N 个服务器,提供 tap0、tap1、tap2、...tapN-1,全部加入服务器上的 br0 桥接下,当然还要监听 N 个 UDP 端口。
我是不是漏掉了什么?下面是我为服务器和两个客户端提供的配置文件。请注意,两个客户端完全相同,唯一的区别是密钥,我没有发布。请注意,连接后,服务器日志中会出现通用名称,这就是我知道第一个连接的人会阻止服务器的原因。
还要注意,正如桥接 OpenVPN 教程所建议的,建议的路线“首先创建有效的 TUN 设置,然后修改配置文件”留下了一些多余的东西。
服务器配置:
server-bridge nogw
port 1195
proto udp
dev tap
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "redirect-gateway def1 bypass-dhcp"
dh none
ecdh-curve prime256v1
tls-crypt tls-crypt.key
crl-verify crl.pem
ca ca.crt
cert server_wKZztg0TXq0FsUvZ.crt
key server_wKZztg0TXq0FsUvZ.key
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
client-config-dir /etc/openvpn/ccd
script-security 2
status /var/log/openvpn/status.log
up /etc/openvpn/server/bridge-start
down /etc/openvpn/server/bridge-stop
verb 3
客户端配置1:
client
proto udp
explicit-exit-notify
remote serverIPdeleted 1195
dev tap0
resolv-retry infinite
nobind
persist-key
remote-cert-tls server
verify-x509-name server_wKZztg0TXq0FsUvZ name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
pull-filter ignore redirect-gateway
script-security 2
up /etc/openvpn/client/bridge-start
down /etc/openvpn/client/bridge-stop
verb 3
客户端配置2:
client
proto udp
explicit-exit-notify
remote ServerIPDeleted 1195
dev tap0
resolv-retry infinite
nobind
persist-key
remote-cert-tls server
verify-x509-name server_wKZztg0TXq0FsUvZ name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
pull-filter ignore redirect-gateway
script-security 2
up /etc/openvpn/client/bridge-start
down /etc/openvpn/client/bridge-stop
verb 3
编辑(根据要求):我的桥接脚本添加了一些注释。
- 服务器桥接启动脚本
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
# adapted from tutorial
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0 tap1 tap2 tap3 tap4"
# Commented because I want to bridge clients networks!
#eth="eth0"
eth_ip="192.168.104.2"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.104.255"
for t in $tap; do
openvpn --mktun --dev $t
done
brctl addbr $br
# below is commented for a reason, see above
#brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
# again commented with a reason above
#ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i tap1 -j ACCEPT
iptables -A INPUT -i tap2 -j ACCEPT
iptables -A INPUT -i tap3 -j ACCEPT
iptables -A INPUT -i tap4 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT
- 服务器桥接停止脚本
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0 tap1 tap2 tap3 tap4"
ifconfig $br down
brctl delbr $br
#for t in $tap; do
# openvpn --rmtun --dev $t
#done
- 客户端桥接启动脚本。其他客户端的脚本仅在 IP 和 MAC 地址上有所不同。我分配了 MAC 以便稍后启用单独的 DHCP 服务器。客户端可以工作,主要问题是为什么它们不能同时连接到服务器。如果第二个客户端完全连接(但实际上没有连接),则在服务器输出中会发现 MAC、IP、学习路由的任何问题,所以我相信这些不是问题。只要我尝试仅连接一个客户端,两个客户端都可以正常工作。第二个客户端(无论哪个先到)甚至无法连接。
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
brmac="00:00:00:10:04:03"
ip="192.168.104.3"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
#The below line is commented FOR NOW until I get it
# to work!
#eth="eth0"
eth_ip=$ip
eth_netmask="255.255.255.0"
eth_broadcast="192.168.104.255"
#for t in $tap; do
# openvpn --mktun --dev $t
#done
brctl addbr $br
ip link set $br address $brmac
#brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
# commented for now
#ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT
- 客户端桥接停止脚本。
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0"
ifconfig $br down
brctl delbr $br
#for t in $tap; do
# openvpn --rmtun --dev $t
#done
答案1
最后,我选择了“用更大的锤子”路线。花了一些时间进行设置,但现在在服务器端,我有 8 个 OpenVPN 服务器,占用 8 个 UDP 端口,有 8 个防火墙漏洞,以及 tap0-tap7 设备,它们在一个 br0 桥下连接。一切都运行完美,非常可靠。桥脚本已设置为单独的服务,在任何 OpenVPN 服务器启动之前的适当时间启动,以设置所有 tap 设备,然后将其连接到桥。当客户端连接到各自的服务器时,流量会无缝地流动。openvpn 配置文件中的任何位置都没有任何第 3 层设置。