- PR -

ファイヤーウォールの設定

1
投稿者投稿内容
BBS+1
会議室デビュー日: 2003/10/18
投稿数: 5
投稿日時: 2003-10-18 15:41
はじめまして、こんな構成のネットワーク
構築しています、誰か実現された方はいら
っしゃいますか?

┌───────┐
│インターネット│
└───┬───┘
┌───┴───┐
│ADSLモデム│
└───┬───┘
┌───┴───┐
│ダイアルアップ│
│  ルーター  │
└───┬───┘
┌───┴───┐
│   FW   │
└┬──┬──┬┘
 │  │  │
┌┴┐┌┴┐┌┴┐
│D││P││P│
│B││C││C│
│サ││1││2│
│ー││ ││ │
│バ││ ││ │
└─┘└─┘└─┘

FW
 OS:Redhat9
 ネットワーク:LANカード4枚
 フィルタリング:iptables

DBサーバ
 OS:Redhat9
 DB:PostgreSQL(7.3.2-3) 

やりたいこと
1.FWで外部からのアクセスの制限。
2.FWで外部攻撃からの防御。
3.外部から直接DBサーバをアクセス。
4.PC1,PC2の外部へのアクセス許可。

現在出来ていること
1.FWで外部からのアクセスの制限。
2.FWで外部攻撃からの防御。

問題があるが何とか動作している(?)事
4.PC1,PC2の外部へのアクセス許可。
 問題:外部FTPサーバへのログインまでは
    成功するがlsコマンドなどでレスポ
    ンスが帰ってこない。

実現出来ていないこと
3.外部から直接DBサーバをアクセス。
 
何方か3,4の問題を解決された方は
教えてください。



iptablesの定義は次のスクリプトで行いました。

#外部向けアダプタ
EXTDEV=eth0
EXTIP="192.168.0.240"
EXTBASE="192.168.0.0"
EXTBCAST="192.168.0.255"
EXTGATE="192.168.0.254"

#DB向けアダプタ
DBDEV=eth1
DBIP="192.168.1.240"
DBBASE="192.168.1.0"
DBBCAST="192.168.1.255"
DBNET="192.168.1.0/24"

#PC1向けアダプタ
PRODEV=eth2
PROIP="192.168.2.240"
PROBASE="192.168.2.0"
PROBCAST="192.168.2.255"
PRONET="192.168.2.0/24"

#PC2向けアダプタ
SYAGDEV=eth3
SYAGIP="192.168.3.240"
SYAGBASE="192.168.3.0"
SYAGBCAST="192.168.3.255"
SYAGNET="192.168.3.0/24"


#固定定数
LOGOPT="--log-level=3 -m limit --limit 3/minute --limit-burst 3"
SYNOPT="-m limit --limit 5/second --limit-burst 10"


#ファイヤーウォールの設定を全て破棄
iptables -F

#ルーティングテーブルを破棄
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING

#外部からの接続ホストを定義
iptables -t nat -A PREROUTING -i $EXTDEV -p tcp --dport 5432 -j DNAT --to 192.168.1.33
iptables -t nat -A PREROUTING -i $EXTDEV -p udp --dport 5432 -j DNAT --to 192.168.1.33

#内部からの接続はマスカレードで全て許可
iptables -t nat -A POSTROUTING -o $EXTDEV -s $DBNET -j MASQUERADE
iptables -t nat -A POSTROUTING -o $EXTDEV -s $PRONET -j MASQUERADE
iptables -t nat -A POSTROUTING -o $EXTDEV -s $SYAGNET -j MASQUERADE


#INPUTテーブル定義
iptables -F INPUT
iptables -P INPUT ACCEPT


#外部アクセス許可ポートの定義(優先順位高)
#PostgeSQL
iptables -A INPUT -i $EXTDEV -p tcp -s 0.0.0.0/0 -d 0.0.0.0/0 --dport 5432 -j ACCEPT
iptables -A INPUT -i $EXTDEV -p udp -s 0.0.0.0/0 -d 0.0.0.0/0 --dport 5432 -j ACCEPT
iptables -A INPUT -i $EXTDEV -p tcp --sport 5432 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i $EXTDEV -p udp --sport 5432 -m state --state ESTABLISHED -j ACCEPT

#ループバックは許可
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#CodeRedと思わしき攻撃を防御する。(外部モジュールが必要なので現在断念)
#iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
#iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit --limit 1/hour

#外部デバイス向けに届いたパケットの規制
iptables -A INPUT -p tcp --dport ident -j REJECT --reject-with tcp-reset -i $EXTDEV
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -i $EXTDEV
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT -i $EXTDEV

#内部デバイス向けの設定
iptables -A INPUT -j ACCEPT -i $DBDEV
iptables -A INPUT -j ACCEPT -i $PRODEV
iptables -A INPUT -j ACCEPT -i $SYAGDEV

#Internetからの送信元IPアドレスがプライベートアドレスのパケットを破棄
iptables -A INPUT -i $EXTDEV -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $EXTDEV -s 172.16.0.0/12 -j DROP
#iptables -A INPUT -i $EXTDEV -s 192.168.0.0/16 -j DROP

#Internetからの宛先IPアドレスがプライベートアドレスのパケットを破棄
iptables -A INPUT -i $EXTDEV -d 10.0.0.0/8 -j DROP
iptables -A INPUT -i $EXTDEV -d 172.16.0.0/12 -j DROP
#iptables -A INPUT -i $EXTDEV -d 192.168.0.0/16 -j DROP

#ブロードキャストパケットを破棄
iptables -A INPUT -i $EXTDEV -d 255.255.255.255 -j DROP
iptables -A INPUT -i $EXTDEV -d 224.0.0.1 -j DROP

#接続戻りパケットを許可する
iptables -A INPUT -i $EXTDEV -m state --state ESTABLISHED -j ACCEPT

#不正データはログを記録
iptables -A INPUT -j LOG --log-prefix "IPT INPUT: " $LOGOPT
#不明なデバイスからのパケットは破棄する。
iptables -P INPUT DROP


#FORWARD
iptables -F FORWARD
iptables -P FORWARD DROP

iptables -t filter -A FORWARD -i eth0 -o eth1 -p udp --dport 5432 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -p tcp --dport 5432 -j ACCEPT


#内部デバイスと外部デバイスは双方向通信可能にする。
#外部=>内部
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT -i $EXTDEV -o $DBDEV
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT -i $EXTDEV -o $PRODEV
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT -i $EXTDEV -o $SYAGDEV
#内部=>外部
iptables -A FORWARD -m state --state NEW,ESTABLISHED -j ACCEPT -i $DBDEV -o $EXTDEV
iptables -A FORWARD -m state --state NEW,ESTABLISHED -j ACCEPT -i $PRODEV -o $EXTDEV
iptables -A FORWARD -m state --state NEW,ESTABLISHED -j ACCEPT -i $SYAGDEV -o $EXTDEV

#不正データはログを記録
iptables -A FORWARD -j LOG --log-prefix "IPT FORWARD: " $LOGOPT
iptables -A FORWARD -j DROP

#OUTPUT
iptables -F OUTPUT
iptables -P OUTPUT ACCEPT

#ループバックは許可
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#Windows特有ポートの通信は外部に送信しない。
iptables -A OUTPUT -p tcp --dport 135:139 -j DROP -o $EXTDEV
iptables -A OUTPUT -p udp --dport 135:139 -j DROP -o $EXTDEV
iptables -A OUTPUT -p tcp --dport 445 -j DROP -o $EXTDEV
iptables -A OUTPUT -p udp --dport 445 -j DROP -o $EXTDEV

#フィルタリング結果をファイルに格納
chmod 600 /etc/sysconfig/iptables
/sbin/service iptables save
chmod 400 /etc/sysconfig/iptables

iptables -L -v

service iptables status

ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2003-10-18 21:34
PostgeSQLのことは知りませんが...

FTPは、何らかの手を打たなくては通りません。

・クライアントをパッシブモードで使用する(サーバ側が対応している
 必要がありますが、ほとんどは大丈夫でしょう)

あるいは、
・外部からTCP20番への接続要求を受け入れるようにiptablesを設定する
この場合はNAPTが問題になるので、モジュールを追加する必要があります。

きれいな解決としては、
・モジュールを追加してFTPサーバ側からの接続開始がRELATEDとして
 認識されるようにする
この場合も、NAPT越えが問題になるので、そちらにもモジュールが必要かと。

それから、ICMPをほとんど通してないですが、もっと通したほうが無難です。
外部からの接続開始を*非常に*厳しく制限しているわりに、内部からの
接続開始については緩いので、アンバランスな印象を受けます。
Nira
会議室デビュー日: 2003/08/23
投稿数: 15
投稿日時: 2003-10-19 04:50
原因と解決方法が以下のサイトに記載されているようです。

#Connection tracking
http://www.sns.ias.edu/~jns/security/iptables/iptables_conntrack.html

#iptablesの簡単な使い方
http://www3.big.or.jp/~sian/linux/tips/iptables.html

ご参考まで、、
BBS+1
会議室デビュー日: 2003/10/18
投稿数: 5
投稿日時: 2003-10-21 01:41
ぽんすさま、Niraさま早速のご返答ありがとうございます。
明日テストしてみます、結果はココに書きます。
annon
会議室デビュー日: 2003/10/17
投稿数: 2
投稿日時: 2003-10-21 09:43
ipnuts4使うと、iptablesでconnection tracking サポートとしてるので簡単にできるかもしれません。
http://www.ipnuts.net
BBS+1
会議室デビュー日: 2003/10/18
投稿数: 5
投稿日時: 2003-10-21 19:02
FTPはパッシブモードで動作しました。
(W2kにFFFtpをインストールしてインターネット経由でテストしました。)
(*FTPサーバはIIS)
しかし、DOSプロンプトやRedhat LinuxのコマンドでFTPすると動作しないです。
 *ログインとGet,Putは成功するが、lsコマンドが失敗する。


ちなみに

・・・・
iptables -P INPUT ACCEPT

#FTP
iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
#Active ftp
iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Passive ftp
iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
・・・

・・・
iptables -P OUTPUT ACCEPT

#FTP
iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
#Active ftp
iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
#Passive ftp
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
・・・

を追加しました。

依然PostgreSQLはルータを超えてくれないので奮闘中です。
ルータが直接Ackを返してDBサーバまでルーティングしてない!


iptables -t filter -A FORWARD -i eth0 -o 192.168.1.33 -p tcp --dport 5432 -j ACCEPT
とかじゃまずいのかな?

ぽんすさまから御指摘頂いたアンバランスな件はPC1は実はプロキシサーバで配下に接続する
PCはWebとFTP、メールしか使用しないつもりです。
BBS+1
会議室デビュー日: 2003/10/18
投稿数: 5
投稿日時: 2003-10-21 19:05
annonさまのipnuts4をインストールして定義分を
解析するのも手ですね、空きマシンが出来たら
挑戦してみます。
*もうこの形態崩せなくなってしまったので、、、
 できたら結果はここにUPします。
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2003-10-22 14:03
ポートフォワーディングですよね?
たぶん、以下の方法で出来ると思います。
REJECT(DROP)したパケットのログと、そのときのtcpdumpしたパケットの様子を見ると原因の特定がやりやすいかもしれません(^^)

$ForwardInAddr 送信元アドレス
$ForwardOutAddr 送信先アドレス
$PORT 接続ポート

/sbin/iptables -A PREROUTING -t nat -p tcp -d $ForwardInAddr --dport $PORT -j DNAT --to $ForwardOutAddr:$PORT
/sbin/iptables -A PREROUTING -t nat -p udp -d $ForwardInAddr --dport $PORT -j DNAT --to $ForwardOutAddr:$PORT
/sbin/iptables -A FORWARD -p tcp -d $ForwardOutAddr --dport $PORT -o eth1 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d $ForwardOutAddr --dport $PORT -o eth1 -j ACCEPT
1

スキルアップ/キャリアアップ(JOB@IT)