# 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 などのアプリで使用できます
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