この記事は、 大阪工業大学 Advent Calendar 202314日目の記事です。
はじめに
私はStrongswanを利用したIKEv2のVPNを構築しました。
その過程で躓いたことを以下にまとめました。
少しでも参考になれば幸いです。
環境
NAT:Aterm製家庭用ルーター
回線:フレッツ光VDSL
基盤サーバ:Proxmox VE 8.0.4
仮想マシンスペック以下
CPU:x86-64-v3
Memory:2.00GB
BIOS:SeaBIOS
Machine:i440fx
DISK:scsi-32GB-SSD=1
NetworkDevice:virtio
私の環境では、仮想マシンにもルータ配下と同じIPを振っているため、NAT下にNATがいるような状況ではないことに留意してください。
システム構成図
一般的にVPNのみを利用する場合は以下のような構造となっています。
証明書関係の問題
さて、本題に入りますがここでは証明書関係のエラーについて述べます。
省略しますが、let's encryptにて証明書を発行し、cloudflareでDDNSを行っている環境です
例えば以下のようなシステム構成で証明書更新を行って、証明書を渡している場合、うまくいかない場合に動作がおかしくなります。
具体的には以下のような現象が発生します。
- Windows環境において「ネゴシエーションが失敗する」、「ポリシーマッチエラー」等々
- Android環境において接続するが、VPN(IPアドレス接続)以外に接続できない→DNSサーバが見つけられない
以上の現象を直すためには以下のような確認を行い修正しました。
- ipsec.confの設定の確認
- 証明書が正しく転送されているかの確認
- 証明書の権限がStrongSwanやipsecが読めるか確認し(644だったはず)、指定するディレクトリが正しいか確認すること。
- StrongSwanのログの出力を有効化し、ネゴシエーションのどの部分で詰まっているのかを確認すること。
特に、private.pemのみ更新を忘れたりすると、接続できるが、ローカル以外に出れないなどの現象に悩まされるため注意
以下余談
原因は言わずもがな、認証が不正であると判断されたり、暗号化された内容が複合化できないことが原因と考えられます。
また、Windows側では一度接続できていた場合、下手に接続できることがありこれも原因究明を難しくします。
逆に、Androidは疎通ができていないなどの初歩的なミス以外の場合、大抵接続できてしまうため、現象の全容を調べるのが難しかったです。
VPN特有の問題
以上の問題ではなく、接続できるが、あるサイト(github等)やサービス(github Desktop等)にのみ接続が不安定であったり、接続できなかったりする場合MTU値が関係していると考えらえれます。
MTU値とはネットワークで一度に送信できる最大のデータサイズのことで、VPNを噛ますことでVPN分のデータが増えるます。
その結果、データが最大値を超え、帰ってこない状況になることもあります。
一般的に対応を行っているサイトでは再送要求に伴いMTU値の変更通知を送るらしいのだが、返してくれないサイトやサービスも存在します。
そのため、VPNサーバ側で対応を行わなければなりません。
MTU値変更と検索をかければ情報が出てくるがUbuntu+iptableでの設定例を以下に示します。
sysctl.conf
#以下の設定はパケット分割の許可する設定
net.ipv4.ip_no_pmtu_disc1
iptables -t mangle -A POSTROUTING -o eth0 \
-p tcp -m tcp --tcp-flags SYN,RST SYN \
-s 192.168.0.0/24 \
-m tcpmss --mss 1361:1536 \
-j TCPMSS --set-mss 1360
上記の設定は、eth0のインターフェースを通じて送信されるTCPパケットの1361~1536の大きさのパケットを1360の大きさに変更する設定です。
これは、TCPのみでSYN,RSTとSYNのフラグを持つパケットに適応していて、-sオプションでVPNで振られるIPのみに限定しています。
おわりに
上記以外にも自身でセットアップを行うと様々な問題が起こります。
bing AI や GPTを利用してログを読むことである程度の回答を得ることはできますので、あなた自身が抱えている問題が解決することを願っています。