こんにちは、冬優子ぱっちんです。
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
まとめ
- ドキュメントと実環境は異なることが多いので、
ls
やgetent
で都度確認。 - 設定値(IP/CIDR、ユーザー/グループなど)は一貫性が大事。
- トラブル時は systemd ログ & アプリログを両方チェック。
- 非特権コンテナではデバイス権限に注意し、ホスト側設定を忘れずに。