OpenVPN主要配置

创建证书

安装openvpn和easy-rsa

apt update && apt install openvpn easy-rsa -y

创建证书目录

mkdir /etc/openvpn/easy-rsa/ && cd /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

修改证书环境

cp vars.example vars
vim vars
# 修改以下内容:
set_var EASYRSA_REQ_COUNTRY     "CN"
set_var EASYRSA_REQ_PROVINCE    "SH"
set_var EASYRSA_REQ_CITY        "ShangHai"
set_var EASYRSA_REQ_ORG         "OpenVPN OpenNW"
set_var EASYRSA_REQ_EMAIL       "opennw@opennw.cn"
set_var EASYRSA_REQ_OU          "OpenNW"

初始化公钥基础设施目录 pki​。

./easyrsa init-pki

创建CA证书和私钥

./easyrsa build-ca nopass

创建服务端证书和私钥

./easyrsa build-server-full server nopass

创建客户端证书和私钥,客户端名称随意,只要不冲突就行

./easyrsa build-client-full client nopass

生成 Diffie-Hellman​ 参数

./easyrsa gen-dh

复制刚才创建的证书到正确位置

cp pki/{ca.crt,dh.pem} /etc/openvpn/
cp pki/issued/server.crt /etc/openvpn/server/
cp pki/issued/client.crt /etc/openvpn/client/
cp pki/private/server.key /etc/openvpn/server/
cp pki/private/client.key /etc/openvpn/client/

服务端配置

复制一份服务器端配置示例

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
vim /etc/openvpn/server.conf
# 修改以下内容
port 4372
proto tcp
;proto udp
ca ca.crt
cert server/OpenVPN_CA.crt
key server/OpenVPN_CA.key
dh dh.pem
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 223.6.6.6"
client-to-client
duplicate-cn
log-append  /var/log/openvpn/openvpn.log
;explicit-exit-notify 1

重启服务端即可

systemcl retstar openvpn@server
systemcl status openvpn@server

​​

客户端配置

复制一份客户端配置示例

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
vim client.conf
# 修改以下内容
proto tcp
;proto udp

remote 192.168.10.131 4372

<ca>
# CA证书内容
</ca>

<cert>
# 客户端证书内容
</cert>

<key>
# 客户端私钥内容
</key>

将修改好的客户端文件更改后缀名为.ovpn​后发至客户端即可使用

配置NAT使得客户端可正常上网

使用iptables

iptables -t nat -I POSTROUTING -j MASQUERADE
iptables -t nat -I POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT

或使用nftables

table inet inet_filter {
        chain postrouting {
                type nat hook postrouting priority 100 ; policy accept;
                oif eth0 masquerade
                ct state { established, related } accept
        }
}