2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

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

以上

コメント