Docker搭建OpenVN

Docker搭建OpenVPN

准备好一台可被访问的机器,如ip为 172.16.100.241,并安装好Docker,可使用下面的yum源安装命令,并设置阿里云镜像加速

# CentOS yum源 如果使用的是其他系统可以找对应系统的安装命令
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl start docker
systemctl enable docker
echo '{"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]}' >> /etc/docker/daemon.json
systemctl restart docker.service
# 拉取openvpn镜像
docker pull kylemanna/openvpn:2.4

1.使用openvpn生成配置文件

mkdir -p /home/openvpn
docker run -v /home/openvpn:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_genconfig -u udp://172.16.100.241

执行完命令后可在目录/home/openvpn中看到相应的配置文件;

2.初始化密钥文件

docker run -v /home/openvpn:/etc/openvpn --rm -it kylemanna/openvpn:2.4 ovpn_initpki

执行过程中需要先设置ca密码(如123456),Common Name可不设置直接按回车继续,接着需要输入ca密码更新密钥库以及生成crl文件;

3.生成客户端证书

docker run -v /home/openvpn:/etc/openvpn --rm -it kylemanna/openvpn:2.4 easyrsa build-client-full openvpn-client nopass

其中openvpn-client为自定义名称,生成的过程需要输入ca密码;

4.导出客户端的配置文件openvpn-client.ovpn

docker run -v /home/openvpn:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_getclient openvpn-client > /home/openvpn/openvpn-client.ovpn

注意openvpn-client名称需与第三步生成时命名一致,此时生成的配置文件openvpn-client.ovpn即可用于客户端连接;

5.启动openvpn

docker run  -v /home/openvpn:/etc/openvpn -d -p 1194:1194/udp --restart=always --name openvpn --cap-add=NET_ADMIN --sysctl net.ipv6.conf.all.disable_ipv6=0 --sysctl net.ipv6.conf.default.forwarding=1 --sysctl net.ipv6.conf.all.forwarding=1  kylemanna/openvpn:2.4 

开放服务器上的UDP 1194端口

6.安装客户端

去官网下载客户端

将第4步获取到的openvpn-client.ovpn配置文件放入客户端安装目录下的config文件夹内进行连接

7.路由配置

目前vpn使用的是全局代理,可以使用路由配置指定特定网段通过vpn进行访问

在生成的openvpn-client.ovpn配置文件的最后注释转发内容,并添加如下内容

# 该行会将所有路由重定向到vpn 注释掉并写入自己的路由
# redirect-gateway def1

#不添加路由,也就是不会有任何网络请求走OpenVPN
route-nopull

#指定此网段才走VPN代理
route 10.0.8.0 255.255.255.0

8.配置密码登录

进入openvpn挂载的文件目录下,在openvpn.conf文件内新增下面的内容

### Password config
#客户端不进行证书认证,如果不加将实现证书和用户密码双重认证 建议注释,使用双重认证更安全
client-cert-not-required

#用户和密码验证脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env

#使用用户名密码登录认证
username-as-common-name

#脚本安全级别
script-security 3

创建脚本和用户密码文件

# 在挂载目录下创建checkpsw.sh文件
vim /home/openvpn/checkpsw.sh

#!/bin/bash
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.

# 用户与密码配置文件 这里是容器内的地址
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`

###########################################################

if [ ! -r "${PASSFILE}" ]; then
    echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >>  ${LOG_FILE}
    exit 1
fi

CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
    echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
    exit 1
fi

if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
    echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
    exit 0
fi

echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1

添加执行权限

chmod +x /home/openvpn/checkpsw.sh

添加用户密码文件,格式:一行对应一个用户

vim /home/openvpn/psw-file

test1 123456
test2 123456

修改权限

chmod 777 /home/openvpn/psw-file

重启容器

docker restart openvpn

在客户端配置文件openvpn-client.ovpn添加内容

# 密码校验
auth-user-pass

这时客户端重新连接会弹出账户密码框,输入配置的用户与密码即可连接


参考链接


  1. Centos7使用docker搭建openvpn ↩︎

  2. OpenVPN配置代理路由(非全局代理) ↩︎

  3. 使用OpenVPN禁用全局路由 ↩︎

  4. OpenVPN 基于用户密码方式认证 ↩︎

posted @   CooperYe  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示