Operation

异地组网之 OpenVPN 快速部署

异地组网之 OpenVPN 快速部署

使用 Linux 脚本一键快速搭建自己的 OpenVPN 服务器。支持 Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS 和 Fedora 系统。

该脚本可让你在几分钟内建立自己的 VPN 服务器,即使你以前没有使用过 OpenVPN。OpenVPN 是一种开源、强大且高度灵活的 VPN 协议。

  • 特此申明:本教程仅推荐用于技术测试、个人学习使用,请勿用于非法等恶意用途,否则产生后果与本教程无关。

1. OpenVPN Server 部署

  • 1.1 一键交互式安装
curl -L -o openvpn.sh https://get.vpnsetup.net/ovpn
# 或墙内推荐:
curl -L -o openvpn.sh https://gitee.com/wl4g/blogs/raw/master/docs/articles/operation/openvpn-deploy/resources/openvpn.sh

# 执行交互式安装
sudo chmod +x ./openvpn.sh
sudo ./openvpn.sh

# 查看 openvpn system service
sudo systemctl status openvpn-server@server
  • 1.2 管理客户端证书(同一脚本交互式)
sudo ./openvpn.sh

2. OpenVPN Clients 安装

安装完成后,你可以再次运行脚本来管理用户或者卸载 OpenVPN。

OpenVPN 客户端 在 Windows, macOS, iOS, Android 和 Linux 上可用。macOS 用户也可以使用 Tunnelblick。要添加 VPN 连接,首先将生成的 .ovpn 文件安全地传送到你的设备,然后打开 OpenVPN 应用程序并导入 VPN 配置文件。

2.1 Debian or Ubuntu

  • 前置安装
# 首先确保 apt 支持 https
sudo apt install apt-transport-https

# 下载 OpenVPN 3 Linux 软件包密钥
curl -fsSL https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/openvpn-repo-pkg-keyring.gpg

# 然后根据您的 Debian/Ubuntu 发行版,将 $DISTRO 替换为发行版名称。
curl -fsSL https://swupdate.openvpn.net/community/openvpn3/repos/openvpn3-$DISTRO.list >/etc/apt/sources.list.d/openvpn3.list
sudo apt update
  • 安装 openvpn
sudo apt install openvpn3

2.2 Fedora, Red Hat Enterprise Linux, CentOS

  • 支持的发行版
Distribution Release versions Architecture DCO support
Fedora 35, 36, Rawhide (*2) aarch64, s390x, x86_64 yes (*1)
Red Hat Enterprise Linux / CentOS 7 x86_64 -
Red Hat Enterprise Linux 8 aarch64, x86_64 yes (*1)
Red Hat Enterprise Linux 9 aarch64, x86_64 yes (*1)
  • [*1] 请注意,DCO 支持目前被视为技术预览。

  • [*2] Fedora Rawhide 是一个移动的目标,在我们整理好构建环境所需的更改之前,会有一段时间没有可用的更新。

如果您正在运行 Red Hat Enterprise Linux 或其克隆,您需要先安装 Fedora EPEL 存储库和 yum copr 模块。启用 Fedora EPEL 的说明可以在这里找到:​https://fedoraproject.org/wiki/EPEL

# Fedora 发行版通常预装了 yum/dnf copr 模块:https://docs.fedoraproject.org/en-US/epel/
sudo yum install yum-plugin-copr

# 有了可用的 Copr 模块,是时候启用 OpenVPN 3 Copr 存储库了
sudo yum copr enable dsommers/openvpn3

# 然后就可以安装 OpenVPN 3 Linux 客户端了
sudo yum install openvpn3-client

2.3 使用 openvpn2 管理命令行

对于熟悉经典 OpenVPN 2.x 命令行的用户来说,openvpn3 会向前兼容。

  • 启动连接(临时)

注:如果是在远程或云主机上启动 openvpn 连接,必须指定 route subnet,否则 openvpn 默认会添加 default 路由到 vpn_gateway,参见 #2.5 自定义客户端路由
,导致 SSH 连接中断。(万一出现这种情况就只能 VNC 了)

# 其中 myclient.ovpn 是在安装 OpenVPN server 时使用 openvpn.sh 工具生成.
sudo openvpn2 --config myclient.ovpn --verb 6

myclient.ovpn 替换为您要使用的 OpenVPN 配置文件。如果此配置包含该--daemon选项,VPN 会话将在后台启动,并再次向用户返回命令行。要进一步管理此 VPN 会话,openvpn3 session-manage必须使用命令行界面。如果没有--daemon控制台,将填充来自 VPN 会话的日志数据,并且可以通过终端中的简单 CTRL-C 断开会话。

# 连接成功后即可看到 openvpn 创建的 tun0 网络设备
sudo ip a
...
25: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.2/24 brd 10.8.0.255 scope global tun0
       valid_lft forever preferred_lft forever

# 可看到 openvpn 创建了一条路由规则指向 tun0 设备(默认会将所有出口流量引到 10.8.0.1 上)
sudo ip r
0.0.0.0/1 via 10.8.0.1 dev tun0
default via 10.0.0.1 dev wlp2s0 proto dhcp metric 600
10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.114 metric 600
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
...

# 可以 ping 通虚拟局域网网关
ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=11.2 ms
...

2.4 使用 openvpn3 管理命令行

对于更高级的用法,openvpn3 命令行提供了更多功能。OpenVPN 3 Linux 中的配置文件由配置管理器管理,然后通过会话管理器启动 VPN 会话。该openvpn3实用程序可以访问这些管理器服务提供的功能。

  • 启动连接(临时)

注:如果是在远程或云主机上启动 openvpn 连接,必须指定 route subnet,否则 openvpn 默认会添加 default 路由到 vpn_gateway,参见 #2.5 自定义客户端路由
,导致 SSH 连接中断。(万一出现这种情况就只能 VNC 了)

这意味着一旦尝试启动 VPN 会话,就会从配置管理中解析、加载和删除配置文件。在这种方法之后,没有配置文件可供重复使用。这是通过将配置文件直接提供给 openvpn3 session-start 命令来实现的。

sudo openvpn3 session-start --config myclient.ovpn
  • 导入配置文件以重用并启动 VPN session

    使用这种方法,可以多次使用导入的配置文件,并且不需要访问配置文件本身来启动 VPN 隧道。默认情况下,导入的配置文件仅对导入配置文件的用户可用。但是 OpenVPN 3 Linux 还通过 openvpn3 config-acl 提供了访问控制列表功能,以授予系统上特定或所有用户的访问权限。

sudo openvpn3 config-import --config myclient.ovpn

这将加载配置文件并将其仅存储在内存中。这意味着,如果系统重新启动,则不会保留配置文件。如果将 --persistent 参数添加到上面的命令行中,则配置文件将保存到磁盘中只有 openvpn 用户可以访问的目录中。每当启动配置管理器时,导入的配置文件 --persistent 也会自动加载。

  • 查看所有可用的配置文件
openvpn3 configs-list

配置文件通常包含能够连接到特定服务器的通用选项,而与设备本身无关。OpenVPN 3 Linux 还支持在配置文件上设置更多特定于主机的设置。这是通过 openvpn3 config-manage 接口处理的。如果使用参数导入配置文件,则此处的任何设置也将在引导期间保留 --persistent

  • 管理正在运行的 VPN 会话

    一旦 VPN 会话开始,它应该会在​ openvpn3 sessions-list中看到:

openvpn3 sessions-list
  • 查询会话隧道实时统计数据
openvpn3 session-stats --config myclient.ovpn
  • 实时查看日志
openvpn3 log --config myclient.ovpn

2.5 自定义客户端路由

如,通常在办公网中使用 openvpn 时,你可能只是需要访问某个特定的企业软件时才走 vpn,并不希望所有流量都走 vpn,这是很常规的需求,那么就可以通过自定义客户端路由实现。

# 向客户端配置文件追加路由配置
sudo echo "
route-nopull # Get route from server after disable client connected.
max-routes 1000 # Max route entries limit, default 100
route 172.8.2.0 255.255.255.0 vpn_gateway # Need go to the output subnet of the ovpn gateway
route 192.168.8.0  255.255.255.0 net_gateway # Not go to the output subnet of the ovpn gateway
" >> myclient.ovpn

# 然后重启 openvpn,如:
sudo ps -ef | grep -v grep | grep openvpn | cut -c 9-16 | xargs kill -s TERM
nohup sudo openvpn --config /etc/openvpn/client/myclient.ovpn --verb 6 >> /tmp/ovpn-client.out 2>&1 &

以上路由表示,客户端仅访问 172.8.2.0/24 时才走 ovpn,而访问 192.168.8.0/24 时直接物理 Underlay 网络。

3. FAQ

3.1 关于在 Ubuntu 20.x 上使用默认集成的 OpenVPN gnome GUI 连接总是失败。

  • 分析:这可能由于协议或认证机制兼容性导致,暂未做具体探究,但改用安装命令行客户端,sudo openvpn --config your_openvpn_client.ovpn --verb 6 即能连接成功。

3.2 OpenVPN 集群部署

3.3 OpenVPN admin UI 部署

注:OpenVPN Access Server 简称 (openvpn-as) 组件是收费的,默认在官网注册会获得 2 个免费的连接。

3.4 相关在线 FREE 地址

3.5 实坑!在企业级环境中,可能需要在办公内网访问远程 CDH 集群内网中的服务,如何解决?

  • 分析:此需求的特殊性在于,由于如 NameNode / DataNode / Kafka 等组件各节点的通信地址是配置死的(如 nn1 的 hdfs rpc 地址是 172.8.2.100:8020),如下以执行 hdfs dfs -ls / 为例的网络包途径(通过wireshark分析):TODO

  • 思路:本地在进入 tun0 之前 dnat,远程A在到 NameNode 进程之前 snat

  • 解决:通过增加 iptables 规则,将出站 172.8.2.0/24 的流量转向 10.8.0.0/24 (ovpn tun0设备)

  • 坑1:亲测还发现,openvpn client 会修改 net.ipv6.bindv6only=1,这样会导致与 CDH HBase 启动冲突,因为它要求禁用,因此需手动改回来:sysctl -w net.ipv6.bindv6only=0

  • 坑2:亲测还发现,当与 kubenetes+calico 一起部署时,由于 openvpn client 启动会创建 tun0 设备,这也会与 calico-node 冲突,因为它会读到 tun0 的 ip,暂时只能先手动停止 openvpn 并删除 ip link del tun0,后续可以尝试让 calico 过滤掉 tun0 或者自定义 openvpn 路由看是否可行?

留言

您的电子邮箱地址不会被公开。