Carpe Diem

備忘録

VPNで特定のサーバに繋がらない

概要

先日VPNサーバを再起動したところ、基本的に内部ネットワークに接続できるものの特定のサーバに対し

  • 疎通(ncコマンド)自体はできる
  • 3 way handshakeもできる
  • Webページは見れない
  • 会社からのアクセスだとWebページも見れる

という状況に陥ったのでその対処を書きます。

環境

  • Pritunl Server v1.6.752.82
  • Wireshark v2.6.3
マシン IP
自宅PC xxx.xxx.xxx.20
接続したいサーバ xxx.xxx.xxx.116

VPNサーバ

pritunl.com

というOSSVPNサーバを利用しています。

症状

Wiresharkで調査することにしました。

3way handshakeはできてる

f:id:quoll00:20181113151926p:plain

TCP Previous Segment not capturedがちょこちょこ出ていた

しかし途中でパケットをロスト(TCP Previous Segment not captured)していました

f:id:quoll00:20181113152147p:plain

パケットのDFフラグはtrue

経路途中でのパケットの分割は禁止されていました。

f:id:quoll00:20181113152559p:plain

解決方法

VPNサーバのセキュリティグループにICMPの許可を入れたところ疎通できるようになりました。

f:id:quoll00:20181030154034j:plain ref: VPN環境で閲覧できないWEBサイトの原因は、MTU... : old_3流プログラマのメモ書き

おそらく途中のルータのMTUが低く、かつDF=trueでルータ側では分割できないため送信元にICMPで再送リクエストを投げるものの、AWSのSecurityGroupの設定でICMPがブロックされていたので再送されなくなったと考えられます。

疑問点

なぜ以前はICMPのSecurityGroupが不要だったのか

未解決です。再起動しただけでなぜ急にアクセスできなくなったのか。

見れない時はDup ACKを1回しか送ってない

解決してから再びパケットを調べたところ、

解決後のパケット

パケットがロストしたとしても、Dup ACKを4回送っておりサーバから再送されています。

f:id:quoll00:20181113153320p:plain

解決前のパケット

パケットをロストしてからも4回送らないせいでサーバから再送されていません。

f:id:quoll00:20181113152147p:plain

ICMPブロックして見れる環境でもMSSは同じ

前述の解決方法の考え方だと、途中経路のMSSが小さいせいでパケットが渡せなくなっている〜ということになりますが、アクセス可能だった会社環境でもアクセスできない自宅環境でもMSS=1352で同一でした。

まとめ

今回は「とりあえず動いたけど原因は究明できていない」という気持ち悪い状況でした。
ただ備忘録として残しておきます。

ソース