Firewall

Firewallにはiptablesというkernel 2.4から組み込まれた packet filter機能を利用する。iptablesについても書いてあいるので わからない人は、 こちらを参照してほしい。

もどる

ADSL接続

rp-pppoeを使ってADSL接続する場合、設定により、firewall-masq(IPマス カレードする場合) firewall-standalone(IPマスカレードしない場合)が呼ばれる。私は、 IPマスカレードを使う設定なのでfirewall-masqを編集する。 ADSL接続じゃない場合も、同じようなものを作っておいて起動時に 実行すればよい。

firewall-masq

以下にfirewall-masqを示す。あくまで一例ですので、自分なりの工夫や 改造を加えて下さい。ひとまずはこんな感じですが、そのうち もう少し説明を加えるかも。

#!/bin/sh
#
# firewall-masq		This script sets up firewall rules for a machine
#                       acting as a masquerading gateway
#
# Copyright (C) 2000 Roaring Penguin Software Inc.  This software may
# be distributed under the terms of the GNU General Public License, version
# 2 or any later version.
# Interface to Internet
EXTIF=ppp+
INTIF=eth0

LOCAL="192.168.1.0/24"
ANY="0.0.0.0/0"

LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
P_PORTS="0:1023"
UP_PORTS="1024:65535"
TR_SRC_PORTS="32769:65535"
TR_DST_PORTS="33434:33523"

#################################################
# functions 
# 外へでるパケット(と関係するパケット)を許す
AcceptInt() {
protocol=$1
ports=$2
srcs=$3
for port in `echo $ports | sed 's/,/ /g'`
do
    if [ "$srcs" = "" ] ; then
	iptables -A INPUT -i $EXTIF -p $protocol --sport $port \
	    -m state --state ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -o $EXTIF -p $protocol --dport $port \
	    -m state --state NEW,ESTABLISHED -j ACCEPT
    else
	for src in `echo $srcs | sed 's/,/ /g'`
	do
	    iptables -A INPUT -i $EXTIF -s $src -p $protocol --sport $port \
		-m state --state ESTABLISHED -j ACCEPT
	    iptables -A OUTPUT -o $EXTIF -d $src -p $protocol --dport $port \
		-m state --state NEW,ESTABLISHED -j ACCEPT
	done
    fi
done
}
# 外からくるパケット(と関係するパケット)を許す
AcceptExt() {
protocol=$1
ports=$2
srcs=$3
for port in `echo $ports | sed 's/,/ /g'`
do
    if [ "$srcs" = "" ] ; then
	iptables -A INPUT -i $EXTIF -p $protocol --dport $port \
	    -m state --state NEW,ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -o $EXTIF -p $protocol --sport $port \
	    -m state --state ESTABLISHED -j ACCEPT
    else
	for src in `echo $srcs | sed 's/,/ /g'`
	do
	    iptables -A INPUT -i $EXTIF -d $src -p $protocol --dport $port \
		-m state --state NEW,ESTABLISHED -j ACCEPT
	    iptables -A OUTPUT -o $EXTIF -s $src -p $protocol --sport $port \
		-m state --state ESTABLISHED -j ACCEPT
	done
    fi
done
}

#################################################

## load modules
modprobe ip_tables
modprobe ip_conntrack

## 全てのチェインを空する。
# 空になったユーザ定義チェインを削除して
# カウンターをリセットする。
iptables -F
iptables -X
iptables -Z

## 全てのポリシーをDROPにする。
# セキュリティー上 DROPの方が強固なものがつくれる。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

## Loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

## SYN-FLOODING 
# SYNパケットの溢れ防御
iptables -N syn-flood
iptables -A INPUT -i $EXTIF -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j LOG \
    --log-prefix "IPTABLES SYN-FLOOD:"
iptables -A syn-flood -j DROP

## Make sure NEW tcp connections are SYN packets
iptables -A INPUT -i $EXTIF -p tcp ! --syn -m state --state NEW -j LOG  \
    --log-prefix "IPTABLES SYN-FLOOD:"
iptables -A INPUT -i $EXTIF -p tcp ! --syn -m state --state NEW -j DROP

## ping of death
# 死のpingからの防御
iptables -N ping-death
iptables -A INPUT -i $EXTIF -p icmp --icmp-type echo-request -j ping-death
iptables -A ping-death -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A ping-death -j LOG \
    --log-prefix "IPTABLES PING-DEATH:"
iptables -A ping-death -j DROP

## port scaner
# こっそり覗きポートスキャナーからの防御
iptables -N port-scan
iptables -A INPUT -i $EXTIF -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

## SPOOFING
# なりすましパケットの防御
# drop i:ppp+ source:local 
iptables -N spoofing
iptables -A INPUT -i $EXTIF -s $CLASS_A -j spoofing
iptables -A INPUT -i $EXTIF -s $CLASS_B -j spoofing
iptables -A INPUT -i $EXTIF -s $CLASS_C -j spoofing
iptables -A INPUT -i $EXTIF -s $CLASS_D_MULTICAST -j spoofing
iptables -A INPUT -i $EXTIF -s $CLASS_E_RESERVED_NET -j spoofing
iptables -A INPUT -i $EXTIF -d $LOOPBACK -j spoofing
iptables -A spoofing -j LOG --log-prefix "IPTABLES SPOOFING:"
iptables -A spoofing -j DROP

## local 
# ひとまずローカルはすべて通す
iptables -A INPUT -i $INTIF -s $LOCAL -j ACCEPT
iptables -A OUTPUT -o $INTIF -s $LOCAL -j ACCEPT

## DHCP
# ローカルから来たDHCP要求を通す
iptables -A INPUT -i $INTIF -p udp --dport 67 -j ACCEPT

## DNS
# DNSサーバの応答、要求を通す
AcceptInt udp 53

## AUTH 
#iptables -A OUTPUT -o $EXTIF -p tcp --sport 113 -j REJECT \
#    --reject-with tcp-reset
iptables -A INPUT -i $EXTIF -p tcp --dport 113 -j REJECT \
    --reject-with tcp-reset
iptables -A OUTPUT -o $EXTIF -p tcp --sport 113 -j ACCEPT

## NTP 
# 123:ntp 
AcceptInt udp 123
## Real Player
# Real Player:6970:7170
iptables -A INPUT -i $EXTIF -p udp --dport 6970:7170 \
    -m state --state NEW -j ACCEPT


## 外に出るTCPパケットを通す。
# 80:http 20:ftp-data ,21:ftp ,25:smtp , 23:telnet ,22:ssh ,110:pop3,113:auth
AcceptInt tcp 80,20,21,25,23,22,110,113
## 外からのTCPパケットを許す
# 80:http ,20:ftp-data,21:ftp,25:smtp,22:ssh ,113:auth
AcceptExt tcp 80,20,21,25,22,113

## FTP
# ESTABLISHED RELATED for passive mode ftp
# passiveモードでのFTP DATAパケットを通す。
iptables -A INPUT -i $EXTIF -p tcp --sport $UP_PORTS --dport $UP_PORTS \
    -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $EXTIF -p tcp --sport $UP_PORTS --dport $UP_PORTS \
    -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT  -i $EXTIF -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A OUTPUT -o $EXTIF -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 

# ESTABLISHED RELATED for data connection mode ftp
iptables -A INPUT  -i $EXTIF -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -o $EXTIF -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT 

## TRACEROUTE
# 外に出るtracerouteを通るようにする。
iptables -A OUTPUT -o $EXTIF -p udp --dport $TR_DST_PORTS \
    -m state --state NEW -j ACCEPT

## ICMP
# ping を通すようにする
iptables -A INPUT -i $EXTIF -p icmp \
    -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o $EXTIF -p icmp \
    -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT



## others LOG
iptables -A INPUT  -i $EXTIF -p udp -j LOG --log-prefix "IPTABLES UDP-IN:"
iptables -A INPUT  -i $EXTIF -p udp -j DROP
iptables -A OUTPUT -o $EXTIF -p udp -j LOG --log-prefix "IPTABLES UDP-OUT:"
iptables -A OUTPUT -o $EXTIF -p udp -j DROP
iptables -A INPUT  -i $EXTIF -p icmp -j LOG --log-prefix "IPTABLES ICMP-IN:"
iptables -A INPUT  -i $EXTIF -p icmp -j DROP
iptables -A OUTPUT -o $EXTIF -p icmp -j LOG --log-prefix "IPTABLES ICMP-OUT:"
iptables -A OUTPUT -o $EXTIF -p icmp -j DROP
iptables -A INPUT  -i $EXTIF -p tcp -j LOG --log-prefix "IPTABLES TCP-IN:"
iptables -A INPUT  -i $EXTIF -p tcp -j DROP
iptables -A OUTPUT -o $EXTIF -p tcp -j LOG --log-prefix "IPTABLES TCP-OUT:"
iptables -A OUTPUT -o $EXTIF -p tcp -j DROP
iptables -A INPUT  -i $EXTIF -j LOG --log-prefix "IPTABLES UNKNOWN-IN:"
iptables -A INPUT  -i $EXTIF -j DROP
iptables -A OUTPUT -o $EXTIF -j LOG --log-prefix "IPTABLES UNKNOWN-OUT:"
iptables -A OUTPUT -o $EXTIF -j DROP


## Do masquerading
# LOCALのパケットをマスカレードする。
iptables -A FORWARD -s $LOCAL -j ACCEPT
iptables -A FORWARD -d $LOCAL -j ACCEPT
iptables -A FORWARD -j LOG

iptables -t nat -A POSTROUTING -j MASQUERADE

# マスカレードを許可する。
echo 1 > /proc/sys/net/ipv4/ip_forward

# 必要なモジュールを組み込む
modprobe ip_conntrack_ftp

	

もどる


Kenji Ohmori
Last modified: Tue May 31 01:57:45 JST 2005