vsftpdが光BBユニットのせいで急にLAN外と通信できなくなった。

今までLANでもWANでも普通に使えてたftp接続が急にWAN側からのアクセスを受け付けなくなって直すために孤軍奮闘したお話。foobar2000 moblieで自宅サーバ上の音楽をftp経由で聞いていたので外出時にftpがつながらないのは俺にとって死活問題。色々試してて結論としてはソフトバンク光で提供される光BBユニットの取扱説明書にどこにも明記されてない隠れた仕様が原因。

原因解明

正直原因探るだけで2日は要した。デフォルトの設定だと以下のようにクライアントがログインできた事しかログに残らないポンコツ仕様のせいで。まぁこの原因究明作業でftpがどういう通信をしているのかを理解する事ができた。以下"/var/log/vsftpd.log"の一部。

Thu Sep 3 14:51:31 2020 [pid 6126] CONNECT: Client "IP"
Thu Sep 3 14:51:31 2020 [pid 6125] [UserA] OK LOGIN: Client "IP"

“/etc/vsftpd.conf"のログ関連の設定は以下のようにしておく。

xferlog_enable=YES
 # ログを/var/log/vsftpd.logに吐き出す設定。デフォはYES
xferlog_std_format=NO
 #xferlog形式のログを取る設定。デフォはYES。
log_ftp_protocol=YES # vsftpd形式でFTPの通信ログをすべて取得できる。上記のxferlog_std_formatはNOにしておく必要がある。

再度"/var/log/vsftpd.log"

Sat Sep  5 13:03:43 2020 [pid 11497] [User] FTP command: Client "IP", "PASV"
Sat Sep  5 13:03:43 2020 [pid 11497] [User]  Client "IP", "227 Entering Passive Mode (114,36,36,100,58,234)."

どうもクライアント側がPassiveモードでアクセスした時に、サーバが返すレスポンスのIPアドレスが、ローカルIPになってるのがだめらしい。

まずはググって出てきた対処方法を試した。

/etc/vsftpd.confにpasv_addressを設定してみる

“/etc/vsftpd.conf"の"pasv_address"でグローバルIPを指定してみる

pasv_address="グローバルIP"

これをやるとClient “IP", “227 Entering Passive ModeでレスポンスされるIPアドレスがグローバルIPになり、WAN側からアクセス出来るようになるけどLAN内でFTPサーバにPassiveモードでアクセス出来ないという問題が発生する。なおかつうちは動的IPだからIP変わった時に対処出来ない。

“pasv_addr_resolve=YES"という記述を追加して"pasv_address"にグローバルIP知ってるDNSサーバのドメインを書くことで一応動的IPには対処出来る。うちの環境だとmydnsにIPアドレスの変更を通知してDDNSとして運用している

pasv_addr_resolve=YES
pasv_address=グローバルIP知ってるDNSのドメイン

まぁこれをやっても結局グローバルIPがレスポンスに入るだけなのでLAN内でアクセスできないのは変わらない。"/etc/hosts"にドメインとサーバPCのIPを関連付けたらLAN内アクセス出来んじゃん!!って思ったけど、それやったらレスポンスがローカルのIPに変わるだけでグローバルからアクセス出来ないのでなんの意味もなかった。

そもそも今まで正常にLAN側、WAN側でアクセス出来てたのは何故??

あれこれ苦労してvsftpdやルータの設置をいじってるうちにふと疑問が思い浮かんだ。何故今までは問題なく接続出来ていたのか?と。そういや繋がらなくなる前に光BBユニットのポート転送設定とvsftpdの待受ポートを変更した事を思い出した。デフォの21番ポートを使用してたvsftpdを別のポートに変更した後、光BBのポート転送先もそのポートに合わせた。当然ウェルノウンポートでアクセスするよりはセキュリティ的によろしいだろうという考えでやった。

ちなみにLAN内に居るときと外出中でも同じドメイン、ポートで接続できるようにLAN内容のDNSを設置して、ポート転送設定はWAN側ポート番号1000-1000をLAN側ポート番号1000-1000みたいな感じで揃えていた。個人的にLAN外とLAN内でアクセス時に違うポートでアクセスすることになるとクライアントのアプリ側でLAN内用とLAN外用でそれぞれ設定を準備しなきゃいけないのが美しいと感じなかったから。

vsftpdの待受を21番に戻して光BBのLAN側ポートを21番に戻してみる

もしや21番のときだけ変換してんじゃね??と思い、光BBのポート転送設定でLAN側は21番に転送するようにしてみた。WAN側1000-1000,LAN側21-21。んでvsftpdも"listen_port"の設定を消してウェルノウンポートである21番で待ち受けさせる。

なんとこれでLAN内でもLAN外でも通信出来てしまった。ちなみに"/var/log/vsftpd.log"を確認すると

Sat Sep  5 13:03:43 2020 [pid 11497] [User] FTP response: Client "IP", "227 Entering Passive Mode (114,36,36,100,58,234)."
Sat Sep  5 13:03:44 2020 [pid 11497] [User] FTP command: Client "IP", "LIST"
Sat Sep  5 13:03:44 2020 [pid 11497] [User] FTP response: Client "IP", "150 Here comes the directory listing."
Sat Sep  5 13:03:44 2020 [pid 11497] [User] FTP response: Client "IP", "226 Directory send OK."

LAN内のローカルIPがレスポンスされてるようだが、ポート転送設定でLAN側21番ポートを使ってFTPサーバと光BBユニットが通信する時に限り、自動的にこのレスポンスをグローバルIPに書き換えている模様。
ただ、光BBがこの仕様だと、LAN内もLAN外からも同じポートの設定を使ってアクセスしたいとき、光BBユニットはポート転送でWAN側21-21,LAN側21-21にしないと出来ないことになっちまう。つまりセキュリティ考慮して外から21番使いたくない場合は諦めてクライアントにLAN内容とLAN外用で別々に設定を2つ準備しなきゃならんということである。まぁでも背に腹は変えられないので、諦めてどちらかの方法で運用することにする。

まとめ(愚痴)

ソフトバンク光の光BBユニットはとりあえずクソだということが分かった。以前ヘアピンNATが出来ないと知ったとき糞だと思ったが、こんなところでさらなる隠れ糞仕様が見つかってもっとクソだと思った。この21番以外のFTPの通信はアドレスを変換して、他のポートでの通信は変化しないって仕様、取扱説明書にも書いてないし、公式のページにも書いてないし、チャットサポートで問い合わせたら「本窓口で対応できる範疇を超えてるので月540円のBBサポートワイドサービスに登録してその電話番号に連絡してくれ」って言われてゴミカスサービスだと思った。

しかもこのうんこの塊みたいな光BBユニットをレンタルするのに毎月540円払ってる。光BBレンタルしなきゃええやんって思うかもしれないけど、ソフトバンク光は光BBユニットを挟まないと絶対にIPv6通信できない仕様になってる。IPv6使えなきゃIPv6 IPoE + IPv4とIPoEが使えないから実質通信速度が落ちちまう。

とりあえず次、光回線業者選ぶ時は二度とソフトバンク光は使わない

追記
一応知恵袋で聞いてみたら一般的なルータは21番ポート以外は普通はftpのパケットをチェックしないらいしい。でも光BBユニットがうんちなことに変わりない。