最近在家里弄了一个Unraid玩玩,开了几个服务(如 Bitwarden、Jellyfin、aria2-with-ariang),平时在家里使用的比较多,出了家门想用就没办法使用了,就想弄一个能随时随地访问服务,又不发布在公网上的功能,想到的解决办法是使用VPN技术。因为家里使用的是电信宽带,无法申请公网IP地址,所以只能使用云服务器作为中转站,在网上查阅了很多资料,了解到OpenVPN既能实现VPN功能,又能进行加密传输,数据安全和数据传输都得到了保障,所以我开始找关于OpenVPN的技术文档,但却都没有一个详细的教程,最后通过自己摸索和部分技术文档实现了我所需要的功能,因此我写此教程即用于记录也希望能帮助其他人。
拓扑图
前提条件
1、云服务器,不限制云服务商但是必须要公网IP地址,且有最高权、能放行端口
2、家里有一台能安装OpenVPN Client客户端的路由器,我是用的是红米AC2100,刷的OpenWRT系统
3、远程使用的OpenVPN Client的客户端,比如手机、电脑
教程
1、使用Docker安装OpenVPN服务端
获取最新版本的 Docker 安装包
wget -qO- https://get.docker.com/ | sh
启动docker服务,验证docker信息,命令如下:
sudo service docker start docker version
拉取OpenVPN镜像到本地,并初始化docker容器
# 拉取OpenVPN的镜像 docker pull kylemanna/openvpn # 新建OpenVPN的工作目录 mkdir /etc/openvpn # 初始化容器以保存配置文件和证书。容器将提示用户输入一个密码以保护新生成的证书授权机构使用的私钥 # xx.xx.xx.xx为您服务器的公网IP地址 docker run -v /etc/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://xx.xx.xx.xx:1194 docker run -v /etc/openvpn:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
启动过程中需要输入证书密码和域名,请注意输入密码时不会显示任何信息;
启动OpenVPN Server进程,启动后可以输入 docker ps查看运行容器信息
docker run \ --name openvpn \ --restart=always \ --privileged=true \ -v /etc/openvpn/:/etc/openvpn \ -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \ -p 1194:1194/udp \ --cap-add=NET_ADMIN \ -d kylemanna/openvpn
2、配置OpenVPN服务端
修改/etc/openvpn.config配置文件如下:
server 192.168.255.0 255.255.255.0 verb 3 key /etc/openvpn/pki/private/192.168.175.128.key ca /etc/openvpn/pki/ca.crt cert /etc/openvpn/pki/issued/192.168.175.128.crt dh /etc/openvpn/pki/dh.pem tls-auth /etc/openvpn/pki/ta.key key-direction 0 keepalive 10 60 persist-key persist-tun proto udp # Rely on Docker to do port mapping, internally always 1194 port 1194 dev tun0 status /tmp/openvpn-status.log # VPN连接后分配的IP地址将记录在ipp.txt中,下次连接VPN继续使用此IP地址 ifconfig-pool-persist ipp.txt # 客户端互联 client-to-client # 客户端所在的局域网联通 client-config-dir /etc/openvpn/ccd user nobody group nogroup comp-lzo no ### Route Configurations Below route 192.168.254.0 255.255.255.0 ### Push Configurations Below push "block-outside-dns" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" push "comp-lzo no"
配置文件修改完成后,重新启动docker容器
# 先暂停openvpn容器 docker stop openvpn # 后启动openvpn容器 docker start openvpn
在 /etc/openvpn/ccd目录下, 为局域网的VPN网关创建配置文件,配置文件的文件名要和客户名相同。
我为家中路由器生成的证书名称为OpenWRT,内网网段为192.168.1.0/24,所以配置文件为:
vi ccd/OpenWRT # 键入i,在文件里添加路由信息 iroute 192.168.1.0 255.255.255.0 # 键入Esc,输入:wq 保存退出
3、配置OpenVPN客户端
生成带密码的客户端证书,作为电脑和手机的VPN证书,每次登录VPN时,都需要输入密码;
docker run -v /etc/openvpn/:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full client001 输入密码:******
生成不带密码的客户端证书,作为OpenWRT的VPN证书,VPN连接时不用输入密码;
docker run -v /etc/openvpn/:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full OpenWRT nopass
导出证书,并下载到本地
docker run -v /etc/openvpn/:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient client001 > /etc/openvpn/client001.ovpn docker run -v /etc/openvpn/:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient client001 > /etc/openvpn/OpenWRT.ovpn
修改client001.ovpn远程客户端证书,禁用默认路由,新增局域网192.168.1.0的路由和指向服务端的路由;
# redirect-gateway def1 route-nopull route 192.168.1.0 255.255.255.0 vpn_gateway route 192.168.255.0 255.255.255.0 vpn_gateway
修改OpenWRT.ovpn客户端证书,禁用默认路由,新增一条指向服务端的路由;
# redirect-gateway def1 route-nopull route 192.168.255.0 255.255.255.0 vpn_gateway
将OpenWRT.ovpn导入到家中路由器的OpenVPN客户端中,并启用;
将client001.ovpn导入到手机或者电脑的OpenVPN客户端中,点击连接并输入密码,等待连接完成后即可访问家中的服务。
参考资料
OpenVPN Docker搭建 - 简书 (jianshu.com)