iptablesと brctlを使った、常時接続 linux firewall routerの設定 その3
sorry Japanese only
PAGE作成日 2005/06/12
最終更新日 2005/06/25
page size = Mbyte


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

自宅内側の Networkカード 2枚を、iptables2の時には別サブネットにして、linuxは一見ルーターのような動作をさせて使っていましたが、今回 Network接続の出来る HDDビデオを購入し、同一Subnetが必須条件だったので、それでは linuxはスイッチングハブのように動作させよう。
って事で、少し設定が変更になったので iptables3ページです。


以下の図のような動作をさせる設定にしました。


(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は brctlを組み込み Bridge動作を行う。(brctlの組み込み)
(6) eth0,1で 192.168.0.5の共通 IPを割り振り (4)が行えるようにする。(FOWARDの特定許可)

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

って市販の Hub機能付きで頭が悪い普通のルーターと同じ事をやらせたいだけです、ハイ。
iptables2の時より、ますます市販のルーターに近くなってきました。

ただし、今回は大作業でした。
以下のような手順で作業を進めました。
(a) kernel sourceから再コンパイルし kernel作り直し
(b) grabの再構築
(c) brctlの組み込み
(d) iptablesの変更

このページでは iptablesの部分だけを書きます。
(a)から(c)は別ページと言うことで。

iptablesの設定

今回は以下のような設定としました。
iptables2からeth0,eth1に関する不要な部分を削除。
brctlを組み込んだことにより、br0というハードウェアーと同等の名称が brctlにて作られているので
eth0,eth1,ppp0と同じように br0というのを用いて iptablesを作っただけです。

#!/bin/sh

LOCAL_NET='192.168.0.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(br0)から入ってくる LOCAL NET PCからの通信を許可
#
iptables -A INPUT -i br0 -p all -s $LOCAL_NET -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

# 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問題
#
iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu

#eth0,1(br0)から ppp0へ向けてのパケットは許可
#
iptables -A FORWARD -i br0 -o ppp0 -s $LOCAL_NET -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 br0 -o ppp0 --dport 135:139 -j DROP
iptables -A FORWARD -p tcp -i br0 -o ppp0 --dport 135:139 -j DROP
iptables -A FORWARD -p udp -i br0 -o ppp0 --dport 445 -j DROP
iptables -A FORWARD -p tcp -i br0 -o ppp0 --dport 445 -j DROP

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

# LANから外に出て行くパケットの送信元IPを書き換え
#
iptables -t nat -A POSTROUTING -o ppp0 -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しましょう。
[root]# cp /etc/sysconfig/iptables /etc/ppp/firewall-masq
立ち上げ時 firewall-masqが実行されます。

22580
戻る