Kozupon.com    
 
 DMZを考慮したファイアーウォールの構築!


某社のネットワークは、DMZを考慮したGWファイアーウォール構造になっている。以下の図でBBルータの役目はPPPOEとDMZゾーンを作るために配置している。図では見えてないが、DMZゾーンには同社Webサーバが設置されている。斜線のファイアーウォールは、WAN/LANのゲートウェイになっていて、カーネルiptablesによるフォワードチェーンフィルタが施されている(iptablesの詳細は、 ここ を参照のこと)。以降、このiptablesの設定について説明する。

■ 以下某社DMZを配置したネットワーク構成図。

図1(某社ネットワーク)


1.ファイアーウォール

図1の斜線のファイアーウォールは、

Debian GNU Linux3.1
Sarge Kernel2.6.8NIC二枚差し

でiptablesを使って構成している。ここでのフィルタリングは、BBルータでWAN側からのアクセスは全てブロックされているので、基本的にLAN→WANのアクセスを規制している。串を刺しているため、LAN側からのHTTPアクセスはProxy経由でアクセスすることとしている。そのため、iptablesのチェーンはFORWARDチェーンのみを規定して、後はIPマスカレードを有効にしている。2項にiptablesの設定内容を記載する。


2.iptablesの設定内容

1) iptablesのシェルの内容
iptablesの設定内容は、 set_fw.sh と言う名前でシェル化している。これを、 /usr/local/sbin ディレクトリに置いて起動時に自動実行している。

# more set_fw.sh
#!/bin/sh

# WANとLANのI/Fを定義
WAN=eth1
LAN=eth0

# 各種カーネルモジュールをロードする
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ipt_state
modprobe ipt_MASQUERADE

# Enable ip forward IPフォワーディングを許可する
echo 1 > /proc/sys/net/ipv4/ip_forward

#flash all disable フィルタ定義とマスカレード定義を初期化する
iptables -F
iptables -t nat -F
iptables -X
iptables -Z

# デフォルトは、フォワードチェーン禁止、インプット・アウトプットチェーンは許可する
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# IPマスカレードを設定する
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE

# 応答パケットを許可して、接続状態を確認する
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMP pingパケットの内→外への通過を許可する
iptables -A FORWARD -i $LAN -p icmp -j ACCEPT

# 20〜23、25、110、587、995、2401、6660〜6667番のTCPパケットの内→外への通過を許可する
iptable -A FORWARD -s 192.168.0.0/16 -p tcp --dport 20 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 21 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 23 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 25 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 53 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 110 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 587 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 995 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 2401 -j ACCEPT

iptables -A FORWARD -s 192.168.0.0/16 -p udp --dport 53 -j ACCEPT

# 固定IPを持つサーバはいかなるパケットも内→外への通過を許可する(192.168.0.1〜192.168.0.15迄)
iptables -A FORWARD -s 192.168.0.0/28 -p all -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/28 -p all -j ACCEPT

# print list フィルタ&NATポリシーを確認する
iptables -t nat -L -n
iptables -t filter -L -n

# 必要なルーティングの設定。
route add -net 192.168.1.0 netmask 255.255.255.0 gateway 192.168.0.28 $LAN
route add -net 192.168.3.0 netmask 255.255.255.0 gateway 192.168.0.25 $LAN
route add -net 192.168.5.0 netmask 255.255.255.0 gateway 192.168.0.26 $LAN
route add -net 192.168.7.0 netmask 255.255.255.0 gateway 192.168.0.27 $LAN
route add -net 192.168.10.0 netmask 255.255.255.0 gateway 192.168.0.34 $LAN

# MTU値設定
ifconfig eth1 mtu 1454

2)iptablesのチェーンを表示させてみる
gw3:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT 0 -- anywhere anywhere
ACCEPT 0 -- localnet/24 anywhere
ACCEPT 0 -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:telnet
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:submission
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3s
ACCEPT tcp -- anywhere anywhere tcp dpt:cvspserver
ACCEPT udp -- anywhere anywhere udp dpt:domain

Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT 0 -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- localnet/16 anywhere tcp dpt:ftp
ACCEPT tcp -- localnet/16 anywhere tcp dpt:ssh
ACCEPT tcp -- localnet/16 anywhere tcp dpt:telnet
ACCEPT tcp -- localnet/16 anywhere tcp dpt:smtp
ACCEPT tcp -- localnet/16 anywhere tcp dpt:domain
ACCEPT tcp -- localnet/16 anywhere tcp dpt:pop3
ACCEPT tcp -- localnet/16 anywhere tcp dpt:submission
ACCEPT tcp -- localnet/16 anywhere tcp dpt:pop3s
ACCEPT tcp -- localnet/16 anywhere tcp dpt:cvspserver
ACCEPT udp -- localnet/16 anywhere udp dpt:domain
ACCEPT 0 -- localnet/28 anywhere
ACCEPT 0 -- anywhere localnet/28

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


3.自動起動をさせるには(Debianの場合)

/etc/init.d/networkingファイルに追加する。以下参照(赤字の一行を追加する)。
gw3:/etc/init.d# vi networking
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: networking
# Required-Start: mountkernfs ifupdown $local_fs
# Required-Stop: ifupdown $local_fs
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Raise network interfaces.
### END INIT INFO

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

[ -x /sbin/ifup ] || exit 0

. /lib/lsb/init-functions

spoofprotect_rp_filter() {
[ -e /proc/sys/net/ipv4/conf/all/rp_filter ] || return 1
RC=0
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f || RC=1
done
return $RC
}

spoofprotect() {
log_action_begin_msg "Setting up IP spoofing protection"
if spoofprotect_rp_filter; then
log_action_end_msg 0 "rp_filter"
else
log_action_end_msg 1
fi
}

ip_forward() {
log_action_begin_msg "Enabling packet forwarding"
if echo 1 > /proc/sys/net/ipv4/ip_forward; then
log_action_end_msg 0
else
log_action_end_msg 1
fi
}

syncookies() {
log_action_begin_msg "Enabling TCP SYN cookies"
if echo 1 > /proc/sys/net/ipv4/tcp_syncookies; then
log_action_end_msg 0
else
log_action_end_msg 1
fi
}

doopt() {
optname=$1
default=$2
opt=`grep "^$optname=" /etc/network/options || true`
if [ -z "$opt" ]; then
opt="$optname=$default"
fi
optval=${opt#$optname=}
if [ "$optval" = "yes" ]; then
eval $optname
fi
}

process_options() {
[ -e /etc/network/options ] || return 0
log_warning_msg "/etc/network/options is deprecated (see README.Debian of ne
tbase)."
doopt spoofprotect yes
doopt syncookies no
doopt ip_forward no
}

case "$1" in
start)
process_options
log_action_begin_msg "Configuring network interfaces"
if ifup -a; then
log_action_end_msg $?
else
log_action_end_msg $?
fi
/usr/local/sbin/set_fw.sh
;;

stop)
if sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\2/p' /proc/mounts |
grep -qE '^(nfs[1234]?|smbfs|ncp|ncpfs|coda|cifs)$'; then
log_warning_msg "not deconfiguring network interfaces: network share
s still mounted."
exit 0
fi

log_action_begin_msg "Deconfiguring network interfaces"
if ifdown -a --exclude=lo; then
log_action_end_msg $?
else
log_action_end_msg $?
fi
;;

force-reload|restart)
process_options
log_action_begin_msg "Reconfiguring network interfaces"
ifdown -a --exclude=lo || true
if ifup -a --exclude=lo; then
log_action_end_msg $?
else
log_action_end_msg $?
fi
;;

*)
echo "Usage: /etc/init.d/networking {start|stop|restart|force-reload}"
exit 1
;;
esac

exit 0


4.グローバル側からのポートスキャン結果
グローバル側から、このホストへ向けてポートスキャンを行った結果は以下の通り。

[root@sub2 ~]# nmap gw3.xxxxxxxx.co.jp

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2007-06-19 09:07 JST
Interesting ports on 210.xxx.xxx.xxx:
Not shown: 1670 filtered ports
PORT STATE SERVICE
20/tcp closed ftp-data
21/tcp closed ftp
22/tcp closed ssh
23/tcp closed telnet
25/tcp closed smtp
53/tcp closed domain
110/tcp closed pop3
587/tcp closed submission
995/tcp closed pop3s
2401/tcp closed cvspserver

Nmap finished: 1 IP address (1 host up) scanned in 70.810 seconds

以上


 
 
 



Copyright 2007 Kozupon.com.