Featured image of post OpenVPN简单配置

OpenVPN简单配置

远程VPS上搭建OpenVPN服务器组内网和**

前言

服务器一直闲着,除了搞个游戏联机服务器,偶尔泡泡程序,运行网站,想着再试试搞个VPN服务器试试,刚好注意到了OpenVPN,就试试看。

环境

  • 服务端:Debian 11
  • 测试客户端:Windows 11

配置

1. 安装OpenVPN客户端(window为例)

下载地址 点击下载安装即可。 1

2. OpenVPN客户端使用

2

将VPN服务提供者提供的.ovpn文件导入客户端,点击连接即可。

3. 安装OpenVPN服务端(Debian为例)

1
2
sudo apt update
sudo apt install openvpn

4. 生成主证书颁发机构 (CA) 证书和密钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#使用easy-rsa工具生成CA证书和密钥
sudo apt install easy-rsa
# 新建文件夹保存证书
mkdir -p /etc/openvpn/certs
# 复制easy-rsa工具到/etc/openvpn/certs
cp -r /usr/share/easy-rsa/[版本号]/ /etc/openvpn/certs
# 编辑vars配置
cp ./vars.example ./vars
sudo vim ./vars
# 修改如下内容
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Shanghai"
set_var EASYRSA_REQ_ORG "koten"
set_var EASYRSA_REQ_EMAIL "888888@qq.comm"

# 初始化CA
./easyrsa init-pki    #1、初始化,在当前目录创建PKI目录,用于存储整数

./easyrsa build-ca    #2、创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他提示内容直接回车即可

5. 生成server端和client端证书和密钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 生成server证书和密钥
./easyrsa gen-req server nopass    #1、生成server证书请求,nopass表示不设置密码
./easyrsa sign-req server server    #2、签发server证书,第一个server表示证书名称,第二个server表示证书类型
# 生成client证书和密钥
./easyrsa gen-req client1 nopass    #1、生成client证书请求,nopass表示不设置密码
./easyrsa sign-req client client1   #2、签发client证书,第一个client表示证书名称,第二个client表示证书类型
# 同理生成其他client证书和密钥

# 生成Diffie-Hellman密钥交换
./easyrsa gen-dh

# tls-auth 密钥
openvpn --genkey --secret ta.key

也可以简化合并生成签发证书

1
2
3
4
5
6
7
./easyrsa init-pki
./easyrsa build-ca   # 生成 CA
./easyrsa build-server-full server nopass   # 服务端证书
./easyrsa build-client-full clientA nopass  # 客户端 A
./easyrsa build-client-full clientB nopass  # 客户端 B
./easyrsa gen-dh
openvpn --genkey --secret ta.key
FilenameNeeded ByPurposeSecret
ca.crtserver + all clientsRoot CA certificateNO
ca.keykey signing machine onlyRoot CA keyYES
dh{n}.pemserver onlyDiffie Hellman parametersNO
server.crtserver onlyServer CertificateNO
server.keyserver onlyServer KeyYES
client1.crtclient1 onlyClient1 CertificateNO
client1.keyclient1 onlyClient1 KeyYES
client2.crtclient2 onlyClient2 CertificateNO
client2.keyclient2 onlyClient2 KeyYES
client3.crtclient3 onlyClient3 CertificateNO
client3.keyclient3 onlyClient3 KeyYES

6. 配置OpenVPN服务端

 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
31
sudo vim /etc/openvpn/server/server.conf
# 服务端 配置文件 server.conf

port 1194
proto udp
dev tun
#local 127.0.0.1

ca   /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key  /etc/openvpn/easy-rsa/pki/private/server.key
dh   /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/ta.key 0

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"

keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
client-to-client #允许客户端互相通信


user openvpn
group openvpn
status openvpn-status.log
verb 3

启动

1
2
3
4
5

sudo systemctl enable openvpn-server@server
sudo systemctl start openvpn-server@server

sudo systemctl status openvpn-server@server
  • 报错:
  1. 权限问题:

注意相关ca.crtserver.crtserver.keydh.pemta.key等文件的权限,确保OpenVPN服务有权限读取这些文件。

1
2
3
4
5
6
7
sudo chown -R root:root /etc/openvpn/easy-rsa/pki
sudo chmod 600 /etc/openvpn/easy-rsa/pki/private/server.key
sudo chmod 644 /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/easy-rsa/pki/issued/server.crt

sudo touch /var/log/openvpn-status.log
sudo chown openvpn:openvpn /var/log/openvpn-status.log
sudo chmod 644 /var/log/openvpn-status.log

仍然不行的话,去掉server.conf中的user openvpngroup openvpn,以root用户运行。

1
2
3
#注释掉
#user openvpn
#group openvpn
  1. 防火墙

记得设置服务器的防火墙,放行1194端口-udp

7. 配置OpenVPN客户端

  • 仅路由VPN内网流量,其他流量走本地网络,不影响互联网
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
client
dev tun
proto udp
remote [你的openvpn服务器ip] 1194

# resolv-retry infinite
nobind

persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3

ca   ca.crt
cert client_0.crt
key  client_0.key
tls-auth ta.key 1

route-nopull
route 10.8.0.0 255.255.255.0
  • 全部流量走VPN,实现**上网
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# client.ovpn
client
dev tun
proto udp
remote [你的openvpn服务器ip] 1194

resolv-retry infinite 
nobind

persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3

ca   ca.crt
cert client_0.crt
key  client_0.key
tls-auth ta.key 1

#route-nopull                 #取消注释以使用自定义路由
#route 10.8.0.0 255.255.255.0 #仅路由VPN内网流量,其他流量走本地网络,不影响互联网

之后在服务端执行

1
2
3
4
5
6
# iptables 做 SNAT/MASQUERADE(假设公网网口是 eth0,VPN 网段 10.8.0.0/24)
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE 
# 允许转发(参考规则,视你防火墙而定)
sudo iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT 

sudo iptables -A FORWARD -d 10.8.0.0/24 -i eth0 -m conntrack --ctstate ESTABLISHED -j ACCEPT

启动

client.ovpnca.crtclient_0.crtclient_0.keyta.key放到客户端的config目录下,打开OpenVPN GUI,右键点击托盘图标,选择导入配置文件,选择刚才的client.ovpn文件,导入成功后,点击连接即可。

  • 报错:
  1. 连接超时

可能被墙了,可以尝试用stunnel进行SSL隧道加密,见 8.使用 stunnel 进行 SSL 隧道加密

8. 使用 stunnel 进行 SSL 隧道加密

有时可能被墙了,或者不稳定,可以尝试用stunnel进行SSL隧道加密。

走 tcp 443 端口,伪装成 HTTPS 流量。

服务器端

1
sudo pacman -S stunnel

生成自签名证书

1
2
3
openssl req -new -x509 -days 3650 -nodes -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem

chmod 600 /etc/stunnel/stunnel.pem

编辑配置文件 /etc/stunnel/stunnel.conf

1
2
3
4
5
6
7
8
9
pid = /var/run/stunnel.pid
cert = /etc/stunnel/stunnel.pem
foreground = yes
[openvpn]
accept = 443          
# 对外提供 HTTPS 端口
connect = 127.0.0.1:1194   
# 转发到 OpenVPN 服务器端口
# 注释不能在行尾

启动 stunnel

放行防火墙443端口-tcp和1194端口-udp、tcp

1
2
3
4
5
6
7
8
9
# 测试
sudo stunnel /etc/stunnel/stunnel.conf

# 取消输出调试信息 stunnel.conf 中
foreground = no

# 设置开机启动
sudo systemctl enable stunnel
sudo systemctl start stunnel

修改 /etc/openvpn/server.confproto udpproto tcp 填写 local 127.0.0.1,重启 OpenVPN 服务

 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
port 1194
#proto udp
proto tcp
dev tun
local 127.0.0.1

ca   /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key  /etc/openvpn/easy-rsa/pki/private/server.key
dh   /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/ta.key 0

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"

keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
client-to-client #允许客户端互相通信

#user openvpn
#group openvpn
status openvpn-status.log
verb 3

客户端

下载并安装 stunnel for Windows

编辑配置文件 stunnel.conf

1
2
3
4
5
6
7
[openvpn]
client = yes
accept = 127.0.0.1:1194       
# 本地客户端连接端口
connect = [服务器ip]:443  
# 连接服务器 stunnel 的 HTTPS
CAfile = D:\bin\openvpn\pki\ca.crt

启动 stunnel

修改 client.ovpnproto udpproto tcpremote [你的openvpn服务器ip] 1194remote 127.0.0.1 1194

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
client
dev tun
proto tcp
remote 127.0.0.1 1194

# resolv-retry infinite
nobind

persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3

ca   ca.crt
cert client_0.crt
key  client_0.key
tls-auth ta.key 1

route-nopull
route 10.8.0.0 255.255.255.0

之后重启 OpenVPN GUI,重新连接即可。

  • 注意: 这种情况下 服务器只用放行443端口-tcp 客户端只用放443端口-tcp出站

  • 若报错tls,检查stunnel.conf中,指定 tls 版本

1
2
# 客户端和服务器端都修改配置文件指定版本
sslVersion = TLSv1.2

9. windows 防火墙放行

  1. 打开 控制面板 → 系统和安全 → Windows Defender 防火墙 → 高级设置。

  2. 在左边选择 入站规则 → 右侧点击 新建规则。

  3. 规则类型选择 自定义。

  4. 程序 → 选择 所有程序。

  5. 协议和端口 → 保持默认(所有)。

  6. 作用域:

本地 IP:保持默认。

远程 IP:添加 10.8.0.0/24。

  1. 操作 → 选择 允许连接。

  2. 配置文件 → 全选(域、专用、公用)。

  3. 名称 → 比如 Allow OpenVPN LAN。

潇洒人间一键仙
Built with Hugo
Theme Stack designed by Jimmy