iptablesを使った、常時接続 linux firewall routerの設定 その2
sorry Japanese only
最終更新日 2005/02/11
page size = Mbyte


関連するページ iptables iptables2 iptables3+brctl

自宅内側が 1枚増えて説明も変わったので新しいページにしました。

最終目標は、以下の図のような構成を目指します。


(1) Bフレッツ用 ONUへは linux PCの eth2に接続
eth2では kernel mode pppoeにて @niftyと IIJ4Uの切り替えが可能な常時接続を行う。
@niftyと IIJ4Uは、負荷分散する為、数日ごとの自動切り替えにする。
(2) internetから ppp0へ入ってきた PORT80と 8080のパケットは linuxで動作している apacheへ振り分ける。(INPUTの部分許可)
(3) ppp0から入ってきたパケットを eth1,eth2へは通さない。(FOWARDの禁止) (3) ppp0から入ってきたその他の通信は拒否(INPUTの原則拒否)
(4) eth0,1の win機からは linux PCを telnet,ftpなどフルコントロールできるようにする(eth0,1からの INPUTは ACCEPT)
(5) eth0,1から ppp0へは無条件で通信を通す(FORWARDの許可)
(6) eth0,1の間の通信は Hubと同じく全て無条件許可にする。(FOWARDの特定許可)

要は、パケットフィルターが出来ます。
eth0,1間の通信は Hubに繋いでいるときと同じように動作させたい。

って市販の Hub機能付きで頭が悪い普通のルーターと同じ事をやらせたいだけです、ハイ。


序文
使えるようにする
rp-pppoeの組み込み
その1の方をご覧下さい。

iptablesの設定 序文

iptablesはセキュリティに役立ちますが、最低限何を設定すれば良いのか、どこまでやるのが適切か。
非常に難しい問題です。私も良く分かっていません。
google検索 linux iptables セキュリティ 等で表示されるサイトを読んで、自分はどんな設定をするか、
目標を決めて作り込んでいくのが良いと思います。
自分の目標を決めないで作っていくと、これもあれもと大変なことになります。

私は、上記サイトを読んで各種攻撃に備えた設定を作ってみましたが、ログが増えるばかりで
意味の無い気がしたので、#でコメントアウトにしてしまっています。

注:iptablesがきちんと動作するまでは ppp接続は切っておいた方が無難です。

iptablesの設定

まずは設定の初期化。
[root]# iptables -F
[root]# iptables -X

さあ、いきなり linuxにアクセスできなくなったあなた。私と同じです。
そのままアクセスできている人はラッキーでした。
INPUTの基本ルールが DROPになっていると、通過の許可をしていたルールを -Fでクリアーしたとたん telnetとかで入っていた人は拒絶されて端末フリーズします。

linux本体のキーボードを引っ張り出して
iptables -P INPUT ACCEPT
で INPUTの基本ルールを許可にしておきましょう・・(前途多難を予想させる出来事)

クリアーされたのを確認します。
[root]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root]#
全て ACCEPTで firewallの機能無しの状態です。

この状態から、目指すルールを作っていきます。

で、出来上がったのがこのルールです。

#!/bin/sh

#iptablesコマンド使った firewallの設定スクリプト
#
LOCAL_NET='192.168.0.0/24'
LOCAL_NET2='192.168.1.0/24'

#基本ポリシー (-Pオプション)の設定
#INPUTは拒否 DROP
#OUTPUTは許可 ACCEPT
#FORWARDは拒否 DROP
#
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#個別ルールを全削除
#
iptables -F
iptables -t nat -F

#ユーザー定義チェインを削除
#
iptables -X

#ループバックに関してはすべて許可
#
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#自分が発するコマンドを許可
#
#iptables -A INPUT -i lo -j ACCEPT
#(この設定はセキュリティー上良くなかった?)
#(次の行の設定に変更しました)
iptables -A INPUT -s 192.168.0.25 -d 192.168.0.25 -j ACCEPT

#eth0,1から入ってくる LOCAL NET PCからの通信を許可
#
iptables -A INPUT -i eth0 -p all -s $LOCAL_NET -j ACCEPT
iptables -A INPUT -i eth1 -p all -s $LOCAL_NET2 -j ACCEPT

# 発信元が loop back private addressのパケットを拒否
# IP偽装した IPスプーフィング対策
#
iptables -N ip-spoofing
iptables -A INPUT -i ppp0 -s 127.0.0.0/8 -j ip-spoofing
iptables -A INPUT -i ppp0 -s 10.0.0.0/8 -j ip-spoofing
iptables -A INPUT -i ppp0 -s 176.16.0.0/12 -j ip-spoofing
iptables -A INPUT -i ppp0 -s 192.168.0.0/16 -j ip-spoofing
#iptables -A ip-spoofing -m limit \
#  --limit 1/s --limit-burst 4 -j RETURN
iptables -A ip-spoofing -j LOG --log-prefix "IP SPOOFING:"
iptables -A ip-spoofing -j DROP

# SYN-FLOODING対策 
#
#iptables -N syn-flood
#iptables -A INPUT -i ppp0 -p tcp --syn -j syn-flood
#iptables -A syn-flood -m limit --limit 10/s --limit-burst 4 -j RETURN
#iptables -A syn-flood -j LOG --log-prefix "IPTABLES SYN-FLOOD:"
#iptables -A syn-flood -j DROP

# ping of death対策
# 
#iptables -N ping-death
#iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-request -j ping-death
#iptables -A ping-death -m limit --limit 2/s --limit-burst 4 -j RETURN
#iptables -A ping-death -j LOG --log-prefix "IPTABLES PING-DEATH:"
#iptables -A ping-death -j DROP

# ポートスキャナーからの対策
#
#iptables -N port-scan
#iptables -A INPUT -i ppp0 -p tcp \
#   --tcp-flags SYN,ACK,FIN,RST RST -j port-scan
#iptables -A port-scan -m limit --limit 1/s --limit-burst 4 -j RETURN
#iptables -A port-scan -j LOG --log-prefix "IPTABLES PORT-SCAN:"
#iptables -A port-scan -j DROP

# 特定の IPアドレスからの INPUTを拒否する
#
iptables -A INPUT -i ppp0 -s 202.108.1.10 -j DROP
#iptables -A INPUT -i ppp0 -s 219.104.207.11 -j DROP

# TCP PORT 80,8080の通過を許可
#
iptables -A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# P2Pや MSNメッセンジャー 等 portを開ける必要がある場合の設定
# 内部の httpサーバーを外部へ公開出来たので
# これで多分動作すると思う。
#
#iptables -A PREROUTING -t nat -p tcp --dport 7755 -j DNAT \
#--to 192.168.0.2
#iptables -A FORWARD -p tcp --dport 7755 -j ACCEPT
#iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#パスMTU問題 (2005/02/11追加)
#MTU値の問題から一部の hpが見れない問題を解決。
#
iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu

#eth0,1から ppp0へ向けてのパケットは許可
#
iptables -A FORWARD -i eth0 -o ppp0 -s $LOCAL_NET -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o ppp0 -s $LOCAL_NET2 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#eth0,1間は HUBのように全部通過
#
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# PORT 135 rpc
#      137 netbios
#      138 netbios
#      139 file/printer共有
#      445 file/printer共有
# ppp0へ向けて出て行く以上のパケットは DROP
#
iptables -A FORWARD -p udp -i eth0 -o ppp0 --dport 135:139 -j DROP
iptables -A FORWARD -p tcp -i eth0 -o ppp0 --dport 135:139 -j DROP
iptables -A FORWARD -p udp -i eth0 -o ppp0 --dport 445 -j DROP
iptables -A FORWARD -p tcp -i eth0 -o ppp0 --dport 445 -j DROP
iptables -A FORWARD -p udp -i eth1 -o ppp0 --dport 135:139 -j DROP
iptables -A FORWARD -p tcp -i eth1 -o ppp0 --dport 135:139 -j DROP
iptables -A FORWARD -p udp -i eth1 -o ppp0 --dport 445 -j DROP
iptables -A FORWARD -p tcp -i eth1 -o ppp0 --dport 445 -j DROP

# 送信先が LOCAL ADDRESSの物が ppp0へ向けて出て行ったら DROP
#
iptables -A FORWARD -o ppp0 -d $LOCAL_NET -j DROP
iptables -A FORWARD -o ppp0 -d $LOCAL_NET2 -j DROP

# LANから外に出て行くパケットの送信元IPを書き換え
#
iptables -t nat -A POSTROUTING -o ppp0 -s $LOCAL_NET -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -s $LOCAL_NET2 -j MASQUERADE

# eth0,1間の転送も、送信元 IPを書き換え
iptables -t nat -A POSTROUTING -o eth0 -s $LOCAL_NET2 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -s $LOCAL_NET -j MASQUERADE

# ループバック宛、プライベートアドレス宛のパケットが漏れるのを防ぐ
#
iptables -A OUTPUT -o ppp0 -d 127.0.0.0/8 -j DROP
iptables -A OUTPUT -o ppp0 -d 10.0.0.0/8 -j DROP
iptables -A OUTPUT -o ppp0 -d 176.16.0.0/12 -j DROP
iptables -A OUTPUT -o ppp0 -d 192.168.0.0/16 -j DROP

# NetBIOS over TCP/IP の流出パケットを遮断
#
iptables -A OUTPUT -o ppp0 -p tcp --dport 135:139 -j DROP
iptables -A OUTPUT -o ppp0 -p udp --dport 135:139 -j DROP
iptables -A OUTPUT -o ppp0 -p tcp --dport 445 -j DROP
iptables -A OUTPUT -o ppp0 -p udp --dport 445 -j DROP


これを /etc/ppp/firewall-setting.shという名前で保存します。
実行できるよう
chmod 744 firewall-setting.sh
と実行しておきましょう。

最後に忘れてはならないコマンドが
[root]# iptables-save > /etc/sysconfig/iptables
これをやらないと、次に bootしたときに設定が反映されません。

re-pppoeを使っていて、adsl-setupにて Firewallの設定を
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
に設定した人は /etc/sysconfig/iptablesに書き込んでも立ち上げ時に設定が反映されません。
上で作成した iptables-setting.shを /etc/ppp/firewall-masqへ cpしましょう。
立ち上げ時 firewall-masqが実行されます。

19770
戻る