この記事を作った動機
Linux 環境において、VPN 環境についてトラブルシュートしていたところ、設定ミスが発生した。その原因として、viaという単語を正しく解釈できておらず、VPN クライアントの設定ミスでパケットをクライアント内のネットワークでループさせていたということがあった。今回の記事では、そのことについて軽くまとめたい。
説明
簡易的な解釈
iproute2 における via というキーワードは、ゲートウェイ設定(静的ルーティング、Next Hop)を表す。ルーティングされる対象のネットワーク via ゲートウェイ のような書き方になる。ゲートウェイとして、クライアント自身を設定してしまうとローカルでループしてパケットが期待どうりにネットワークに排出されない通信障害になる。
例えば、クライアントが VPN 接続先以外のネットワークから VPN 接続をすることを想定する。VPN クライアントは仮想インターフェース(vpn_vps)に、192.168.30.100/24 を持っていると仮定し、VPN サーバの仮想ハブが 192.168.30.2 をL3仮想スイッチルーティング用に持っている場合を想定する。この場合、192.168.30.0/24 のネットワークを経由して、192.168.0.0/24 にパケットを送りたい場合は、192.168.30.2 をゲートウェイを設定する。192.168.30.100/24 などクライアント自身を指定すると、通信がローカルでループし、VPN クライアントはそもそもパケットを外部のネットワークに排出せず、通信障害になる。
一見すると 192.168.0.0/24 via [VPNクライアント自身のIP] とかくと、VPNクライアント自身のIPを経由して外部に 192.168.0.0/24 宛てのパケットをルーティングするという解釈もできそうだが、少なくとも Linux 環境の iproute2 の設定においては、その解釈は間違っていそうである。あくまで via というキーワードが示しているのは、次にパケットをどのコンピュータに送るべきか、外部のルーティングが可能なコンピュータの IP を指定するという意味合いなようである。クライアント自身を設定してしまうと、クライアント自身にルーティングしてしまうようである。
また、Linux 環境の iproute2 における設定では、明確に外部のゲートウェイとなる PC の IP を指定しなくても、パケットを送り出したいインターフェースだけ指定するという、曖昧な設定もできるようである。192.168.0.0/24 dev vpn_vps のようにして、192.168.0.0/24 宛てのパケットを、vpn_vps という NIC からとにかく送り出すという設定はできるようである。
# いろんな書き方の例
# VPNクライアントとして接続されているルータPCにルーティングする仮想L3スイッチのIPを 192.168.30.2/24 として仮定している
ip route add 192.168.0.0/24 via 192.168.30.2 dev vpn_vps
ip route add 192.168.0.0/24 dev vpn_vps
ip route add defalt via 192.168.30.2 dev vpn_vps
前提とするネットワーク構成図に関する説明
単語の説明
- Home Network
自宅のネットワークなど私的に運用される LAN - Foreign Network
大学や仕事場所、コンビニやファミレスなどにある公共の場所にある LAN
各ネットワークに関する説明
- 192.168.0.0/24
家庭用ルータではなく、主に nftables によって転送が管理されていて、カーネルで転送許可をしてある Linux ルータPCで管理されている自宅のネットワーク - 192.168.30.0/24
固定 IP を持った VPS 上で動いている SoftEther VPN Server (DHCP サーバが有効) における仮想ハブのネットワーク - 192.168.x.0/24
大学や仕事場所、コンビニやファミレスなどにある公共の場所のネットワーク - 192.168.0.1/24 192.168.30.2/24 192.168.x.1/24
各ネットワークにおけるデフォルトゲートウェイ や DHCP、場合によっては DNS サーバーなど一通りのルーティングなどのネットワークに必要な機能を備えた装置の IP やルーティングを行う仮想L3スイッチの IP - 192.168.30.13/24
SoftEther VPN Server を動かしている VPS がクライアントとして仮想ハブのネットワークに参加しているときの IP - 192.168.30.100/24
Foreign Network から VPN 接続して仮想ハブに参加している VPN クライアントの仮想 NIC における IP
NIC 名の説明
- vpn_vps
Foreign Network から VPS 上にある VPN の仮想ハブにアクセスする際に、VPN クライアントが使う仮想インターフェース名
その他説明
- ルータPC
Home Network で使われている、家庭用ルータの代わりに、スイッチとセットで nftables で転送や NAT を構成し、ip-hole や kea で DNS や DHCP サーバとしても機能するようにした Linux PC のこと。VPS 上で動いている VPN サーバのネットワークにもクライアントとして参加し、192.168.30.0/24 と 192.168.0.0/24 の間を転送する。異なるネットワーク間を転送する際、ARPプロキシ(L2ルーティング)は有効にしていない。 - VPN サーバー
今回登場する VPN サーバーは直接 Home Network からは動作せず、VPS 上に専用に用意したものである。192.168.30.0/24 のネットワークを接続した VPN クライアントに提供する。仮想 L3 スイッチの設定により、192.168.0.0/24 宛てへのパケットを、192.168.30.0/24 に接続していてネットワークの越境が可能な転送設定をしてある VPN クライアントであるルータPCに仕向けるように設定してある。
説明の図
各ルーティング状況に関する説明
パケットがクライアント内部でループするイメージ
- Wireshark で VPN クライアントの仮想インターフェース(vpn_vps)からいかなるパケットが出ていることを確認できない。
- Ping をして、192.168.30.0/24 を介して ICMP パケットを 192.168.0.0/24 のネットワークに属する機器に送ろうとしている様相は確認できるが、失敗している。
- Wireshark では、any インターフェースですべてのパケットを掴むと、Ping を 192.168.0.0/24 のネットワークに属する機器に対して試みると、ICMP が Unreachable のエラーを吐いていることが確認できる。
- ルータPC などの nftables などの VPN クライアント以外の設定について、転送設定や VPN 接続自体が成功しているか検証しても問題が見つからない。192.168.30.0/24 につながった VPN クライアント同士などの Ping などは成功し、疎通が取れている。
- VPN クライアントとして参加しているルータ PC にも 192.168.30.0/24 のアドレスを直接叩くと、Ping が成功する。
- 実際のところネットワーク設定で、192.168.0.0/24 にパケットを送るゲートウェイ設定をクライアント PC 自体にしてしまっていたために、パケットがループしてそもそも VPN クライアント外部のネットワークに一切パケットが出ておらず、内部で破棄されているっぽいことが分かった。(via の解釈の問題)
正常に VPN を介して Home Network にアクセスできているときのイメージ
vpn_vps のインターフェースからパケットを外部に投げるように曖昧に設定した例である。
SoftEther VPN サーバー において、L3 仮想スイッチ(192.168.30.2/24など)を作成し、静的ルーティングをするように設定した場合、192.168.0.0/24 via 192.168.30.2 dev vpn_vps のような明示的な書き方も可能である。
使った画像素材とか
- Win 7 (Vista) のアイコン (2026年5月10日)
- PC のアイコン
- PC とインターネットのアイコン
- ルータのアイコン * 2
- サーバーのアイコン
- ハブのアイコン
- SoftEther VPN Project - SoftEther VPN Project (SoftEther のソフトウェアのロゴ)
https://www.softether.org/ (2026年5月10日)
参考にしたサイトとか
- Arch Linux - iproute2 7.0.0-1 (x86_64)
https://archlinux.org/packages/core/x86_64/iproute2/ (2026年5月10日) - Google Gemini
https://gemini.google.com/app (2026年5月10日) - Network configuration - ArchWiki
https://wiki.archlinux.org/title/Network_configuration#Manual (2026年5月10日) - SoftEther VPN Project - SoftEther VPN Project
https://www.softether.org/ (2026年5月10日)