この記事を作った動機

 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に仕向けるように設定してある。

説明の図

ネットワーク構成図の説明

各ルーティング状況に関する説明

パケットがクライアント内部でループするイメージ

パケットがループする例
パケットがループする例1
 上記の図のような状況において、トラブルシュートでは以下のような厄介な挙動が見受けられた。

  • 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 クライアントには、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日)

参考にしたサイトとか