#!/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
|