あ「すでに稼働しているこの自分のサーバーにFTPを構築しなきゃならないの…。ルーターの中にいて外からアクセスできるようにするには……ポートを開けるのはよいとして………うーん、どうしようー><」
ル「それなら私に任せて! てぃんくるてぃんくる vsftp のデーモンさん、動いてー!」
(ぽん)あ「わぁ、ちゃんとデーモンが動き始めたよー♪ よーし、じゃぁマク●ナルドに移動して、外からアクセスできるか実験だよ☆」
(到着。ハッピーセットを注文するあか●ちゃん)あ「FFFTPを起動して…アクセス…!」(かちかちっ…
あ「……あ、あれ? 繋がらないよル●ー?」
ル「あれー?おっかしいなぁー……ちゃんとデーモンさんは動いてるのになぁ…」
ラ「ログに何か出てるラブー」(ナゲット食いながら)
あ「あー!『ダウンロードのためにホスト 192.168.0.1 (20) に接続しています.』 って、ローカルのIPに接続しようとしてるよー! これじゃぁ繋がるわけないよー!」
ル「あれれー?ホントだー… でも何でローカルIPなのかなぁ…」
ラ「まったく使えない兎ラブー」(おもちゃ で遊びながら)
…絶対無ぇ会話やなぁ。(ぉ
困った
こんなネットワーク。ルーターの 202.26.x.x は DDNS なので停電とかすると変わります。*1
こんな環境で FTP鯖 を構築したのですが、外から example.ir9.jp 接続すると認証までは上手くいく物の、ファイルの一覧を取りに行くところで「ダウンロードのためにホスト 192.168.0.1 (20) に接続しています. → 接続できません.」となり、接続出来ないのでありました。
まぁそれもそのはず、FTP鯖はDNSも動いてます。example.ir9.jp は自分のサーバーの事をさし、ローカルでは 192.168.0.1 なんですね。 vsftpd.conf で "pasv_address=example.ir9.jp" と指定しているも、クライアントに送り返す際はホスト名を解決したIPアドレスが返される…すなわちホスト名を「サーバー側が解決」するワケです。
サーバーさんはホスト名の解決に自分自身に問い合わせます → 192.168.0.1 です → クライアントさん 192.168.0.1 にアクセスしてね → ク「繋がらないじゃねーか!クソが!」
…全く、ひどい世の中になったモンですね。
ってか、FTPのプロトコルの仕様が明らかにおかしいと思いますねコレ…。最初に example.ir9.jp に接続しに行ってるんだから、そこに問い合わせるようにすれば良いと思うんだけどなぁ…。 もしくはレスポンス時はホスト名自体をクライアントに投げちゃうとか…
対策
結局こうなりました。(もっと良い方法あるんッスかね…)
- DDNS で ftp.ir9.jp を新たに追加。…とはいえ結局自宅のルーターへ向くようにする。
- vsftpd.conf で "pasv_address=ftp.ir9.jp" と設定する。
- ローカルのDNSサーバーで、zone "ir9.jp" に ftp.ir9.jp を追加。 んで、この名前だけ、外のネームサーバーを見に行くように設定 → グローバルのIPが取れる!
ftp.ir9.jp は DDNS の名前を解決してくれるサーバー*2に問い合わせれば、FTP鯖が名前を解決しようとした際にグローバルのIPを引っ張ってこれるので、レスポンスでグローバルIPが返せる → クライアントはグローバルIPを使って接続を試みられる! → キタコレ!
となりました。えがったえがった
勉強になったこと - DNSの解決方法
ftp IN NS ns1.value-domain.com
とか設定すれば、特定のドメインだけ別のネームサーバーに問い合わせるようにすることが出来たのねぇーと。
*.ir9.jp の問い合わせは ir9.jp を解決出来るネームサーバーで全てのIPを解決しなきゃならんのかと思ってましたわ。zone ファイルに IP 固定では書けないしなぁ…と結構悩んでました。 「大体は知ってるけど、この名前については俺は知らんからあっちに行って聞いてくれよ」と書けちゃうのは勉強になりました。
あと、当初は DDNS(というか、Value Domain の設定で)を
a example 202.26.x.x *3 cname ftp example
って設定した所、ローカルサーバーさん ftp.ir9.jp を 192.168.0.1 に解決しちゃってコケました。 そりゃそうですよね。ftp.ir9.jp の名前を解決しようと外まで買い物に出かけた結果「ftp は example と一緒の所」って事をローカルサーバーさんに持ち帰ってくるわけですよ。 んでも、ローカルサーバーさんが知ってる example.ir9.jp は 192.168.0.1 だもんねー と(ぉ orz
あ、ちなみに今更ですが、DNSを廃止とかはナシです。
個人的に、ローカルLAN内から example.ir9.jp にアクセスする際、毎回ルーターを通ってからローカルのサーバーにアクセスしに行くのはダサイよなぁ…と感じていまして…。 …いやまぁ、ftp.ir9.jp だけはルーター経由にはなっちゃうんですが、そもそもローカルだったら samba で見に行くから問題なしです(ぉ
あと、ハブは 1000Base-T なんですが、ルーター・ハブ 間は 100Base-TX なのでちょっとガッカリだよねー 的な。
んまぁ手間は掛かりましたが勉強にはなったので結果オーライかなぁと思ってます。 …あぁ、今更FTP使うなって? …男には事情があるとばいよォ…!
※各ホスト名は架空の物です。