OpenVPN/Bridge
本页面介绍如何在 Arch Linux 上创建网络桥接,并使用基于 IP 层 2 的以太网桥接 (TAP) 而非基于 IP 层 3 的 IP 隧道 (TUN) 来托管 OpenVPN 服务器。通用 OpenVPN 页面更详细地介绍了设置 PAM 认证或 OpenSSL 安全证书。
简介
OpenVPN 文档页面提供了 OpenVPN 支持的服务器端和客户端选项的完整概述。更易于设置 OpenVPN 的隧道模式并控制流量路由,如果这能满足您的需求,通常建议这样做。但是,某些网络应用程序(例如 Windows 文件共享)依赖于以太网级别的网络广播,并需要它们认为自己物理上位于同一子网,软件桥接可满足此目的。
有多种方法可以设置桥接。动态方法是指 OpenVPN 将管理系统上的桥接,并自行启动、停止和配置它。这是设置桥接的最快方法,尽管在 OpenVPN 启动和停止时会中断其他网络服务。如果系统将管理自己的桥接,可能是因为除了 OpenVPN 的虚拟网络适配器之外,还有其他虚拟网络适配器连接到桥接,那么最好使用静态方法。
动态桥接安装
您需要安装 OpenVPN 和 Linux 桥接实用程序,它们在 openvpn 和 bridge-utils 包中可用。要使用下面的示例脚本,您还需要安装 dhcpcd 包。
动态桥接配置
OpenVPN 将会自动为配置文件中指定的名称创建/销毁 TAP 设备。TUN 或 TAP 共有的 OpenVPN 设置未在下面的示例配置文件中显示,仅显示影响 TAP 模式的设置。请确保在编写完 up 和 down 脚本后,它们是可执行的。
(TUN 和 TAP 的通用部分省略)
/etc/openvpn/server.conf
# this uses a dhcp server, server-side
# clients must support binding their dhcp client to their tap adapter
# do not append 'nogw' if using dhcp
server-bridge
# can specify interface, like tap0 or tap1
# or use up/down routing scripts to handle
# more than one, if needed
dev tap0
# needed to call scripts like up/down
# which call external programs within the scripts
script-security 2
# user defined scripts for adding/removing tap to bridge
# 'dev mtu link_mtu ifconfig_local_ip ifconfig_remote_ip' are appended if set
# make sure 'user' has permission to run 'down' ('up' will be root)
up "up br0 eth0"
down "down br0 eth0"
# call 'down' before TUN/TAP close
down-pre
# drop root priveledges once connected
# good idea, for servers running on linux
# 'up' script not affected, 'down' script is
;user nobody
;group nobody
/etc/openvpn/up
#!/bin/bash br=$1 eth=$2 dev=$3 mtu=$4 cd /usr/bin/ # only if you start dhcpcd and leave it # running for eth #dhcpcd -k $eth # needed if script is run independently # but when run through openvpn # openvpn will do this automatically # could also use 'ip tuntap ..' #openvpn --mktun --dev $dev brctl addbr $br # set forwarding delay to 0 # otherwise dhcp called below would timeout brctl setfd $br 0 brctl addif $br $eth # order matters here.. right now there is only # one mac in the bridge's table # if there were two.. there is no guarantee # which would be passed to the dhcp server dhcpcd $br brctl addif $br $dev ip link set $eth up promisc on mtu $mtu ip link set $dev up promisc on mtu $mtu
/etc/openvpn/down
#!/bin/bash br=$1 eth=$2 cd /usr/bin/ dhcpcd -k $br ip link set $br down brctl delbr $br # needed if script is run independently # but when run through openvpn # openvpn will do this automatically # could also use 'ip tuntap ..' #openvpn --rmtun --dev $dev # only if you start dhcpcd and leave it # running for eth #dhcpcd $eth
这些示例是用于 dhcp 的。如果您打算使用静态 IP 地址,则需要相应地进行调整。
使用 Systemd
OpenVPN systemd 脚本默认在 /etc/openvpn 文件夹中查找 <name>.conf 文件。因此,假设您有一个名为 server.conf 的文件,您可以启用并启动 openvpn@server。
小心同时单独启用 dhcpcd(例如 dhcpcd@eth0.service)。虽然不太可能,但它可能会在 OpenVPN 完成后完成,并破坏 OpenVPN 的 dhcp 设置。您可能可以禁用 dhcpcd@eth0.service,因为您知道 openvpn@server.service 无论如何都会重置 dhcp。
静态桥接安装
您首先要做的是安装这些包: openvpn、bridge-utils、netctl。
静态桥接配置
OpenVPN 团队或各种 Linux 打包商提供的 OpenVPN 指南的早期版本提供了在启动 OpenVPN 时构建桥接并在关闭 OpenVPN 时销毁桥接的示例脚本。
然而,这是一种有些被弃用的方法,因为出于安全原因,OpenVPN 从 2.1.1 开始默认不允许其调用外部脚本或程序,除非明确启用。
此外,与网络初始化过程的所有其他部分相比,构建桥接相对较慢。(实际上,非常慢,以至于 dhcpcd 会在桥接准备好之前超时。请参阅 #静态桥接故障排除。)此外,在重新配置更改后重新启动 OpenVPN 时,没有理由重建一个工作的桥接,从而中断您所有其他网络应用程序。因此,按照以下方式设置静态桥接配置是推荐的方法。
要为您的服务器创建 OpenVPN 桥接,您将不得不使用 netctl 并创建两个网络配置文件 - 一个用于 tap 接口,一个用于桥接。
转到 /etc/netctl 并将 tuntap 示例文件复制到该目录
# cd /etc/netctl/ # cp examples/tuntap openvpn_tap
现在编辑 openvpn_tap 以创建 tap 接口。它可能看起来像这样
/etc/netctl/openvpn_tap
Description='tuntap connection' Interface=tap0 Connection=tuntap Mode='tap' User='nobody' Group='nobody'
不要在此处配置 IP 地址,这将在桥接接口上完成!
要创建 bridge 配置文件,请复制示例文件
# cp examples/bridge openvpn_bridge
现在编辑 openvpn_bridge。它可能看起来像这样
/etc/netctl/openvpn_bridge
Description="Bridge connection"
Interface=br0
Connection=bridge
BindsToInterfaces=(eth0 tap0)
IP=static
Address=('192.168.11.1/24')
Gateway='192.168.11.254'
DNS=('192.168.11.254')
有关更多信息,例如如何使用 DHCP,请查看 netctl 文章。
现在使用以下命令启用并启动两个配置文件
# netctl enable openvpn_tap # netctl enable openvpn_bridge # netctl start openvpn_tap # netctl start openvpn_bridge
静态桥接故障排除
网络启动失败
这可能是因为您在桥接上使用 DHCP,并且桥接的设置时间比 dhcpcd 愿意等待的时间长。您可以通过在桥接网络配置文件(openvpn_bridge)中设置 FWD_DELAY 参数来解决此问题。从值 5 开始,并逐渐减小直到它起作用。
使用 DHCP 时桥接没有 IP 地址
您可能需要在通过 DHCP 请求 IP 地址之前释放分配给以太网接口的 IP 地址。执行此操作
dhcpcd -k
然后,修改 dhcpcd 配置文件,以确保以太网接口(在这种情况下为 enp3s0)未分配 IP 地址
/etc/dhcpcd.conf
denyinterfaces enp3s0
在文件末尾附近(假设您的桥接名为 br0)
/etc/dhcpcd.conf
interface br0
现在按照上述说明创建网络桥接,然后运行 dhcpcd 为您的接口分配 IP 地址。检查 ip addr 是否显示已分配给桥接(即 br0)的有效 IP 地址。
更多资源
- OpenVPN - 配置 OpenVPN 的通用页面,包括设置身份验证方法。