# 部署 OpenVPN 服务

此镜像仅确保了基本功能无误，如果您自己有能力配置，建议自行搭建或者可以参考这个镜像的实现方法来完成。使用前，您需要有 Linux 以及 Docker 相关基础。此镜像在 Debian 9 上测试通过。这里讲述的是如何在 Debian 9 上使用，通常情况下，这可以适用于其他系统例如 Ubuntu 系统。本服务默认端口为 1190/UDP，请确保已在防火墙允许该规则。

## 准备工作

您还需要在服务器上做出如下修改，执行命令

```bash
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sysctl -p
```

如果您的服务器上**安装了 `ufw`**，还需在 `/etc/ufw/before.rules` 的前几行写入如下内容，这里的 eth0 和网段根据您的实际服务器接口和配置做修改，注意是加在 *filter 规则前（如果有）。

```bash
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.27.27.0/24 -o eth0 -j MASQUERADE
COMMIT
```

修改 `/etc/default/ufw` 中的如下配置为 ACCEPT。

```bash
DEFAULT_FORWARD_POLICY="ACCEPT"
```

最后，执行如下命令重启服务器上的 ufw 防火墙服务。

```bash
ufw reload
```

如果您服务器**没有安装 `ufw`**，请确保 iptables 的 FORWARD 规则为 ACCEPT，执行如下命令。

```{attention}
服务器重启后您可能需要重新应用此规则，建议安装 ufw。
```

```bash
iptables -P FORWARD ACCEPT
```

## 初始化配置

现在，我们创建一个目录用来保存我们 OpenVPN 服务的配置

```bash
mkdir -p ~/lamda-openvpn-server
```

紧接着，执行如下命令进行 OpenVPN 服务的初始化操作

```bash
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-server-new
```

等待命令执行结束，现在您可以在 `~/lamda-openvpn-server` 目录下看到服务的配置，配置文件为 `config.ovpn`，您可以使用编辑器打开此文件，建议只修改下面几个字段。

```ini
# VPN 的网段以及掩码
server 172.27.27.0 255.255.255.0
# VPN 服务端口
port 1190

# 或者如果您需要服务器上某个网络接口可以被VPN客户端访问
# 您也可以增加一条路由，但是注意此时您也只能访问到当前主机在此网段的IP
# 如果需要客户端对此网段的完全访问，您还需进行额外设置
push "route 192.168.68.0 255.255.255.0"

# 修改 114 为您需要的 DNS 服务器
push "dhcp-option DNS 114.114.114.114"
```

## 创建客户端连接凭证

编辑完毕，现在开始创建一个客户端，`myname` 可以改为其他您想要的，但是不可重复

```bash
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-new myname
```

创建完成后，使用如下命令来获取此客户端的登录凭证

```bash
# 注意：配置中的 IP 是自动获取的当前公网IP，如果不对还需自行修改
#
# 生成 ovpn 配置，并重定向保存到文件 myname.ovpn，这个文件可以用于 OpenVPN-Connect 等 APP
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-profile ovpn myname >myname.ovpn
# 生成 lamda 使用的 OpenVPNProfile，可以直接在 lamda 中使用
# 其中包含一段 properties.local 注释部分，您可以将其中的 openvpn.* 配置
# 复制到 /data/usr/properties.local 中以实现自动连接 VPN
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-profile lamda myname
```

## 撤销客户端凭证

如果需要撤销某个客户端凭证请执行以下命令，撤销后可能需重新启动 OpenVPN 服务

```bash
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-revoke myname
```

## 启动 OpenVPN 服务

现在您可以执行如下命令前台启动 OpenVPN 服务，您可以直接看到客户端连接日志、排查错误。

```bash
docker run -it --rm --name openvpn-server --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn run
```

当您确认无误，建议放在在后台运行，使用此命令后台启动服务。

```bash
docker run -d --rm --name openvpn-server --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn run
```

## 参考文档

基础文档：https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/

路由设置：https://community.openvpn.net/openvpn/wiki/BridgingAndRouting
