포럼: Open Discussion (Thread #2065)

iptables (2003-02-20 14:52 by naohki #3932)


iptablesの設定をupします
これは前にupした設定と同等の内容になっています。

eth1が 192.168.254.254 これが外側(インターネット側)とします
eth0が 192.168.2.1 これが内側(ローカル側)とします
192.168.2.124 にDMZ内のwebサーバとsshサーバがあるとします。
192.168.255.100と192.168.254.200はそれぞれsshの接続を許すアドレスです
内部のサーバはインターネットに対してルータを通じたルーティングがされているとします

ポリシーは

内部からのパケットは許す、内部からの要求に対する返答は外部からも
許す。マスカレードする。

外部からwwwとsshは192.168.2.124へ転送するsshは許可された人のみ

ログは残す

ルータに対してはeth0からの接続のみを許す

ルータからの外部や内部への通信は許す。

iptables-saveの内容です。切り取って
iptables-restore < ファイル名
で内容を反映します。

説明は後ほど

#-----------------------------------------------------------------------------------------------
# Generated by iptables-save v1.2.7a on Thu Feb 20 14:30:35 2003
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 192.168.254.254 -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.124:80
-A PREROUTING -d 192.168.254.254 -i eth1 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.2.124:22
-A POSTROUTING -o eth1 -j MASQUERADE
COMMIT
# Completed on Thu Feb 20 14:30:35 2003
# Generated by iptables-save v1.2.7a on Thu Feb 20 14:30:35 2003
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:1060]
:logdeny - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ! eth1 -m state --state NEW -j ACCEPT
-A INPUT -i eth1 -j logdeny
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ! eth1 -m state --state NEW -j ACCEPT
-A FORWARD -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.255.100 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.254.200 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A FORWARD -i eth1 -m state --state INVALID,NEW -j logdeny
-A FORWARD -j DROP
-A logdeny -j LOG
-A logdeny -j DROP
COMMIT
# Completed on Thu Feb 20 14:30:35 2003
#---------------------------------------------------------------------------------------------

RE: iptables (2003-02-20 16:03 by naohki #3933)

すんげー簡単に説明します。

正確な情報が知りたい方は
# man iptables
http://www.linux.or.jp/JF/JFdocs/NAT-HOWTO.html
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO.html
を参照ください

この情報を使うのはかってですが、私は責任を持ちませんのでよろしくお願いします。

NATやマスカレードやポートフォワーディングをしたい場合は
*natのところに書きます

パケットフィルターをしたいときには
*filterに書きます。

ルータ当ての物は -A INPUT をつける
フォワードする物は -A FORWARD にする

と言う感じです。

ここで
:logdeny - [0:0]
-A logdeny -j LOG
-A logdeny -j DROP
と言うような記述があります。

これはlogdenyというテーブルを新たに作っています
説明としては
-A logdeny -j LOG ログを取る!!
-A logdeny -j DROP パケットを落とす(通さない)
と言う感じです
実際のコマンドとしては
iptables -N logdeny
iptables -A logdeny -j LOG
iptables -A logdeny -j DROP
をやったのと同じになります。

では各行の説明

# Generated by iptables-save v1.2.7a on Thu Feb 20 14:39:11 2003
*nat NATやマスカレードやポートフォワーディングに関することをかく
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

eth1から192.168.254.254の80番ポート当てにきたパケットの行き先を192.168.2.124:80にする
-A PREROUTING -d 192.168.254.254 -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.124:80

eth0から192.168.254.254の22番ポート当てにきたパケットの行き先を192.168.2.124:22にする
-A PREROUTING -d 192.168.254.254 -i eth1 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.2.124:22

eth1から出てゆくパケットはeth0のアドレスでマスカレードする
-A POSTROUTING -o eth1 -j MASQUERADE

COMMIT
# Completed on Thu Feb 20 14:39:11 2003
# Generated by iptables-save v1.2.7a on Thu Feb 20 14:39:11 2003
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:1076]
:logdeny - [0:0]

<<ルータ当て>>
接続が確立してたり、要求に対する応答である物は許可する
(前は123とか53をこべつに許可していましたがいらないようです)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

eth1以外からの接続要求パケットは許可する
-A INPUT -i ! eth1 -m state --state NEW -j ACCEPT

eth1からのその他のパケットはすべて不許可にしてログを取って落とす
-A INPUT -i eth1 -j logdeny

<<転送パケット>>
接続が確立してたり、要求に対する応答である物は許可する
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

eth1以外からの接続要求パケットは許可する
-A FORWARD -i ! eth1 -m state --state NEW -j ACCEPT

eth1からの80番ポート(www)へのパケットは許可する
-A FORWARD -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT

eth1で192.168.255.100からのssh接続要求は許可する
-A FORWARD -s 192.168.255.100 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

eth1で192.168.254.200からのssh接続要求は許可する
-A FORWARD -s 192.168.254.200 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

eth1からの不正なパケットまたは接続要求パケットはログを取って落とす
-A FORWARD -i eth1 -m state --state INVALID,NEW -j logdeny

それ以外のパケットはすべて落とす
-A FORWARD -j DROP

ログテーブルの設定ログをとる
-A logdeny -j LOG
落とす
-A logdeny -j DROP
COMMIT
# Completed on Thu Feb 20 14:39:11 2003

Reply to #3932

iptables セキュリテーホール (2003-02-20 16:40 by naohki #3935)


うむこれはちょっとセキュリテーホールガありますな

どこだか当ててください

<<考える時間1時間>>

では答えです

-A FORWARD -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.255.100 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.254.200 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
ここなんですが

同じサブネット内のマシンからクラックを受けた場合、これでは80番ポートについては自由に
どのマシンにでもつなぎにいけますし

22番ポートについてはルータとなっているマシンからのクラックである場合は内部の好きな
マシンに対して接続に行くことができます。

方法としてはクラックするマシンから192.168.2のセグメントに対して、192.168.254.254をルータとするルーティングを
設定して後はふつうに http://192.168.2.20 などどすればいいです
192.168.2.124以外のマシンにつなげます。
(とはいえ試験してないからなできないかも・・・できなければOKだ)

と言うことで

-A FORWARD -i eth1 -d 192.168.2.124 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.255.100 -d 192.168.2.124 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.254.200 -d 192.168.2.124 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

と言う風にするととりあえず192.168.2.124だけに対してパケットが行きます。

22番はこのように考えると接続できるのが許可IPだけではないのですが、ここはsshdの設定で
逃げることとします。
(ルータがクラックされてしまっては手の打ちようが少ないです。)


Reply to #3932

iptables コマンドライン (2003-02-20 16:52 by naohki #3936)

コマンドラインから同じポリシーを反映するために

実行する場合

リモートでやらないでください。ローカルでルートでやってください
リモートでやると、場合によっては二度と接続が戻ってきません・・・
(デフォルトポリシーがDENYの場合)

ローカルで作業してください。

iptables -F
iptables -t nat -A PREROUTING -d 192.168.254.254 -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.124:80
iptables -t nat -A PREROUTING -d 192.168.254.254 -i eth1 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.2.124:22
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i ! eth1 -m state --state NEW -j ACCEPT
iptables -t filter -A INPUT -i eth1 -j logdeny
iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i ! eth1 -m state --state NEW -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.2.124 -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -t filter -A FORWARD -s 192.168.255.100 -d 192.168.2.124 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -t filter -A FORWARD -s 192.168.254.200 -d 192.168.2.124 -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -t filter -A FORWARD -i eth1 -m state --state INVALID,NEW -j logdeny
iptables -t filter -A FORWARD -j DROP
iptables -t filter -N logdeny
iptables -t filter -A logdeny -j LOG --log-level 5
iptables -t filter -A logdeny -j DROP

です
Reply to #3932