# 部署 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