[2025/04/22更新] OpenVPN サーバー構築トラブルシューティング備忘録 (Proxmox LXC)

こんにちは、冬優子ぱっちんです。
Proxmox VE 上の非特権 LXC コンテナに OpenVPN サーバーを立てたときの手順&トラブルシューティングを、備忘録としてまとめました。

実際の IP やユーザー名は「<…>」でぼかしてありますので、適宜読み替えてください。

1. LXC コンテナ初期設定(CTID:100 / ホスト名: vpn)

  • テンプレート:Debian 11 (debian-11-standard_*.tar.zst)
  • ディスク:8 GB
  • CPU / メモリ:1 コア / 1024 MB
  • ネットワーク:bridge=vmbr0 (DMZ)、IP=10.0.100.<X>/24、GW=10.0.100.1
  • DNS:1.1.1.1
  • 特権コンテナ:必要に応じて“はい”
  • 開始時自動起動:はい
pct create 100 \
  local:vztmpl/debian-11-standard_11.7-1_amd64.tar.zst \
  --hostname vpn \
  --cores 1 --memory 1024 --swap 512 \
  --rootfs local-lvm:8 \
  --net0 name=eth0,bridge=vmbr0,ip=10.0.100.<X>/24,gw=10.0.100.1 \
  --nameserver 1.1.1.1 \
  --onboot 1 \
  --features nesting=0,keyctl=0
pct start 100
pct enter 100

トラブル①:TUN デバイスが開けない

症状:OpenVPN 起動時に Cannot open TUN/TAP dev /dev/net/tun エラー。

原因:非特権コンテナなので /dev/net/tun へのアクセス権がない。

解決:ホスト側の /etc/pve/lxc/100.conf に以下を追記し、コンテナを再起動。

# /etc/pve/lxc/100.conf の末尾
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

2. コンテナ内 初期セットアップ

  • システム更新:apt update && apt upgrade -y
  • 基本パッケージ:apt install -y sudo vim curl wget git openssh-server ufw fail2ban qemu-guest-agent
  • SSH 設定:/etc/ssh/sshd_config を編集 → systemctl restart sshd
  • UFW 設定:
    ufw default deny incoming
    ufw default allow outgoing
    ufw allow ssh
    ufw allow 1194/udp
    ufw enable
  • Fail2Ban:systemctl enable --now fail2ban
  • QEMU Guest Agent:systemctl enable --now qemu-guest-agent
  • ユーザー作成(任意):
    adduser <USERNAME>
    usermod -aG sudo <USERNAME>
  • タイムゾーン/ロケール:
    timedatectl set-timezone Asia/Tokyo
    apt install -y locales-all
    localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
    source /etc/default/locale

3. OpenVPN + Easy‑RSA のインストール

apt update
apt install -y openvpn easy-rsa

トラブル②:`–genkey –secret` の非推奨警告

症状:
WARNING: Using --genkey --secret filename is DEPRECATED.

解決:以下のようにオプションを変更。

openvpn --genkey secret /etc/openvpn/ta.key

4. PKI 初期化 & 証明書作成

make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass        # CA(パスフレーズなし)
./easyrsa gen-req server nopass
./easyrsa sign-req server server
cp pki/ca.crt pki/issued/server.crt pki/private/server.key /etc/openvpn/

トラブル③:サンプル設定ファイルが見つからない

症状:
cp .../server.conf.gz: No such file

解決:実ファイル名を確認してコピー。

ls /usr/share/doc/openvpn/examples/sample-config-files/
cp server.conf /etc/openvpn/

5. サーバー設定(/etc/openvpn/server.conf

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
vim /etc/openvpn/server.conf

# <…> は適宜自環境の値に読み替え

dev tun0
port 1194
proto udp

ca ca.crt
cert server.crt
key server.key
dh dh.pem

tls-auth ta.key 0
cipher AES-256-GCM
auth SHA256

server 10.8.0.0 255.255.255.0

;push "route 192.168.XXX.0 255.255.255.0"
push "route 192.168.YYY.0 255.255.255.0"

;push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 192.168.100.108"
push "dhcp-option DNS 1.1.1.1"

user nobody
group nogroup

keepalive 10 120
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3

トラブル④:`dev tun` と `ethX` の混同

OpenVPN の dev tun は VPN トンネル用の仮想 IF、eth0/eth1 は LXC の物理/仮想 NIC。混同しないよう注意。

トラブル⑤:`push “route …”` の意味

これはクライアントに追加ルートをプッシュする設定。VPN 経由で内部 LAN(例: 192.168.100.0/24)にアクセスさせたいときに必要。

トラブル⑥:`push “dhcp-option DNS …”` の適切設定

内部名解決が必要なら内部 DNS(例: 192.168.100.108)をプッシュ。パブリック DNS はセカンダリとして追加。

6. IP フォワーディング & NAT(UFW)

  • IP フォワーディング有効net.ipv4.ip_forward=1/etc/sysctl.conf に追加 → sysctl -p
  • NAT ルール/etc/ufw/before.rules の先頭に以下を追加
    *nat
    :POSTROUTING ACCEPT [0:0]
    -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    COMMIT
    

    ufw disable && ufw enable

トラブル⑦:NAT ルールの IP 範囲不整合

サーバ設定の server-s のネットワーク範囲を必ず一致させること。

7. サービス起動 & ログ確認

mkdir -p /var/log/openvpn
chown nobody:nogroup /var/log/openvpn

systemctl enable openvpn@server
systemctl start  openvpn@server
systemctl status openvpn@server

トラブル⑧:サービス起動失敗(exit-code)

まず journalctl -u openvpn@server、次にアプリケーションログ(/var/log/openvpn/openvpn.log)を確認します。

8. クライアント設定ファイル生成(手動例)

cd /etc/openvpn/easy-rsa
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

mkdir -p ~/client-configs/files
cp pki/ca.crt pki/issued/client1.crt pki/private/client1.key ta.key ~/client-configs/files/

cat << 'EOF' > ~/client-configs/base.conf
client
dev tun0
proto udp
remote <VPNサーバIP> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
# ca.crt を挿入
</ca>
<cert>
# client1.crt を挿入
</cert>
<key>
# client1.key を挿入
</key>
key-direction 1
tls-auth ta.key 1
cipher AES-256-GCM
auth SHA256
EOF

まとめ

  • ドキュメントと実環境は異なることが多いので、lsgetent で都度確認。
  • 設定値(IP/CIDR、ユーザー/グループなど)は一貫性が大事。
  • トラブル時は systemd ログ & アプリログを両方チェック。
  • 非特権コンテナではデバイス権限に注意し、ホスト側設定を忘れずに。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です