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 映射,具体自行配置,不同公司不同设备,一笔带过。