小白Docker搭建OpenVPN 5分钟快速上手

公司内部有些内部网站需要设置安全策略只允许固定ip访问,就想着搭建一个vpn服务器作为出口ip,然后需要限制ip的地方都添加vpn服务器ip进行放行(如果开发本地调试需要设置请求ip白名单的第三方接口,也可用这种办法来固定下出口ip)。

  • Debain12 + 宝塔V11.5
  • 宝塔已安装Docker(设置加速地址 https://docker.1ms.run 后重启Docker)
  • 云服务器、宝塔安全配置放行1194端口

1、在宝塔Docker应用中搜索openvpn并进行安装

2、修改镜像生成的.ovpn配置文件

增加禁止压缩配置 comp-lzo no 保存后,就可以下载下来给openvpn客户端使用了。

3、客户端导入.ovpn配置并连接

windows客户端打开软件后,在右下角托盘里面右键图标进行导入;导入成功后可进行【连接】。

连接成功托盘图标会变成绿色,如果连接失败请检查云服务器安全组、宝塔端口安全这些是否开放!

连接成功↓

上面安装完OpenVPN后已经有默认用户了,如果还要添加用户可以继续创建用户证书(每个人一个证书),先在宝塔后台确认下面截图的OVPN_DATA与OVPN_CONTAINER值脚本里面会用到

create_users.sh这个脚本会循环创建test1用户、test2用户(注意OVPN_DATA改成你实际的路径)。

#!/bin/bash
# create_users.sh
OVPN_DATA="/www/dk_project/dk_app/openvpn/openvpn_7emH/openvpn"
USERS="test1 test2"

for USER in $USERS; do
  echo "正在创建用户: $USER"
  
  # 生成客户端证书
  docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full $USER nopass
  
  # 导出配置文件
  docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient $USER > ${USER}.ovpn
  
  echo "用户 $USER 配置文件已生成: ${USER}.ovpn"
  echo "最终使用需要在各.ovpn配置文件的remote-cert-tls server所在下一行增加comp-lzo no以禁用压缩"
done

最终会生成.ovpn配置文件(记得增加禁止压缩配置comp-lzo no),将其分发给需要连接的客户端导入连接即可。

manage_openvpn.sh综合管理脚本(需修改OVPN_DATA、OVPN_CONTAINER),status这种方式 查看在线状态好像会有延时,客户端已经断开了还是会显示一段时间。这个脚本创建的用户.ovpn配置文件也需要手动添加配置comp-lzo no

#!/bin/bash
# OpenVPN 用户管理脚本

OVPN_DATA="/www/dk_project/dk_app/openvpn/openvpn_7emH/openvpn"
# OVPN_CONTAINER="openvpn"
OVPN_CONTAINER="q18qinzdjnximb"

case "$1" in
  list)
    echo "已创建的用户:"
    docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_listclients
    ;;
    
  add)
    if [ -z "$2" ]; then
      echo "使用方法: $0 add 用户名 [密码]"
      exit 1
    fi
    USER="$2"
    if [ -n "$3" ]; then
      docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full "$USER"
    else
      docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full "$USER" nopass
    fi
    docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient "$USER" > "${USER}.ovpn"
    echo "用户 $USER 已创建,配置文件: ${USER}.ovpn"
    ;;
    
  revoke)
    if [ -z "$2" ]; then
      echo "使用方法: $0 revoke 用户名"
      exit 1
    fi
    docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_revokeclient "$2" remove
    echo "用户 $2 访问权限已撤销"
    ;;
    
  status)
    echo "在线用户:"
    docker exec $OVPN_CONTAINER cat /tmp/openvpn-status.log 2>/dev/null || echo "状态文件不存在"
    ;;
    
  logs)
    docker logs -f $OVPN_CONTAINER
    ;;
    
  restart)
    docker restart $OVPN_CONTAINER
    ;;
    
  *)
    echo "使用方法: $0 {list|add|revoke|status|logs|restart}"
    echo "  list    - 列出所有用户"
    echo "  add     - 添加新用户"
    echo "  revoke  - 撤销用户访问"
    echo "  status  - 查看连接状态"
    echo "  logs    - 查看日志"
    echo "  restart - 重启服务"
    ;;
esac

发表评论