
openvpn基于docker部署。
#!/bin/bash
set -e # 遇到错误立即退出
# ====================== 可自定义变量(修改这里!)======================
CONFIG_DIR="/data/openvpn" # OpenVPN 配置目录
PUBLIC_IP="47.109.91.216" # 你的服务器公网IP
PROTO="udp" # 协议(可选:udp/tcp)
PORT="1194" # 监听端口
# =====================================================================
# 颜色输出函数(方便看执行状态)
red(){ echo -e "\033[31m$1\033[0m"; }
green(){ echo -e "\033[32m$1\033[0m"; }
yellow(){ echo -e "\033[33m$1\033[0m"; }
blue(){ echo -e "\033[34m$1\033[0m"; }
# 1. 检查基础依赖
green "===== 1. 检查基础依赖 ====="
if ! command -v docker &>/dev/null; then
red "错误:未安装 Docker!请先安装 Docker 后再执行脚本"
exit 1
fi
green "✅ Docker 已安装,继续执行..."
# 2. 清理旧容器
green "===== 2. 清理旧 OpenVPN 容器 ====="
if docker ps -a | grep -q "openvpn-server"; then
yellow "检测到旧容器,正在停止并删除..."
docker stop openvpn-server &>/dev/null || true
docker rm openvpn-server &>/dev/null || true
fi
green "✅ 旧容器清理完成"
# 3. 强制创建/清空配置目录(无备份,直接清空)
green "===== 3. 初始化配置目录 ${CONFIG_DIR} ====="
if [ -d "$CONFIG_DIR" ]; then
yellow "配置目录已存在,正在清空所有内容..."
rm -rf "${CONFIG_DIR:?}"/* # :? 防止CONFIG_DIR为空时误删根目录
else
yellow "配置目录不存在,正在创建..."
mkdir -p "$CONFIG_DIR"
fi
cd "$CONFIG_DIR" || { red "❌ 进入 ${CONFIG_DIR} 失败!"; exit 1; }
green "✅ 配置目录初始化完成:${CONFIG_DIR}"
# 4. 生成 OpenVPN 基础配置
green "===== 4. 生成 OpenVPN 核心配置 ====="
docker run -v "$PWD:/etc/openvpn" --rm kylemanna/openvpn ovpn_genconfig -u "${PROTO}://${PUBLIC_IP}:${PORT}" -s 10.8.0.0/24
green "✅ 基础配置生成完成(协议:${PROTO},端口:${PORT},公网IP:${PUBLIC_IP})"
# 5. 手动初始化 CA 证书(给出清晰操作提示)
green "===== 5. 手动初始化 CA 证书(关键步骤!)====="
blue "⚠️ 接下来会进入 CA 证书创建界面,请按以下提示操作:"
blue " 1. 输入你想设置的 CA 根证书密码(建议复杂,务必记住)"
blue " 2. 再次输入密码确认"
blue " 3. 后续所有提示(国家/省份/通用名等)直接按回车使用默认值即可"
read -p "✅ 确认已阅读提示,按回车键开始创建 CA 证书..." -n1 -s
echo -e "\n"
# 执行 CA 初始化(纯手动,无自动输入)
docker run -v "$PWD:/etc/openvpn" --rm -it kylemanna/openvpn ovpn_initpki
green "✅ CA 证书初始化完成(请妥善保存你的 CA 密码!)"
# 6. 宿主机永久开启 IP 转发
green "===== 6. 开启宿主机 IP 转发 ====="
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
if ! grep -q "^net.ipv4.ip_forward = 1" /etc/sysctl.conf; then
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
fi
sysctl -p &>/dev/null
green "✅ IP 转发已永久开启(服务器重启后仍有效)"
# 7. 启动 OpenVPN 容器(host 模式)
green "===== 7. 启动 OpenVPN 容器 ====="
docker run -d \
--name openvpn-server \
--restart=always \
--privileged \
--network=host \
-v "${CONFIG_DIR}:/etc/openvpn" \
kylemanna/openvpn
# 8. 验证部署结果
green "===== 8. 验证部署结果 ====="
sleep 3 # 等待容器完全启动
if docker ps | grep -q "openvpn-server"; then
green "🎉 OpenVPN 一键部署成功!"
green "📌 部署信息:"
echo " - 配置目录:${CONFIG_DIR}"
echo " - 监听地址:${PROTO}://${PUBLIC_IP}:${PORT}"
echo " - 容器名称:openvpn-server"
echo " - 隧道网段:10.8.0.0/24"
green "📌 生成客户端证书请执行:"
echo " cd ${CONFIG_DIR}"
echo " docker run -v \$PWD:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full 用户名 nopass"
echo " docker run -v \$PWD:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient 用户名 > ${CONFIG_DIR}/用户名.ovpn"
else
red "❌ OpenVPN 部署失败!容器未启动"
red "📌 查看错误日志:docker logs openvpn-server"
exit 1
fi