一个计算机技术爱好者与学习者

0%

好好学Docker:使用Docker安装配置OpenVPN

1. 前言

OpenVPN is a virtual private network (VPN) system that implements techniques to create secure point-to-point or site-to-site connections in routed or bridged configurations and remote access facilities. It implements both client and server applications.

参考文档:

2. OpenVPN原理

FROM ChatGPT:

OpenVPN是一个开源的虚拟私人网络(VPN)解决方案。它使用SSL/TLS协议进行安全通信,并能够穿越大多数防火墙和NAT路由器。

OpenVPN的原理如下:

  1. 通信双方首先建立一个加密通道,这个过程叫做握手(handshake)。
  2. 握手完成后,通信双方会互相验证对方的身份。
  3. 验证完成后,OpenVPN将使用TLS协议进行数据通信,所有传输的数据将通过OpenVPN的通道进行加密和解密,保证通信的安全性。
  4. OpenVPN支持多种加密算法,例如AES和Blowfish等,同时还支持TLSv1.2协议,确保传输的数据不会被窃取或篡改。
    在OpenVPN中,通常会有一个服务器和多个客户端。服务器会为每个客户端分配一个唯一的IP地址,并且使用路由器将其所有客户端的流量路由到公网上。

OpenVPN可以通过在不同的操作系统上运行来实现跨平台性。此外,OpenVPN还可以使用多种网络协议,例如TCP、UDP和ICMP等。

总的来说,OpenVPN的原理是通过加密和身份验证等安全措施来实现对数据传输的保护,从而实现在不安全的公共网络中建立安全的私人网络。

3. 准备VPN域名

1、登录dnspod或者其他域名解析平台
2、解析vpn.voidking.com域名,指向准备安装OpenVPN Server的主机IP。

4. 安装OpenVPN Server

4.1. 安装思路

1、准备volume
2、初始化数据,准备配置和CA证书
3、启动openvpn server
4、生成客户端证书和配置

4.2. 准备volume

1
2
3
OVPN_DATA="ovpn-data-example"
docker volume create --name $OVPN_DATA
docker inspect volume ovpn-data-example

4.3. 初始化volume中的数据

1、生成配置

1
2
3
4
docker pull kylemanna/openvpn:2.4
docker run --rm \
-v $OVPN_DATA:/etc/openvpn \
kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.voidking.com

如果没有域名,使用IP也是可以的。

执行命令后,会在 /var/lib/docker/volumes/ovpn-data-example/_data/ 目录中生成一些配置文件。
其中最核心的是 openvpn.conf ,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.voidking.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.voidking.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
comp-lzo no

### Route Configurations Below
route 192.168.254.0 255.255.255.0

### Push Configurations Below
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "comp-lzo no"

2、生成CA证书

1
2
3
4
docker run --rm -it \
-v $OVPN_DATA:/etc/openvpn \
--privileged --network host \
kylemanna/openvpn:2.4 ovpn_initpki
  • Enter New CA Key Passphrase: # 输入密码 voidking
  • Re-Enter New CA Key Passphrase: # 再次输入密码 voidking
  • Common Name (eg: your user, host, or server name) [Easy-RSA CA]: # 输入 openvpn-server
  • Enter pass phrase for /etc/openvpn/pki/private/ca.key: # 输入密码 voidking
  • Enter pass phrase for /etc/openvpn/pki/private/ca.key: # 再次输入密码 voidking

3、查看数据

1
2
cd /var/lib/docker/volumes/ovpn-data-example/_data/pki/private
ll

4.4. 启动openvpn server

1
2
3
4
5
6
7
8
docker run --name openvpn -d \
-v $OVPN_DATA:/etc/openvpn \
-p 1194:1194/udp \
--cap-add=NET_ADMIN \
kylemanna/openvpn:2.4

docker ps
docker logs openvpn

The UDP server uses 192.168.255.0/24 for dynamic clients by default.

4.5. 生成客户端证书

1
2
3
docker run --rm -it \
-v $OVPN_DATA:/etc/openvpn \
kylemanna/openvpn:2.4 easyrsa build-client-full client0 nopass

这里的client0可以替换成其他名称。

4.6. 生成客户端配置

1
2
3
docker run --rm -it \
-v $OVPN_DATA:/etc/openvpn \
kylemanna/openvpn:2.4 ovpn_getclient client0 > client0.ovpn

4.7. 开启防火墙

在公有云防火墙或者安全组管理页面,放开1194端口的UDP协议。

4.8. OpenVPN Server日志

1
docker logs -f openvpn

监听日志变化,测试客户端接入时。

5. OpenVPN Server自定义配置

5.1. 自定义配置说明

自定义配置,需要修改 openvpn.conf 配置,然后重启openvpn server。

参考文档:

5.2. 添加路由规则

让客户端自动添加路由规则:

1
2
client-to-client
push "route 192.168.56.0 255.255.255.0"

5.3. 修改默认网关

让客户端修改默认网关,所有流量都走vpn:

1
push "redirect-gateway def1"

5.4. 修改DNS

当使用 redirect-gateway 时,客户端将通过VPN路由DNS查询,VPN服务器将需要处理这些查询。
这时可以通过将DNS服务器地址推送到连接的客户端来实现,这些客户端将在VPN激活期间替换其正常的DNS服务器设置。

1
push "dhcp-option DNS 10.8.0.1"

6. MacOS安装使用OpenVPN Client

6.1. 安装

OpenVPN Client有很多,这里选择使用OpenVPN官方Client - OpenVPN Connect
版本选择OpenVPN Connect v3,下载安装即可。

6.2. 使用

打开OpenVPN Connect v3 -> File -> BROWSE
-> 选择client0.ovpn -> 选择OpenVPN Server点击启动

当按钮变绿,显示CONNECTED,表明连接成功,右上角日志可以查看到更详细信息。
同时OpenVPN Server日志中也会出现新的客户端连接信息。

6.3. 查看网络配置

1
2
ifconfig | grep 192
netstat -r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  ~ ifconfig | grep 192
inet 192.168.199.141 netmask 0xffffff00 broadcast 192.168.199.255
inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
inet 192.168.255.6 --> 192.168.255.5 netmask 0xfffffffc
➜ ~ netstat -r
Routing tables

Internet:
Destination Gateway Flags Netif Expire
0/1 192.168.255.5 UGSc utun2
default 192.168.199.1 UGSc en0
8.136.13.58/32 192.168.199.1 UGSc en0
128.0/1 192.168.255.5 UGSc utun2
192.168.255.1/32 192.168.255.5 UGSc utun2
192.168.255.4/30 192.168.255.6 UGSc utun2
192.168.255.5 192.168.255.6 UHr utun2
192.168.56.0/24 192.168.255.5 UGSc utun2

可以看到,本机新增了一个 192.168.255.6 的IP,网关是 192.168.255.5 ,使用的网卡设备是隧道utun2。

6.4. 测试连通性

1
ping 172.17.12.85

ping OpenVPN Server 的内网IP,网络畅通。

7. Linux安装使用OpenVPN Client

7.1. 安装

参考文档:

Debian/Ubuntu:

1
2
3
4
5
apt install apt-transport-https
curl -fsSL https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/openvpn-repo-pkg-keyring.gpg
curl -fsSL https://swupdate.openvpn.net/community/openvpn3/repos/openvpn3-$DISTRO.list >/etc/apt/sources.list.d/openvpn3.list
apt update
apt install openvpn3

CentOS:

1
2
3
yum install yum-plugin-copr
yum copr enable dsommers/openvpn3
yum install openvpn3-client

7.2. 使用

1、启动OpenVPN Client

1
openvpn3 session-start --config client0.ovpn

输入用户名密码,即可连接到OpenVPN Server。

2、重启OpenVPN Client

1
2
3
4
5
ps -ef | grep openvpn
openvpn3 sessions-list
openvpn3 session-manage --config client0.ovpn --restart
# or
openvpn3 session-manage --config --session-path /net/openvpn/v3/sessions/45aea145s8fb7s4143sa23as933981fb09d3 --restart

3、关闭OpenVPN Client

1
2
3
openvpn3 session-manage --config client0.ovpn --disconnect
# or
openvpn3 session-manage --config --session-path /net/openvpn/v3/sessions/45aea145s8fb7s4143sa23as933981fb09d3 --disconnect

7.3. 查看网络配置

1
route -n

8. OpenVPN Client自定义配置

8.1. 自定义配置说明

默认情况下,client会获取server配置中push的所有配置。
但是某些情况下,我们可能需要自定义route、gateway、dns,此时就需要修改client配置。

自定义client配置的方法是修改 client0.ovpn 配置文件,然后重新加载。

参考文档:

8.2. 自定义路由规则

1
2
3
route-nopull
route 192.168.56.0 255.255.255.0 vpn_gateway
route 172.16.0.0 255.255.0.0 vpn_gateway

8.3. 自定义网关配置

不修改默认网关。

1
pull-filter ignore redirect-gateway

8.4. 自定义DNS

1
2
dhcp-option DNS 114.114.114.114
dhcp-option DNS 8.8.8.8

9. OpenVPN vs IPsec

OpenVPN和IPsec都是VPN协议,但是安全性和用途不同。

OpenVPN是一种高度可配置的开源协议,可以使用各种端口和加密方法。它是最安全的VPN协议之一,并通过了许多第三方安全审计。一般需要自行安装。适合用于 client-to-site 的连接,例如远程办公。

IPSec(Internet Security Protocol)是一套安全的协议,可确保数据包的身份验证和加密,以通过互联网协议(IP)网络在两个端点之间提供受保护的通信。常内置在网关设备中,也可以自行安装。适合用于 site-to-site 的连接,例如打通多个独立的网络(内网和内网、办公网和内网等)。安全性不如OpenVPN,但是速度通常比OpenVPN要更快。

参考文档:

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-docker-openvpn/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~