skip to content
Logo 三七の小站

通过 docker 部署 OpenVPN

/ 4 min read

1. 服务端启动脚本

进入目录创建脚本

Terminal window
mkdir ./openvpn
cd openvpn
nano start.sh

将下面代码填入

#!/bin/bash
echo "输入服务端IP或者域名"
read NODE_HOST
echo "输入配置文件目录/绝对路径"
read CONF_PWD
#生成配置文件和私钥文件
docker run -v $CONF_PWD:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://$NODE_HOST
docker run -v $CONF_PWD:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
#启动
cat <<EOF > ./docker-compose.yaml
version: "3"
services:
openvpn:
image: kylemanna/openvpn
container_name: openvpn
volumes:
- $CONF_PWD:/etc/openvpn
ports:
- "1194:1194"
cap_add:
- NET_ADMIN
EOF
docker-compose up -d

启动脚本

Terminal window
sh start.sh
#输入IP和路径后
#第一个选项是输入密码
#第二个是重复输入密码
#第三个任意
#第四个是输入第一次的密码
#第五个是输入第一次的密码

2. 创建用户

创建脚本

Terminal window
nano create_user.sh

填入

#!/bin/bash
#创建用户
echo "输入创建的用户名"
read USER
echo "输入配置文件地址/绝对路径"
read CONF_PWD
docker run -v $CONF_PWD:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full $USER nopass
docker run -v $CONF_PWD:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient $USER > ./$USER.ovpn
#添加链接配置
echo 'comp-lzo no' >> ./$USER.ovpn

启动脚本

Terminal window
sh create_user.sh

目录下生成配置文件USER.ovpn , 将配置文件导入客户端即可

3. 客户端通过服务端访问网络

Terminal window
# 客户端需要设置静态路由,以便所有流量都通过OpenVPN隧道
# 例如在Windows上,假设192.168.255.6为虚拟IP
route add 0.0.0.0 mask 0.0.0.0 192.168.255.6 metric 1
# 在服务端设置端口转发和网络转发规则
# 编辑系统配置文件以启用IP转发
nano /etc/sysctl.conf
# 添加以下行
net.ipv4.ip_forward = 1
# 运行以下命令使更改生效
sysctl -p
# 设置NAT表的POSTROUTING规则,以便将从eth0接口发出的数据包的源地址转换为公共IP地址
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 如果你的网络中有其他特定需求,例如使用UPnP或端口映射,可以进一步配置
# 例如,将内部IP的端口映射到外部IP
ip route add 192.168.255.0/24 via 172.18.0.2 #openvpn容器的IP
iptables -t nat -A PREROUTING -p tcp --dport 37376 -j DNAT --to-destination 192.168.255.6:37376
iptables -t nat -A POSTROUTING -p tcp --dport 37376 -j SNAT --to-source 104.233.210.38
# 登入OpenVPN容器,设置IP转发及NAT规则
docker exec -it openvpn bash
net.ipv4.ip_forward = 1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 更多的端口转发规则,如果需要
iptables -t nat -A PREROUTING -p tcp --dport 50010 -j DNAT --to-destination 192.168.255.6:50010
iptables -t nat -A POSTROUTING -p tcp --dport 37376 -j SNAT --to-source 104.233.210.38
# 如果有需要,可以添加更多静态路由规则
sudo route add -net 192.168.36.0/24 gw 192.168.255.6
route add -net 192.168.255.0/24 gw 172.18.0.1
# 删除不需要的路由规则
route del -net 192.168.36.0/24 gw 172.18.0.1
route add -net 192.168.255.0/24 gw 172.18.0.1
route del -net 192.168.36.0/24 gw 172.18.0.1

4. OpenVPN

服务端要设置推送路由 ,让客户端访问这些 ip/ip 段 来找服务端

同时服务端要设置静态路由,告诉服务端,对应的 ip/ip 段,要去哪个虚拟 ip(客户端路由)