点击展开更新日志
源起
远程家中内网设备(电脑、NAS)的需求其实一直都有,之前是用的第三方软件的方案,主要是皎月连、UU远程,也用过todesk,然后就想着试试 VPN,所以先来看看 OpenVPN 吧。
部署环境
服务端:一台公网服务器做中转,生成证书密钥
客户端:Win、Android等,导入配置
服务端部署
安装OpenVPN及证书生成工具
1 2 3 4 5 6 sudo yum install epel-release -ysudo yum install openvpn easy-rsa -ysudo apt install openvpn easy-rsa
初始化PKI(公钥基础设施)并生成证书
使用Easy-RSA 3管理证书,它是一个专门为OpenVPN等OpenSSL项目设计的证书管理工具。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 make-cadir openvpn-ca/ cd openvpn-ca./easyrsa init-pki ./easyrsa build-ca ./easyrsa build-server-full server nopass ./easyrsa gen-dh openvpn --genkey --secret ta.key sudo cp pki/ca.crt pki/private/server.key pki/issued/server.crt pki/dh.pem ta.key /etc/openvpn/server/
启用Google Authenticator二次验证
安装Google Authenticator PAM模块
1 sudo apt install libpam-google-authenticator -y
为OpenVPN用户生成验证密钥
1 2 3 sudo useradd -m -s /bin/bash openvpnsudo su - openvpngoogle-authenticator
按照提示进行配置,配置项主要是:
使用基于时间的一次性密码令牌:y
更新 ~/.google_authenticator 文件:y
禁止重复使用同一个验证码:y
增加时间偏移量以应对时钟轻微不同步。默认前后一个令牌时间差:y
每30s限制登录失败3次:y
配置完成后会显示一个二维码 、密钥 、应急验证码 ,用手机Google Authenticator应用扫描二维码,并妥善保存应急验证码。
拷贝密钥位置
1 2 3 sudo mkdir /etc/openvpn/authsudo chown openvpn:openvpn -R /etc/openvpn/authsudo cp /home/openvpn/.google_authenticator /etc/openvpn/auth/
之所以要单独把 .google_authenticator 文件拎出来,是因为 OpenVPN 的systemd 文件中设置了 ProtectHome=true,不能修改 /home 目录(认证过程中会创建临时文件),安全起见不建议直接修改为 false,因此就需要移出来了。参考:Failed to read .google_authenticator for user, but permissions seem correct #211
配置PAM认证模块
1 sudo vim /etc/pam.d/openvpn
新增内容:
1 2 auth required pam_google_authenticator.so secret=/etc/openvpn/auth/.google_authenticator user=openvpn
1 2 3 4 5 6 Your emergency scratch codes are: 70240222 39865135 75304085 23085415 58981865
创建服务器配置文件
1 2 3 sudo mkdir -p /data/logs/openvpnsudo chmod 777 -R /data/logs/openvpnsudo vim /etc/openvpn/server/server.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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 port 51194 proto udp dev tun server 10.8.0.0 255.255.255.0 topology subnet ca ca.crt cert server.crt key server.key dh dh.pem tls-crypt ta.key cipher AES-256-CBC auth SHA256 user nobody group nobody push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" push "route 192.168.7.0 255.255.255.0" keepalive 10 120 persist-key persist-tun client-to-client max-clients 5 compress lz4-v2 push "compress lz4-v2" verb 3 explicit-exit-notify 1 status /data/logs/openvpn/openvpn-status.log log-append /data/logs/openvpn/openvpn.log push "cipher AES-256-CBC" script-security 1 plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn username-as-common-name
启动服务
客户端部署
生成客户端配置
回到服务器,为客户端生成证书:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 cd ~/openvpn-ca./easyrsa build-client-full client nopass cat > ~/make_config.sh <<'EOF' CA_DIR=~/openvpn-ca KEY_DIR=~/openvpn-ca/pki OUTPUT_DIR=~/client-configs BASE_CONFIG=~/base.conf cat ${BASE_CONFIG} \ <(echo -e '<ca>' ) \ ${KEY_DIR} /ca.crt \ <(echo -e '</ca>\n<cert>' ) \ ${KEY_DIR} /issued/${1} .crt \ <(echo -e '</cert>\n<key>' ) \ ${KEY_DIR} /private/${1} .key \ <(echo -e '</key>\n<tls-auth>' ) \ ${CA_DIR} /ta.key \ <(echo -e '</tls-auth>' ) \ > ${OUTPUT_DIR} /${1} .ovpn EOF cat > ~/base.conf <<'EOF' client dev tun proto udp remote YOUR_ALIYUN_PUBLIC_IP 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun remote-cert-tls server cipher AES-256-CBC auth SHA256 comp-lzo verb 3 auth-user-pass EOF mkdir -p ~/client-configschmod +x ~/make_config.sh./make_config.sh client
现在,你将在 ~/client-configs/ 目录下得到一个包含所有必要证书和密钥的 home-nas.ovpn 文件。这是最安全的分发方式,所有内容都已嵌入,无需额外传输证书文件。
参考文件:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 client dev tun proto udp remote <SERVER_HOST> 51194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun remote-cert-tls server cipher AES-256-CBC auth SHA256 compress lz4-v2 allow-compression yes verb 3 auth-user-pass <ca> -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- </ca> <cert> Certificate: ... -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- -----END PRIVATE KEY----- </key> <tls-crypt> -----BEGIN OpenVPN Static key V1----- -----END OpenVPN Static key V1----- </tls-crypt>
客户端配置
下载 OpenVPN 客户端,可以选择 OpenVPN Connect 或 OpenVPN GUI,Connect 是官方软件,GUI 是开源社区软件,至于有啥区别,我也不知道,诶嘿。
从客户端导入上面生成的 .ovpn 文件连接,账号是创建的 openvpn 系统用户,密码是6位的 OTP 密码。
排障
如果遇到服务启动失败或报错或认证失败等问题,提供几个排查思路:
sudo journalctl -xe
OpenVPN 打印的日志
/var/log/auth.log(ubuntu) 、/var/log/security(cent) 登录认证日志
/var/log/audit 审计日志