目录

Linux操作系统-debian12部署openvpn

debian12 部署 openvpn.

动机

本次部署 openvpn 采用 debian12 ,并采用 openldap 做用户验证,为了方便以后翻出来使用,故此记录部署过程。

优化

内核优化,开启 ipv4 转发,略。

步骤

初始化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装必要的包。
apt -y install openvpn easy-rsa iptables openvpn-auth-ldap
cd /usr/share/easy-rsa

# 初始化。
./easyrsa init-pki

# 创建 ca 证书并设置证书相关信息。
./easyrsa build-ca

# 创建服务器端的证书,名字随意,我们这里是 server1 。
./easyrsa build-server-full server1 nopass

# 创建客户端的证书,名字随意,我们这里是 client1 。
./easyrsa build-client-full client1 nopass

# 生成 dh 文件。
./easyrsa gen-dh

# 创建 ta 证书。
openvpn --genkey secret ./pki/ta.key

# 拷贝证书到 openvpn 安装目录。
cp -pR /usr/share/easy-rsa/pki/{issued,private,ca.crt,dh.pem,ta.key} /etc/openvpn/server/

服务端配置

生成 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
vi /etc/openvpn/server/server.conf

local 0.0.0.0
port 2294
proto tcp
comp-lzo
dev tun
ca ca.crt
cert issued/server1.crt
key private/server1.key
dh dh.pem
# openvpn分配给客户端的网段,自行做好ip网段规划,防止冲突
server 192.168.100.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 8.138.xxx.xxx 255.255.255.255"
keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1
plugin /usr/lib/openvpn/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf cn=%u"
verify-client-cert none

生成 ldap 配置文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cd  /etc/openvpn/
mkdir auth

vim auth/ldap.conf

<LDAP>
	URL		ldap://xxx:389
	BindDN		cn=admin,dc=xxx,dc=com
	Password	xxx
	Timeout		15
	TLSEnable	no
	FollowReferrals no
</LDAP>
<Authorization>
	BaseDN		"cn=广州总部,ou=users,dc=xxx,dc=com"
	SearchFilter	"(&(cn=%u))"
	RequireGroup	false
	<Group>
		BaseDN		"ou=groups,dc=xxx,dc=com"
		SearchFilter	"(cn=devops)"
		MemberAttribute	member
	</Group>
</Authorization>

编辑 /lib/systemd/system/[email protected]

1
2
3
4
5
# 添加启停脚本,开启nat和ip转发规则的。
[Service]
...
ExecStartPost=/etc/openvpn/server/add-bridge.sh
ExecStopPost=/etc/openvpn/server/remove-bridge.sh

启动脚本 /etc/openvpn/server/add-bridge.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash

# network interface which can connect to local network
IF=enp1s0
# interface VPN tunnel uses
# for the case of this example like specifying [tun] on the config, generally this param is [tun0]
VPNIF=tun0

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i ${VPNIF} -j ACCEPT
iptables -t nat -A POSTROUTING -o ${IF} -j MASQUERADE

停止脚本 /etc/openvpn/server/remove-bridge.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash

# network interface which can connect to local network
IF=enp1s0
# interface VPN tunnel uses
# for the case of this example like specifying [tun] on the config, generally this param is [tun0]
VPNIF=tun0

echo 0 > /proc/sys/net/ipv4/ip_forward
iptables -D FORWARD -i  ${VPNIF} -j ACCEPT
iptables -t nat -D POSTROUTING -o ${IF} -j MASQUERADE

systemctl daemon-reload

systemctl restart openvpn-server@server

客户端配置

配置文件内容如下,客户端导入即可。

 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
client
dev tun
# 服务器端tcp还是udp自行根据情况决定
proto tcp
remote 183.6.xxx.xxx 2294

resolv-retry infinite
nobind
auth-nocache
persist-key
persist-tun
key-direction 1
comp-lzo
verb 3
resolv-retry 30
connect-timeout 10
remote-cert-tls server
# 使用密码验证只需提供<ca></ca>这一块内容就ok了
<ca>
-----BEGIN CERTIFICATE-----
MIIDRTCCAi2gAwIBAgIUWhQ4FIIl9/uWIR5a3RF67iDbRdUwDQYJKoZIhvcNAQEL
BQAwFDESMBAGA1UEAwwJU2VydmVyLUNBMB4XDTI0MDkxMDEwMzgwNloXDTM0MDkw
ODEwMzgwNlowFDESMBAGA1UEAwwJU2VydmVyLUNBMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAoBpt...
-----END CERTIFICATE-----
</ca>

auth-user-pass
cipher AES-256-CBC

收尾

如果服务器没有公网ip,还需要在入口路由那做一层 dnat 映射,具体自行配置,不同公司不同设备,一笔带过。