#author("2023-07-06T21:09:36+00:00;2023-06-10T09:32:41+00:00","default:mogamin","mogamin")
#author("2023-07-06T21:10:35+00:00;2023-07-06T21:09:36+00:00","default:mogamin","mogamin")
* FTP のパッシブモードのデータコネクションは tcp 20 じゃなかった [#z3251b57]

** TL;DR [#k27c83bf]

- FTP のパッシブモードは、制御コネクションは tcp/21、データコネクションは''任意のポート''を使用する
- これらは同じグローバル IP アドレスからのアクセスになるようにルーティングしよう((特殊な環境じゃなければ、ふつうはそうなってる))

** 以下おま環解決のはなし [#e985400b]

さくらのレンタルサーバで FTPS 接続を使おうと設定したところ SSL の確立まではいくけれど、ディレクトリをリストするところでタイムアウトする問題にあたった。

クライアント設定を疑うにはじまり、いくらこねくりまわしても状況が変化しないので、つぎに疑いがかけられたのは自宅のネットワーク。
うちのルータ (RTX1100) は IPv4 においては transix の DS-Lite と IIJ の PPPoE の2経路を使い分けていて、P2P アプリやゲームクライアントのために [[ephemeral port>WikiPedia:Ephemeral port]] が宛先になっている通信は PPPoE に流す設定になっていた。

試しにすべての通信を PPPoE に流す設定を入れたところ、FTP があっさりつながった。逆にすべて DS-Lite に流したところ、こっちも問題なし。設定をもどすと またタイムアウトする。
まさかと思っていたけれど、どうやらこのルーティングが影響してる。

そこで、レンタルサーバに FTP 接続をかけているときの TCP ポートの使用状況を Port Viewer で調べた。すると、21:制御コネクションに並んで、データコネクションが『想定していた 20』ではなく ephemeral port をつかって張られていた。

#ref(./port.png,wrap)

じつは、パッシブモードのデータコネクションの宛先 (サーバが受け付ける) ポートは 20 とはかぎらず、サーバが通知した任意のポートを使用できる。ネットワークをきちんと学んだひとなら、おそらく当然に知っていることだ。

こうなると制御コネクションは DS-Lite に、データコネクションは PPPoE に RTX がルーティングしてしまい、サーバから見た両コネクションのアクセス元の IP アドレスが異なる泣き別れ (と勝手に呼んでる) 状態になってしまう。
こうなると制御コネクションは DS-Lite に、データコネクションは PPPoE に RTX がルーティングしてしまい、サーバから見た両コネクションのアクセス元のグローバル IP アドレスが異なる泣き別れ (と勝手に呼んでる) 状態になってしまう。
過去には同様の事象として、ルータでインターネットアクセスを複数の回線にラウンドロビン方式で分散している構成で、IPsec の IKE (udp/500) と NAT-T (udp/4500) が別々の回線にルーティングされ VPN がつながらない という症状に見舞われたこともあった。

*** どうしたか [#j03f1c4a]

http(s) だけを DS-Lite に流すことにした。

DS-Lite は網終端装置の混雑に影響されないぶん PPPoE より速度が安定してる他方、キャリアグレード NAT のせいで一部の特殊な通信を行うアプリが動作しないことがある。
いまどきの回線速度が必要な重いトラヒックの大部分は http(s) でおこなわれるので、これだけ DS-Lite に逃がしてしまえば、のこりの通信は PPPoE でも気にならないだろう。

というわけで、tcp/80, tcp/443, udp/443 のみを transix の IPIP トンネルにルーティングする設定を入れた。

 # example for rtx1100
 ip route default gateway tunnel 30 filter 2080 2443 3443 keepalive 30 hide gateway pp 1
 ip filter 2080 pass * * tcp * 80
 ip filter 2443 pass * * tcp * 443
 ip filter 3443 pass * * udp * 443
 
 # tunnel 30 -> transix
 # pp 1 -> pppoe
 # keepalive 30 -> down detection for transix

参考までに、いままでの設定 (公開用にちょっと変えてある)

 ip route default gateway pp 1 filter 1100 1101 1102 1103 1104 1200 gateway tunnel 30 keepalive 30 hide gateway pp 1 weight 0
 ip filter 1100 pass * * esp * *  # vpn
 ip filter 1101 pass 172.22.40.1 * udp 500 *  # vpn
 ip filter 1102 pass 172.22.40.1 * udp 4500 *  # vpn
 ip filter 1103 pass * * udp * 500  # vpn
 ip filter 1104 pass * * udp * 4500  # vpn
 ip filter 1200 pass * * tcp * 1024-65535  # ephemeral port

** thanks to [#vf6f8aee]

FTP(File Transfer Protocol)とは
https://www.infraexpert.com/study/tcpip20.html

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS