2019-08-06

WireGuard に関する考察

接続から2〜3分後に切断されてしまう問題があります。

Listen port : (random) ですが、端末側は Listen port をとくには設定していないことがあると思われ、その場合はランダムなポートが割り当たります。



ハンドシェイク(イニシエーション/レスポンス)はこのランダムなポートと、相手側の Listen port との間で行われます。


WireGuard は Client to Server 型ではなく Peer to Peer 型ですから接続はどちらからでも行えるのです。

便宜上、スマホ側を「クライアント」とし、同様に便宜上、Raspberry Pi 側を「サーバー」としておきます。



Peer to Peer なので「クライアント」側からのイニシエーションもあれば、
「サーバー」側からのイニシエーションもあるということです。


この場合イニシエーションを受けた側はレスポンスを返す決まりです。

イニシエーションを投げる側を「イニシエーター」、受け取って応答を返す側を「レスポンダー」といいます。



ハンドシェイクは概ね2分間隔で行われており、何らかの要因でこれが途絶え15秒を経過するとイニシエーターが交代するようです。



 全く最初のハンドシェイクでは Keypair の交換が行われます。



その後の再接続では、完全に切断状態でなければ Keypair 交換はなく、イニシエーション/レスポンスのやり取りだけです。



また、Keepalive はこのハンドシェイクとは別に行われます。


お互いに「設定(wg0.conf)」で設定した間隔で Keepalive パケットを投げあい、受け取り合うのです。



Keepalive はルーターの NAT で内から外へのパケットがポートを開けて通過し、設定された開放時間(例えば tcp=360s / udp=180s とか)の間に生死確認することで、ポート開放状態を維持する目的で使用されるものです。



これは自局のルーターもですが、キャリア網・4G(LTE)からインターネットに接続されるルーターもあり、WireGuard では 25秒が最適であるとしていて、この値がデフォルト推奨値です。


一般にキャリア網の開放時間は小さいという説もあり真偽は不明ながら 25秒は十分と思われます。



それでも切断が発生の場合は、この Keepalive 間隔を 25秒から 15秒あるいはそれよりも少なくする必要があるかも知れません。



ルーターが NAT を開いて、出ていくパケットに対する戻りパケットが帰ってくるとき、ポートが開いている時間内に戻ってくればハンドシェイクはうまくいきます。



tcp の場合は syn に対する ack がこれに相当しますが、udp には syn/ack のようなトランスポート層でのやり取りはありません。



より上位のレイヤー7レベルでデータパケットをやり取りすることで NAT の開放時間内の戻りを確保する必要があるのです。



Keepalive はいわば、通信経路を確保しておく手段ということになリます。



一方、ハンドシェイクは VPN 状態を確保する手段ということになります。




例えば udp ポートの開いている時間が180秒(3分)だったとし、その間に戻れないと切断が発生します。




切断回避手段ですが、自局ルーターについてはお互いの Listen Port を同じポートにすればいいのですが、4G(LTE)はキャリアのルーターがポートを開ける時間に依存しています。



つまり、下記の2点が安定した VPN を保持するために必要ということになります。


1.自局のルーターに開けたポート(「サーバー」側:WireGuard デフォルト推奨ポートは 51280)に合わせて、「クライアント」側:スマホの Listen port は "random" ではなく同じポートを使うのです。

   V6プラスの場合は、割り当てられたポートの一つに設定します。


2.ルーター/ファイアウォール対策(自局もさることながら、むしろキャリア向け対策)として、Persistent Keepalive を設定します(デフォルト推奨値 25 秒)




MVNO は LINE mobile(SB回線)と OCN mobile(D回線)を使っていますが、10時間以上スリープ状態でも、覚めてから ping がどちらの回線も正常に通ります。


WireGuard 接続状態にしておけば、外で 4G(LTE)時はもちろん、公衆 WiFi に入ったらそのまま公衆 WiFi 経由で安全なネット利用ができますし、自宅にも入れます。


自宅 WiFi に入ったとき、そのまま自宅 WiFi 経由 WireGuard 接続状態で使えますので、内/外を特に操作不要で使い分けられます。




つまり、普段から自宅 WiFi 下で WireGuard 接続しておけば、外に出るとそのまま 4G (LTE) で VPN が使え、フリー WiFi 接続されればそのまま VPN で利用でき、帰宅すれば再び自宅 WiFi で VPN 経由で利用できます。



ずーっと繋ぎっぱなしでいいので大変楽です。







0 件のコメント: