混合云自建V-P-N

参考:

https://yq.aliyun.com/articles/504348?spm=a2c4e.11153940.blogcont434405.27.300e35b1Inhu7M#4

docker VPN 服务器

## 网站:
https://github.com/hwdsl2/docker-ipsec-vpn-server

安装docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14

cat >/etc/yum.repos.d/docker.repo <<EOF

##https://download.docker.com/linux/centos/
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://download-stage.docker.com/linux/centos/7/\$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download-stage.docker.com/linux/centos/gpg

EOF

yum install docker-ce

docker 镜像

systemctl start docker

## 预构建的可信任镜像
docker pull hwdsl2/ipsec-vpn-server

运行 IPsec VPN 服务器

## 环境变量,可选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

cat > /etc/vpn.env <<EOF

# Define your own values for these variables
# - DO NOT put "" or '' around values, or add space around =
# - DO NOT use these special characters within values: \ " '
# 注: 在你的 env 文件中,不要为变量值添加 "" 或者 '',或在 = 两边添加空格。不要在值中使用这些字符: \ " '。

# IPsec PSK (预共享密钥)
VPN_IPSEC_PSK=your_ipsec_pre_shared_key

# VPN 用户名和密码
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password

EOF

加载 IPsec af_key 内核模块

## 重要: 首先需要在 Docker 主机上加载 IPsec af_key 内核模块:
modprobe af_key

## 为保证系统启动加载,systemd-modules-load.service会自动加载配置文件

cat > /etc/modules-load.d/af_key.conf <<EOF
# Load af_key.ko at boot
af_key

EOF

使用镜像创建一个新的 Docker 容器

(将 ./vpn.env 替换为你自己的 env 文件):

docker run \
    --name ipsec-vpn-server \
    --env-file /etc/vpn.env \
    --restart=always \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -v /lib/modules:/lib/modules:ro \
    -d --privileged \
    hwdsl2/ipsec-vpn-server

获取 VPN 登录信息

docker logs ipsec-vpn-server

## 在命令输出中查找这些行:

Connect to your new VPN with these details:

Server IP: 你的VPN服务器IP
IPsec PSK: 你的IPsec预共享密钥
Username: 你的VPN用户名
Password: 你的VPN密码

(可选步骤) 备份自动生成的 VPN 登录信息(如果有)到当前目录:

docker cp ipsec-vpn-server:/opt/src/vpn-gen.env ./

查看服务器状态

## 如需查看你的 IPsec VPN 服务器状态,可以在容器中运行 ipsec status 命令:

docker exec -it ipsec-vpn-server ipsec status

## 或者查看当前已建立的 VPN 连接:

docker exec -it ipsec-vpn-server ipsec whack --trafficstatus

提示:

Windows 用户 在首次连接之前需要修改注册表,以解决 VPN 服务器 和/或 客户端与 NAT(比如家用路由器)的兼容问题。

同一个 VPN 账户可以在你的多个设备上使用。但是由于 IPsec/L2TP 的局限性,如果需要同时连接在同一个 NAT (比如家用路由器)后面的多个设备到 VPN 服务器,你必须仅使用 IPsec/XAuth 模式。

对于有外部防火墙的服务器(比如 EC2/GCE),请为 VPN 打开 UDP 端口 500 和 4500。

在编辑任何 VPN 配置文件之前,你必须首先在正在运行的 Docker 容器中 开始一个 Bash 会话。

如果需要添加,修改或者删除 VPN 用户账户,请参见 管理 VPN 用户。重要: 在编辑完 VPN 配置文件之后,你还必须注释掉脚本 /opt/src/run.sh 中的相应部分,以避免你的更改在容器重启后丢失。

在 VPN 已连接时,客户端配置为使用 Google Public DNS。如果偏好其它的域名解析服务,请编辑 /opt/src/run.sh 并将 8.8.8.8 和 8.8.4.4 替换为你的新服务器。然后重启 Docker 容器。

高级用法

1. 从源代码构建

    高级用户可以从 GitHub 下载并自行编译源代码:

    git clone https://github.com/hwdsl2/docker-ipsec-vpn-server.git
    cd docker-ipsec-vpn-server
    docker build -t hwdsl2/ipsec-vpn-server .

    若不需要改动源码,也可以这样:

    docker build -t hwdsl2/ipsec-vpn-server github.com/hwdsl2/docker-ipsec-vpn-server.git


2. 在容器中运行 Bash shell

    在正在运行的 Docker 容器中开始一个 Bash 会话:

    docker exec -it ipsec-vpn-server env TERM=xterm bash -l

    (可选步骤) 安装 vim 编辑器:

    apt-get update && apt-get -y install vim

    然后在容器中运行你的命令。完成后退出并重启 Docker 容器 (如果需要):

    exit
    docker restart ipsec-vpn-server



3. 启用 Libreswan 日志

    为了保持较小的 Docker 镜像,Libreswan (IPsec) 日志默认未开启。如果你是高级用户,并且需要启用它以便进行故障排除,首先在正在运行的 Docker 容器中开始一个 Bash 会话:

    docker exec -it ipsec-vpn-server env TERM=xterm bash -l

    然后运行以下命令:

    apt-get update && apt-get -y install rsyslog
    service rsyslog restart
    service ipsec restart
    sed -i '/modprobe/a service rsyslog restart' /opt/src/run.sh
    exit

    完成后你可以这样查看 Libreswan 日志:

    docker exec -it ipsec-vpn-server grep pluto /var/log/auth.log

技术细节

需要运行以下两个服务: Libreswan (pluto) 提供 IPsec VPN, xl2tpd 提供 L2TP 支持。

默认的 IPsec 配置支持以下协议:

    IKEv1 with PSK and XAuth ("Cisco IPsec")
    IPsec/L2TP with PSK

为使 VPN 服务器正常工作,将会打开以下端口:

    4500/udp and 500/udp for IPsec

配置 IPsec/XAuth (“Cisco IPsec”) VPN 客户端

https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md#windows-%E9%94%99%E8%AF%AF-809

Windows

注: 你也可以使用 IPsec/L2TP 模式 连接,无需安装额外的软件。

    下载并安装免费的 Shrew Soft VPN 客户端。
    https://www.shrew.net/download/vpn
    注: 该 VPN 客户端支持 Windows 2K/XP/Vista/7/8 系统。
    单击开始菜单 -> 所有程序 -> ShrewSoft VPN Client -> VPN Access Manager
    单击工具栏中的 Add (+) 按钮。
    在 Host Name or IP Address 字段中输入你的 VPN 服务器 IP。
    单击 Authentication 选项卡,从 Authentication Method 下拉菜单中选择 Mutual PSK + XAuth。
    在 Local Identity 子选项卡中,从 Identification Type 下拉菜单中选择 IP Address。
    单击 Credentials 子选项卡,并在 Pre Shared Key 字段中输入你的 VPN IPsec PSK。
    单击 Phase 1 选项卡,从 Exchange Type 下拉菜单中选择 main。
    单击 Phase 2 选项卡,从 HMAC Algorithm 下拉菜单中选择 sha1。
    单击 Save 保存 VPN 连接的详细信息。
    选择新添加的 VPN 连接。单击工具栏中的 Connect 按钮。
    在 Username 字段中输入你的 VPN 用户名。
    在 Password 字段中输入你的 VPN 密码。
    单击 Connect。

VPN 连接成功后,你会在 VPN Connect 状态窗口中看到 tunnel enabled 字样。单击 "Network" 选项卡,并确认 Established - 1 显示在 "Security Associations" 下面。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。

如果在连接过程中遇到错误,请参见 故障排除。
OS X

    打开系统偏好设置并转到网络部分。
    在窗口左下角单击 + 按钮。
    从 接口 下拉菜单选择 VPN。
    从 VPN类型 下拉菜单选择 Cisco IPSec。
    在 服务名称 字段中输入任意内容。
    单击 创建。
    在 服务器地址 字段中输入你的 VPN 服务器 IP。
    在 帐户名称 字段中输入你的 VPN 用户名。
    在 密码 字段中输入你的 VPN 密码。
    单击 鉴定设置 按钮。
    在 机器鉴定 部分,选择 共享的密钥 单选按钮,然后输入你的 VPN IPsec PSK。
    保持 群组名称 字段空白。
    单击 好。
    选中 在菜单栏中显示 VPN 状态 复选框。
    单击 应用 保存VPN连接信息。

要连接到 VPN: 使用菜单栏中的图标,或者打开系统偏好设置的网络部分,选择 VPN 并单击 连接。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。
Android

    启动 设置 应用程序。
    在 无线和网络 部分单击 更多...。
    单击 VPN。
    单击 添加VPN配置文件 或窗口右上角的 +。
    在 名称 字段中输入任意内容。
    在 类型 下拉菜单选择 IPSec Xauth PSK。
    在 服务器地址 字段中输入你的 VPN 服务器 IP。
    保持 IPSec 标识符 字段空白。
    在 IPSec 预共享密钥 字段中输入你的 VPN IPsec PSK。
    单击 保存。
    单击新的VPN连接。
    在 用户名 字段中输入你的 VPN 用户名。
    在 密码 字段中输入你的 VPN 密码。
    选中 保存帐户信息 复选框。
    单击 连接。

VPN 连接成功后,会在通知栏显示图标。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。

如果在连接过程中遇到错误,请参见 故障排除。
iOS

    进入设置 -> 通用 -> VPN。
    单击 添加VPN配置...。
    单击 类型 。选择 IPSec 并返回。
    在 描述 字段中输入任意内容。
    在 服务器 字段中输入你的 VPN 服务器 IP。
    在 帐户 字段中输入你的 VPN 用户名。
    在 密码 字段中输入你的 VPN 密码。
    保持 群组名称 字段空白。
    在 密钥 字段中输入你的 VPN IPsec PSK。
    单击右上角的 存储。
    启用 VPN 连接。

VPN 连接成功后,会在通知栏显示图标。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP。

故障排除

Windows 错误 809

    无法建立计算机与 VPN 服务器之间的网络连接,因为远程服务器未响应。

要解决此错误,在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。请下载并导入下面的 .reg 文件,或者打开 提升权限命令提示符 并运行以下命令。完成后必须重启计算机。

    适用于 Windows Vista, 7, 8.x 和 10 (下载 .reg 文件)

    REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

    仅适用于 Windows XP (下载 .reg 文件)

    REG ADD HKLM\SYSTEM\CurrentControlSet\Services\IPSec /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

另外,某些个别的 Windows 系统配置禁用了 IPsec 加密,此时也会导致连接失败。要重新启用它,可以运行以下命令并重启。

    适用于 Windows XP, Vista, 7, 8.x 和 10 (下载 .reg 文件)

    REG ADD HKLM\SYSTEM\CurrentControlSet\Services\RasMan\Parameters /v ProhibitIpSec /t REG_DWORD /d 0x0 /f