とっておきの手土産を教えて

こんにちは。
iptablesの学習でテスト用のFWサーバーと2台のWebサーバーをつくりました。
いまはForwardでアクセスごとに転送先を振り分ける実験をしています。
FTPのForward設定でわからないことがあるので質問させてください。


やりたいこと:
ip_conntrack_ftpを組み込めばiptablesにいちいちパッシブ通信の使用ポートすべてを指定しなくても、モジュールが自動で制御してくれるという情報をネットで見かけ、それをやってみようと考えています。ところがどうがんばってもFTPのパッシブモードがつながりません。FTP以外のサービス、たとえばDNS, NTP, HTTP等のForwardは問題なく行えています。



環境:
FWサーバー → CentOS6 iptablesで外部からのアクセスをブロックしたり、振り分けたり。
WEBサーバー → CentOS6 apacheとvsftpdでWebサーバーを構成。iptables無効です。
ルーター → 業務用ですがファイアウォール等はすべて無効になっています。

111.222.333.0はグローバルIPアドレスです。
192.168.1.0はローカルIPアドレスです。

                             -eth0(WEB_SERVER1)
                             | 192.168.1.2(→111.222.333.2)
(ONU)-(ROUTER)-eth0(FW_SERVER)eth1----|
       111.222.333.1(eth0)          |
       111.222.333.2(eth0:1)         -eth0(WEB_SERVER2)
       111.222.333.3(eth0:2)          192.168.1.3(→111.222.333.3)
       192.168.1.1(eth1)

FWサーバーのiptable設定:
net.ipv4.ip_forward = 1
ip_conntrack_ftpモジュール有効
ip_nat_ftpモジュール有効
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

.
.(一部省略)
.

# HTTP
iptables -A FORWARD -p tcp -i eth0 -o eth1 -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -m multiport --sport 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT

# FTP(ここをどうしたらいいのかわからない)
iptables -A FORWARD -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp --sport 21 -j ACCEPT

# Webserver1
iptables -t nat -A PREROUTING -i eth0 -d 111.222.333.2 -j DNAT --to-destination 192.168.1.2
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.2 -j SNAT --to-source 111.222.333.2

# Webserver2
iptables -t nat -A PREROUTING -i eth0 -d 111.222.333.3 -j DNAT --to-destination 192.168.1.3
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.3 -j SNAT --to-source 111.222.333.3

上記設定でFTPのForward部分をmultiportにしてポート20を入れたり除いたり、NEWやESTABLISHEDやRELATEDを入れたり消したり、いろいろ試行錯誤していますがFilezillaで下のようなエラーがでます。

PASV
レスポンス:227 Entering Passive Mode (111,222,333,2,92,226).
コマンド:LIST
エラー:接続タイムアウト
エラー:ディレクトリ一覧表示の取り出しに失敗しました

説明が長くて恐縮ですがよろしくお願いします。
<(_ _)>

A 回答 (1件)

うーん。

こうしたらどうでしょう。

# HTTP
iptables -A FORWARD -p tcp -i eth0 -o eth1 -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -m multiport --sport 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT
# FTP(ここをどうしたらいいのかわからない)
iptables -A FORWARD -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp --sport 21 -j ACCEPT

iptables -A FORWARD -p tcp -m state --state ESTABLISHED,RELATED -jACCEPT (1)
iptables -A FORWARD -i eth0 -o eth1 -p tcp -m state --state NEW -m multiport --dport 21,80,443 -j ACCEPT (2)

まずは上の2行(1)(2)でHTTP通信ができる事を確認して欲しい。なぜこれでうまくいくかというと、eth0から入ってきてeth1に出ていく80番への接続要求パケットは(2)で許可されるが、そこからの戻りパケットならびにその後の通信は(1)で許可される(ESTABLISHEDステート)。

その後でFTPの検証をしましょう。まず、FTPコネクションはHTTPと同じく(2)から(1)のコンボで通信できる。さらに、(1)のstateにRELATEDというものを加える(アンドip_conntrack_ftpとip_nat_ftp)事でFTP-DATAコネクションもいける、はず。パッシブFTPでもアクティブFTPでもいける、はず。

セキュリティのためには(2)はもう少し入れた方が良い。
iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.1.2 -m state --state NEW -m multiport --dport 21,80,443 -j ACCEPT (2)'
iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.1.3 -m state --state NEW -m multiport --dport 21,80,443 -j ACCEPT (2)''
あて先IPアドレスを指定する事で、192.168.1.2と192.168.1.3以外のノードを192.168.1.0のセグメントに接続した場合でも2と3以外の80番とかにはインターネットから到達させないようにするのだ。
ここで指定するのはローカルIPアドレスだ。なぜかというとfilterテーブルのFORWARDチェインに到達したパケットは先にnatテーブルのPREROUTINGチェインにてDNATされているからだ。このようにiptablesはチェインの順番を意識して組み立てないといけない事も多いのでチェインの流れを調べておくと良いだろう。
    • good
    • 0
この回答へのお礼

ご教示いただいた内容でちゃんと動きました。
助かりました。
ありがとうございます。

お礼日時:2014/01/24 10:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報