vsftpdをパッシブモードで動かすときに微妙に四苦八苦したオハナシ
2008/04/15 19:36:43 初期投稿
2008/06/26 加筆しました。加筆分は最後に。
プロバイダを二つ契約していて、ftpのみAで他はBで繋ぐときのお話。
まぁ慣例に従って、DNS鯖に
tndl.net a BのグローバルIP
ftp.tndl.net a AのグローバルIP
という感じにAレコードでftp.tndl.netを作ってあげる。
そしてvsftpdの設定rpmとかでインストールすると、
/etc/vsftpd/vsftpd.confあたりにある。
デフォルトのconfigファイルには書いてない設定が色々あるので、自分で付け足すのがメイン
うちではこんな感じ、
#
# PASV MODE
#
# パッシブモードを使うか YES/NO
pasv_enable=YES
# 相手に通知するIPアドレス
pasv_address=ftp.tndl.net
# pasv_addressで指定したホスト名をドメイン名のまま通知するか、
# サーバーマシンからIPを引いてIPアドレスにして通知するか
# YES=ドメイン名/NO=IPアドレス
pasv_addr_resolve=YES
# パッシブモードで使うポート番号の開始番号
pasv_min_port=10024
# パッシブモードで使うポート番号の終了番号
pasv_max_port=10048
ここでミソなのが、pasv_addressの設定でここにグローバルIP(A)を入れれば外部からは接続できるが、内部から接続しようとすると使っているルータによっては接続できない。
しかし、ドメイン名を指定してやることによって、hostsファイルもしくは内部でDNS鯖を建てていればそこからIPを引いてきて内部LANのIPで接続できる。
しかし、pasv_addr_resolveをYESにしておいても公式のソースからbuildしたやつだとなぜか無視されてるようで、内部からの接続でもグローバルIPを返してきて接続できない。
そこで、Extended vsFTPd buildsのソースを使ってbuildしたものをバイナリファイルを入れ替えてやるとうまく動作してくれた。
ファイルは記事を書いてる時点の物なので最新版がないかチェックすることをオススメする。
$ wget http://vsftpd.devnet.ru/files/2.0.6/ext.1/vsftpd-2.0.6-ext1.tar.gz
$ tar xvzf vsftpd-2.0.6-ext1.tar.gz
$ cd vsftpd-2.0.6-ext1
$ wget http://vsftpd.devnet.ru/files/2.0.6/ext.1/patch/utf8.patch
$ patch < utf8.patch
$ make
ここで、yumなどでインストールしてある場合はその実行ファイルをリネームでもして
buildされたvsftpdにシンボリックリンクでも張っておけばおk
CentOS5でyumを使ってインストールした場合
$ cd /usr/sbin
# service vsftpd stop
# mv vsftpd vsftpd.org
# ln -s /usr/local/src/vsftpd-2.0.6-ext1/vsftpd vsftpd
(※自前buildのvsftpdの場所はそれぞれ)
# service vsftp start
P.S.
Extended vsFTPd builds(http://vsftpd.devnet.ru/eng/)のソースは色々修正してあり、
独自のオプションもあるのでそれについては後日別の記事を書くつもり。
つもり、なのであまり期待してほしくはない。
・加筆
いつのまにか修正されていたのか、はじめからボクの設定が悪かったのかExtended vsFTPdじゃなくても普通にドメイン名で通るみたいです。