如果你的家庭路由器的WAN口上没有公网IP,但你想要在外地的时候访问家庭局域网,那么可以使用OpenVPN搭建虚拟专用网络
OpenVPN,基于client/server架构,分为工作在数据链路层的TAP模式和工作在网络层的TUN模式。具体工作原理请自行搜索
一、前置条件
二、生成私钥和证书 首先在VPS上安装OpenSSL,我这里用的操作系统是ubuntu
1 sudo apt install openssl libssl-dev
然后使用OpenSSL生成OpenVPN的客户端和服务器用于双向认证的TLS证书
在你的VPS上切换到一个空目录
生成CA的私钥和根证书 1 2 3 4 5 6 openssl genpkey -algorithm RSA -out CA.key -pkeyopt rsa_keygen_bits:2048 openssl req -new -key CA.key -out CA.csr openssl x509 -req -in CA.csr -signkey CA.key -out CA.crt -days 365
注意,这里生成的CA.key一定要严格保存,不能泄漏或丢失
生成服务器的私钥和证书 1 2 3 4 5 6 openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048 openssl req -new -key server.key -out server.csr openssl x509 -req -in server.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out server.crt -days 365
生成客户端的私钥和证书 1 2 3 4 5 6 openssl genpkey -algorithm RSA -out client1.key -pkeyopt rsa_keygen_bits:2048 openssl req -new -key client1.key -out client1.csr openssl x509 -req -in client1.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out client1.crt -days 365
1 2 3 4 5 6 openssl genpkey -algorithm RSA -out client2.key -pkeyopt rsa_keygen_bits:2048 openssl req -new -key client2.key -out client2.csr openssl x509 -req -in client2.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out client2.crt -days 365
生成Diffie-Hellman参数文件 1 openssl dhparam -out DH2048.pem 2048
至此,整个目录下应该有10个文件
CA.key、CA.csr、CA.crt
server.key、server.csr、server.crt
client1.key、client1.csr、client1.crt
client2.key、client2.csr、client2.crt
DH2048.pem
三、VPS上的服务器配置 首先在VPS上使用apt安装openvpn
1 sudo apt install openvpn
安装好后,把上一步中生成的server.key、server.crt、CA.crt、DH2048.pem复制到VPS的目录/etc/openvpn/server
同时在/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 port xxx proto tcp dev tun ca /etc/openvpn/server/CA.crt cert /etc/openvpn/server/server.crt key /etc/openvpn/server/server.key dh /etc/openvpn/server/DH2048.pem topology subnet server 192.168.111.0 255.255.255.240 client-to-client ifconfig-pool-persist /etc/openvpn/server/ipp.txt keepalive 10 120 max-clients 10 status /var/log/OpenVPN/OpenVPNStatus.log log /var/log/OpenVPN/OpenVPN.log verb 3 persist-key persist-tun cipher AES-256 -CBC verify-client-cert require
然后去你的VPS提供商那里配置防火墙,放行xxx端口
接着启动OpenVPN服务器
1 sudo systemctl restart openvpn-server@server.service
四、局域网内主机的客户端配置 首先在需要放入虚拟专用网络的局域网主机上安装OpenVPN,我这里局域网主机操作系统也是ubuntu
1 sudo apt install openvpn
将第二步生成的CA.crt、client1.key、client1.crt复制到/etc/openvpn/client目录下
然后将以下配置文件client1.conf上传到/etc/openvpn/client目录
1 2 3 4 5 6 7 8 9 10 11 12 client dev tun proto tcp remote 你的VPSIP 服务器监听的端口 ca /etc/openvpn/client/CA.crt cert /etc/openvpn/client/client1.crt key /etc/openvpn/client/client1.key cipher AES-256 -CBC verb 3 status /var/log/OpenVPN/OpenVPNStatus.log log /var/log/OpenVPN/OpenVPN.log keepalive 10 120
接着启动OpenVPN客户端
1 sudo systemctl restart openvpn-client@client1.service
如果客户端和服务器连接成功,双方都会生成一个tun0接口
双方都能互相PING通
五、外地笔记本的客户端配置 我们假设外地笔记本为windows系统
首先前往OpenVPN官网 下载windows客户端
安装好客户端后,一定要确保TAP-Windows Adapter V9 for OpenVPN Connect这个网络适配器存在且已启用
然后将第二步生成的client2.key、client2.crt、CA.crt复制到windows的某个目录
接着在该目录下创建配置文件client2.ovpn
1 2 3 4 5 6 7 8 9 10 client dev tun proto tcp remote 14.103.157.111 22993 ca "D:\\OpenVPN\\CA.crt" cert "D:\\OpenVPN\\client2.crt" key "D:\\OpenVPN\\client2.key" cipher AES-256 -CBC verb 3 keepalive 10 120
启动OpenVPN客户端,导入client2.ovpn
连接成功,分配的IP为192.168.111.3
此时PING下192.168.111.2,可以PING成功
浏览器访问下192.168.111.2上的nginx服务器,成功访问
六、添加更多局域网内主机 如果要添加更多局域网内主机到OpenVPN构建的虚拟专用网络,只用照着第二步通过OpenSSL生成客户端的私钥和证书client3.key、client3.csr、client3.crt,然后照着第三步配置即可
同时要注意客户端数量不要超过服务器配置文件server.conf里的max-clients上限