安装和配置 OpenVPN

2025-02-07 21:31:00
丁国栋
原创 49
摘要:本文记录如何安装和配置OpenVPN。

OpenVPN 是一种简单好用又安全的一种 VPN 工具,分为服务端和客户端,服务端负责处理VPN接入和路由(代理服务),客户端用于连接到服务端并且设置客户端路由等。

一、服务端部分

推荐使用容器部署

使用Docker镜像:kylemanna/openvpn

详细配置可以参考这里:

https://store.docker.com/community/images/kylemanna/openvpn
https://hub.docker.com/r/kylemanna/openvpn
https://github.com/kylemanna/docker-openvpn
https://github.com/kylemanna/docker-openvpn/tree/master/docs
以下是一个简单粗略但能用的步骤

需要认真规划 vpn 用户使用的子网避免冲突(主要是避免与内部网络和客户端网络的冲突),以下以 172.16.248.0/24 为例,假设内部网络为 10.8.0.0/255.255.0.0 和 10.0.0.0/255.255.248.0 两个内部网络。


docker run -v /data/docker/openvpn/ovpn-data:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://0.0.0.0 -D -c -p "route 10.8.0.0 255.255.0.0" -p "route 10.0.0.0 255.255.248.0" -s "172.16.248.0/24" -r "172.16.248.0/24"  sudo sed -i '/block-outside-dns/d' /data/docker/openvpn/ovpn-data/openvpn.conf
# 初始化CA
docker run -v /data/docker/openvpn/ovpn-data:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
# 验证和设置路由参数,允许IP转发以便能通过VPN服务器访问到内部网络的主机或服务
sudo sysctl -a |grep [n]et.ipv4
sudo sysctl -w net.ipv4.conf.default.accept_source_route=1
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
sudo sysctl -w net.ipv4.ip_forward=1
# 创建并启动VPN服务
# https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
# NET_RAW   Use RAW and PACKET sockets. Such as "iptables"
# NET_ADMIN Perform various network-related operations.
docker run -v /data/docker/openvpn/ovpn-data:/etc/openvpn -d --name "openvpn" --hostname="openvpn" -v /etc/localtime:/etc/localtime -p 1194:1194 --cap-add NET_ADMIN --cap-add NET_RAW kylemanna/openvpn
# 设置和确认容器运行策略为自动启动
docker update --restart=always openvpn
docker inspect openvpn | jq '.[0].HostConfig.RestartPolicy'
# 创建一个vpn用户
OVPN_USERNAME="example-username"
docker run -v /data/docker/openvpn/ovpn-data:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full ${OVPN_USERNAME} 
# 导出 vpn 用户的配置
docker run -v /data/docker/openvpn/ovpn-data:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient $OVPN_USERNAME | sudo tee ${OVPN_USERNAME}.ovpn
# 注意替换配置文件中的 0.0.0.0 为VPN服务的公网地址,例如 sudo sed -i 's/0.0.0.0/vpn.thedf.cc/g' ${OVPN_USERNAME}.ovpn
# 如果不希望VPN服务器作为VPN客户端的网络出口,那么需要执行:sudo sed -i '/redirect-gateway def1/d' ${OVPN_USERNAME}.ovpn 来避免客户端公网IP地址变为VPN的IP地址
# 列出用户:docker run -v /data/docker/openvpn/ovpn-data:/etc/openvpn --rm -it kylemanna/openvpn  ovpn_listclients
# 移除用户:docker run --rm -it -v /data/docker/openvpn/ovpn-data:/etc/openvpn kylemanna/openvpn easyrsa revoke example-username
# 在移除用户后需要重新加载配置 docker run --rm -it -v /data/docker/openvpn/ovpn-data:/etc/openvpn kylemanna/openvpn easyrsa gen-crl


需要注意的是,一个vpn文件在同一时间只能在一个客户端上使用,否则会导致冲突至少有一个客户端无法连接成功。


二、客户端部分

推荐使用apt、yum等包管理器安装

deb和rpm两种包的配置略有不同,最大的不同是vpn配置文件需要存放的位置(工作目录、配置文件目录、启动命令行)不同,deb包通常是 /etc/openvpn下,而rpm包通常是 /etc/openvpn/client 下,具体的可以通过查看 /usr/lib/systemd/system/openvpn@.service 文件的内容来确认。

以 2.6.12-0ubuntu0.24.04.1 版本为例

# /usr/lib/systemd/system/openvpn@.service
[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
Before=systemd-user-sessions.service
After=network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid
PIDFile=/run/openvpn/%i.pid
KillMode=process
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
TasksMax=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
RestartSec=5s
Restart=on-failure
[Install]
WantedBy=multi-user.target
而在 openvpn-2.4.12-2.el8.x86_64 中,systemd unit文件是这样的:

# cat /usr/lib/systemd/system/openvpn-client@.service 
[Unit]
Description=OpenVPN tunnel for %I
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn/client
ExecStart=/usr/sbin/openvpn --suppress-timestamps --nobind --config %i.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process
[Install]
WantedBy=multi-user.target


yum install openvpn -y || apt install openvpn -y
cp example-username.ovpn /etc/openvpn/client/ || cp example-username.ovpn /etc/openvpn/
rpm -ql openvpn | grep service || dpkg -L openvpn| grep service
cat /usr/lib/systemd/system/openvpn@.service || cat /usr/lib/systemd/system/openvpn-client@.service
ln -s /etc/openvpn/example-username.ovpn /etc/openvpn/example-username.conf
systemctl status openvpn@example-username.service || systemctl status openvpn-client@example-username.service
systemctl stop openvpn@example-username.service || systemctl stop openvpn-client@example-username.service
--



发表评论
博客分类