Linux 防火牆入門----設定檔

发表于:2007-05-26来源:作者:点击数: 标签:
原文: http://linux.tnc.edu.tw/techdoc/firewall/samples.html 設定檔 開機自動叫用 rc.firewall 在 /etc/rc.d/rc.local 檔末,加入以下指令: if [ -f /etc/rc.d/rc.firewall ]; then . /etc/rc.d/rc.firewall fi 該檔屬性: chmod ug+rwx rc.firewall (即
原文: http://linux.tnc.edu.tw/techdoc/firewall/samples.html

設定檔

開機自動叫用 rc.firewall

在 /etc/rc.d/rc.local 檔末,加入以下指令:

if [ -f /etc/rc.d/rc.firewall ]; then
. /etc/rc.d/rc.firewall
fi

該檔屬性: chmod ug+rwx rc.firewall

(即 chmod 774 rc.firewall)

該檔 Owner 應為: root.root

練習時,可下 sh rc.firewall 或 ./rc.firewall

以下指令檔,僅供參考,它們並不完整,未必能符合您的需要,您必須要再修改才能使用。

一般而言,每個指令中的 IP,會使用變數代換的方式來處理。比如:

FW_IP="163.26.197.8" (用 FW_IP 來代表 163.26.197.8)

使用時,再用 $FW_IP 來代換成 163.26.197.8,這樣,維護上會比較方便。

其它大部份常用的指令值,也都會用上述方式來定義及取代。


設定檔

開機自動叫用 rc.firewall

在 /etc/rc.d/rc.local 檔末,加入以下指令:

if [ -f /etc/rc.d/rc.firewall ]; then
. /etc/rc.d/rc.firewall
fi

該檔屬性: chmod ug+rwx rc.firewall

(即 chmod 774 rc.firewall)

該檔 Owner 應為: root.root

練習時,可下 sh rc.firewall 或 ./rc.firewall

以下指令檔,僅供參考,它們並不完整,未必能符合您的需要,您必須要再修改才能使用。

一般而言,每個指令中的 IP,會使用變數代換的方式來處理。比如:

FW_IP="163.26.197.8" (用 FW_IP 來代表 163.26.197.8)

使用時,再用 $FW_IP 來代換成 163.26.197.8,這樣,維護上會比較方便。

其它大部份常用的指令值,也都會用上述方式來定義及取代。

僅供參考用的 ipchains 設定檔: rc.firewall (1)

以下設定,便可分割出一個乾淨的網段,對外以 $FW_IP 為代表號。

修改一下 IP,直接套用,很快便可架設一個簡易的防火牆。

#! /bin/sh

FW_IP="163.26.197.8"
ipchains -F
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT

echo 1 > /proc/sys/net/ipv4/ip_forward
ipchains -A forward -s 192.168.1.0/24 -j MASQ

ipchains -A input -p tcp -d $FW_IP 80 -j REDIRECT 8080
redir --lport=8080 --caddr=192.168.1.2 --cport=80 &

僅供參考用的 iptables 設定檔: rc.firewall (2)

FW_IP 是指對外網卡的真實 IP,您要套用時,記得要修改成您的防火牆的第一片網卡的IP

修改一下 IP,直接套用,很快便可架設一個簡易的防火牆。

#! /bin/sh

###-----------------------------------------------------###
# 設定內部網段 IP 及介面
###-----------------------------------------------------###
echo "Set internal ......"
echo

LAN_IP="172.16.255.254"
LAN_IP_RANGE="172.16.0.0/16"
LAN_BCAST_ADRESS="172.16.255.255"
LAN_IFACE="eth1"

# loopback interface
LO_IFACE="lo"
LO_IP="127.0.0.1"

###-----------------------------------------------------###
# 外部網段 IP 及介面
###-----------------------------------------------------###
echo "Set external ......"
echo

FW_IP="163.26.197.8"
FW_IP_RANGE="163.26.197.0/24"
FW_IFACE="eth0"


###-----------------------------------------------------###
# 設定 iptables 的路徑
###-----------------------------------------------------###
echo "Set path of iptables"
echo

IPTABLES="/sbin/iptables"


###-----------------------------------------------------###
# 打開 forward 功能
###-----------------------------------------------------###
echo "Enable ip_forward ......"
echo

echo "1" > /proc/sys/net/ipv4/ip_forward


###-----------------------------------------------------###
# 清除先前的設定
###-----------------------------------------------------###
echo "Flush fiter table ......"
echo

# Flush filter
$IPTABLES -F
$IPTABLES -X

echo "Flush mangle table ......"
echo
# Flush mangle
$IPTABLES -F -t mangle
$IPTABLES -t mangle -X


echo "Flush nat table ......"
echo
# Flush nat
$IPTABLES -F -t nat
$IPTABLES -t nat -X

###-----------------------------------------------------###
# 設定 filter table 的預設政策
###-----------------------------------------------------###
echo "Set default policies for filter table"
echo
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

###-----------------------------------------------------###
# 啟動內部對外轉址
###-----------------------------------------------------###
echo "Enable simple IP Forwarding and Network Address Translation"
echo

$IPTABLES -t nat -A POSTROUTING -o $FW_IFACE -j SNAT --to-source $FW_IP

###-----------------------------------------------------###
# 啟動外部對內部轉址
###-----------------------------------------------------###
# 凡對 $FW_IP:8080 連線者, 則轉址至 172.16.255.2:80
$IPTABLES -t nat -A PREROUTING -p tcp -d $FW_IP --dport 8080 -j DNAT --to 172.16.255.2:80

僅供參考用的 ipchains 設定檔: rc.firewall (3)

$FW_IP 是防火牆主機上的第一片網卡的 IP,各位應把它換成您的防火牆的第一片網卡的IP

#! /bin/sh

FW_IP="163.26.197.8"

ipchains -F

#ipchains -P input ACCEPT
#ipchains -P output ACCEPT
#ipchains -P forward ACCEPT

ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY

# open telnet
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 23 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 23 -d $FW_IP 1024:65535 -j ACCEPT

# open web
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 80 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 80 -d $FW_IP 1024:65535 -j ACCEPT

# open mail
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 25 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 25 -d $FW_IP 1024:65535 -j ACCEPT

# open pop3
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 110 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 110 -d $FW_IP 1024:65535 -j ACCEPT

# open dns : 1st => udp 查詢
ipchains -A output -i eth0 -p udp -s $FW_IP 1024:65535 -d any/0 53 -j ACCEPT
ipchains -A input -i eth0 -p udp -s any/0 53 -d $FW_IP 1024:65535 -j ACCEPT

# open dns : 2st => tcp 查詢
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 53 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 53 -d $FW_IP 1024:65535 -j ACCEPT

# open dns peer-to-peer : 1st => udp
ipchains -A output -i eth0 -p udp -s $FW_IP 53 -d any/0 53 -j ACCEPT
ipchains -A input -i eth0 -p udp -s any/0 53 -d $FW_IP 53 -j ACCEPT

# open dns peer-to-peer: 2st => tcp 查詢
ipchains -A output -i eth0 -p tcp -s $FW_IP 53 -d any/0 53 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 53 -d $FW_IP 53 -j ACCEPT

# open ftp channel 21 : commands channel
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 21 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 21 -d $FW_IP 1024:65535 -j ACCEPT

# open ftp channel 20 : data channel
ipchains -A input -i eth0 -p tcp -s any/0 20 -d $FW_IP 1024:65535 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! -y -s $FW_IP 1024:65535 -d any/0 20 -j ACCEPT

# open Passive FTP Mode : data channel
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 1024:65535 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 1024:65535 -d $FW_IP 1024:65535 -j ACCEPT

# open ssh
ipchains -A output -i eth0 -p tcp -s $FW_IP 1024:65535 -d any/0 22 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 22 -d $FW_IP 1024:65535 -j ACCEPT

ipchains -A output -i eth0 -p tcp -s $FW_IP 1020:1023 -d any/0 22 -j ACCEPT
ipchains -A input -i eth0 -p tcp ! -y -s any/0 22 -d $FW_IP 1020:1023 -j ACCEPT

# 開放防火牆的 port 22 給家中或學校的某一個固定 IP 連線
# 以下 211.22.33.44 即代表你家中的固定 IP, $FW_IP 是防火牆的eth0的 IP
ipchains -A input -i eth0 -p tcp -s 211.22.33.44 1024:65535 -d $FW_IP 22 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! -y -s $FW_IP 22 -d 211.22.33.44 1024:65535 -j ACCEPT

# 假設這台主機上有 mail server,以下可以開放別人送信包給你這台主機的 SMTP
ipchains -A input -i eth0 -p tcp -s any/0 1024:65535 -d $FW_IP 25 -j ACCEPT
ipchains -A output -i eth0 -p tcp ! -y -s $FW_IP 25 -d any/0 1024:65535 -j ACCEPT

# 假設有一個垃圾郵件主機經常送 SPAM 信過來, 比如: 211.33.44.55,以下可以予以拒絕
ipchains -A input -i eth0 -p tcp -s 211.33.44.55 -d $FW_IP 25 -j DENY

# 允許教網中心 163.26.200.4 可以 ping 我
ipchains -A input -i eth0 -p icmp -s 163.26.200.4 8 -d $FW_IP -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $FW_IP 0 -d 163.26.200.4 -j ACCEPT

# 我可以 ping 任何主機
ipchains -A output -i eth0 -p icmp -s $FW_IP 8 -d any/0 -j ACCEPT
ipchains -A input -i eth0 -p icmp -s any/0 0 -d $FW_IP -j ACCEPT

# 如果預設的 policy 是 ACCEPT,以下可以拒絕所有站台 ping 你的主機
# 如果預設的 policy 是 DENY,則不必設,就可全部拒絕別人 ping 你的主機
ipchains -A input -i eth0 -p icmp -s any/0 8 -d $FW_IP -j DENY

# 如果預設的 policy 是 ACCEPT, 以下可以拒絕任何主機 traceroute 你的主機
ipchains -A output -i eth0 -p icmp -s $FW_IP 3 -d any/0 -j DENY
ipchains -A output -i eth0 -p icmp -s $FW_IP 11 -d any/0 -j DENY

# 但我想 traceroute 別人
ipchains -A output -i eth0 -p udp -s $FW_IP 1024:65535 -d any/0 33434:33523 -j ACCEPT
ipchains -A input -i eth0 -p icmp -s any/0 11 -d $FW_IP -j ACCEPT
ipchains -A input -i eth0 -p icmp -s any/0 3 -d $FW_IP -j ACCEPT




僅供參考用的 iptables 設定檔: rc.firewall (4)

以下的 $FW_IP 代表防火牆的第一片網卡的真實 IP。

#! /bin/sh

FW_IP="163.26.197.8"

# enable forward
echo "1" > /proc/sys/net/ipv4/ip_forward

# clear all chains
###-----------------------------------------------------###
# 清除先前的設定
###-----------------------------------------------------###
# 清除預設表 filter 中,所有規則鏈中的規則
iptables -F
# 清除預設表 filter 中,使用者自訂鏈中的規則
iptables -X

# 清除mangle表中,所有規則鏈中的規則
iptables -F -t mangle
# 清除mangle表中,使用者自訂鏈中的規則
iptables -t mangle -X

# 清除nat表中,所有規則鏈中的規則
iptables -F -t nat
# 清除nat表中,使用者自訂鏈中的規則
iptables -t nat -X


#iptables -P INPUT ACCEPT
#iptables -P FORWARD ACCEPT
#iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

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

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT

# NAT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT -s 172.16.0.0/16 --to-source $FW_IP

# 虛擬主機
iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.254.2:80

# open ssh server
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 22 -d any/0 --dport 1024:65535 -j ACCEPT


# open telnet
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open web browser
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open mail
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open pop3
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open ssh client
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open dns 1st => udp
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open dns 2st => tcp
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open telnet server
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 23 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 23 -d any/0 --dport 1024:65535 -j ACCEPT


# open ftp channel 21
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open ftp data channel 20
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT


# open Passive FTP mode
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT


# open ping
iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT

僅供參考用的 iptables 設定檔: rc.firewall (5)

#!/bin/sh
# 本 scritp 參考 Oskar Andreasson 的 script 而來, 其版權如下所示。
# OLS3 謹誌。ols3@www.tnc.edu.tw
#-----------------------------------------------------------------------------
# rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables
#
# Copyright (C) 2001 Oskar Andreasson <blueflux@koffein.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program or from the site that you downloaded it
# from; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
#-----------------------------------------------------------------------------

###-----------------------------------------------------###
# 設定內部網段 IP 及介面
###-----------------------------------------------------###
echo "Set internal ......"
echo

LAN_IP="172.16.255.254"
LAN_IP_RANGE="172.16.0.0/16"
LAN_BCAST_ADRESS="172.16.255.255"
LAN_IFACE="eth1"

# loopback interface
LO_IFACE="lo"
LO_IP="127.0.0.1"

###-----------------------------------------------------###
# 外部網段 IP 及介面
###-----------------------------------------------------###
echo "Set external ......"
echo

FW_IP="163.26.197.8"
FW_IP_RANGE="163.26.197.0/24"
FW_IFACE="eth0"


###-----------------------------------------------------###
# 設定 iptables 的路徑
###-----------------------------------------------------###
echo "Set path of iptables"
echo

IPTABLES="/sbin/iptables"


###-----------------------------------------------------###
# 打開 forward 功能
###-----------------------------------------------------###
echo "Enable ip_forward ......"
echo

echo "1" > /proc/sys/net/ipv4/ip_forward


###-----------------------------------------------------###
# 清除先前的設定
###-----------------------------------------------------###
echo "Flush fiter table ......"
echo

# Flush filter
$IPTABLES -F
$IPTABLES -X

echo "Flush mangle table ......"
echo
# Flush mangle
$IPTABLES -F -t mangle
$IPTABLES -t mangle -X


echo "Flush nat table ......"
echo
# Flush nat
$IPTABLES -F -t nat
$IPTABLES -t nat -X

###-----------------------------------------------------###
# 設定 filter table 的預設政策
###-----------------------------------------------------###
echo "Set default policies for filter table"
echo
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

###-----------------------------------------------------###
# 自訂一個 chain , 名為 tcp_packets
###-----------------------------------------------------###
echo "Name a new chain : tcp_packets ......"
echo
$IPTABLES -N tcp_packets

# 在此 tcp_packets chain 中, 附加一個 chain rule , 規則如下:
# 1. 在非主動連線時, 卻有一 new connection start , 此時予以記錄下來, 且加上 New not syn:的前置字串
#$IPTABLES -A tcp_packets -p tcp ! --syn -m state --state NEW -j LOG
#--log-prefix "New not syn:"

# 2. 這種封包, 予以丟棄.
#$IPTABLES -A tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

# disable been scaned
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "been scanned:"
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL ALL -j LOG --log-prefix "been scanned:"
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "been scanned:"
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL NONE -j LOG --log-prefix "been scanned:"
$IPTABLES -A tcp_packets -p TCP --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "been scanned:"
$IPTABLES -A tcp_packets -p TCP --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "been scanned:"

$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL ALL -j DROP
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPTABLES -A tcp_packets -p TCP --tcp-flags ALL NONE -j DROP
$IPTABLES -A tcp_packets -p TCP --tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A tcp_packets -p TCP --tcp-flags SYN,FIN SYN,FIN -j DROP


###-----------------------------------------------------###
# 啟動內部對外轉址
###-----------------------------------------------------###
echo "Enable simple IP Forwarding and Network Address Translation"
echo

$IPTABLES -t nat -A POSTROUTING -o $FW_IFACE -j SNAT --to-source $FW_IP

###-----------------------------------------------------###
# 啟動外部對內部轉址
###-----------------------------------------------------###
# 凡對 $FW_IP:8080 連線者, 則轉址至 172.16.255.2:80
$IPTABLES -t nat -A PREROUTING -p tcp -d $FW_IP --dport 8080 -j DNAT --to 172.16.255.2:80

###-----------------------------------------------------###
# FOWARD
###-----------------------------------------------------###
echo "Process forward ......"
echo

# FORWARD 由先由 tcp_packets 中來處理不好的 tcp packets
$IPTABLES -A FORWARD -p tcp -j tcp_packets


# 接受我們想 forward 的封包

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


###-----------------------------------------------------###
# 自訂 ICPM 及 UDP chain 來處理對應的封包
###-----------------------------------------------------###
echo "New name for icpm and udp chain"
echo

$IPTABLES -N icmp_packets
$IPTABLES -N udpincoming_packets


###-----------------------------------------------------###
# 自訂 allowed 這個 chain 來處理 允許進入的 tcp 連線
# 凡 tcp_packets 中的 chain rule 目的是某些欲開放的 port 者,
# 則跳至此一 allowed chain 來處理.
###-----------------------------------------------------###
echo "New name for allowed chain"
echo

$IPTABLES -N allowed
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP



###-----------------------------------------------------###
# ICMP chain rule
###-----------------------------------------------------###

# 允許 ping 的要求(icmp-type =8), 至於回應(icmp-type=0)則不必規定
# 回應屬出 OUTPUT, 由 OUTPUT chain 來處理即可.
#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s $FW_IP_RANGE -d $FW_IP --icmp-type 8 -j ACCEPT

# 允許 time-exceeded 的要求(maximus hop count(TTL)is exceeded)
#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s $FW_IP_RANGE --icmp-type 11 -j ACCEPT

#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s $FW_IP_RANGE --icmp-type 3 -j ACCEPT

###-----------------------------------------------------###
# TCP rules
###-----------------------------------------------------###

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 20 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 1024:65535 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 25 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 110 -j allowed
# for CVS server
$IPTABLES -A tcp_packets -p TCP -s $FW_IP_RANGE --dport 2401 -j allowed

#
# UDP ports
#

# nondocumented commenting out of these rules
#$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT
#$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 123 -j ACCEPT
#$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 2074 -j ACCEPT
#$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 4000 -j ACCEPT

# 允許 traceroute 至 FW_IP
$IPTABLES -A udpincoming_packets -p UDP -s $FW_IP_RANGE -j ACCEPT

#$IPTABLES -A udpincoming_packets -p UDP -j ACCEPT

##########################
# PREROUTING chain.
#
# Do some checks for obviously spoofed IP's
#

#$IPTABLES -t nat -A PREROUTING -i $FW_IFACE -s 192.168.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $FW_IFACE -s 10.0.0.0/8 -j DROP
#$IPTABLES -t nat -A PREROUTING -i $FW_IFACE -s 172.16.0.0/12 -j DROP


##########################
# INPUT chain


# Bad TCP packets we don't want.
$IPTABLES -A FORWARD -p tcp -j tcp_packets

# 進來的 ICMP 由 icmp_packets 這個 chain 來處理
$IPTABLES -A INPUT -p ICMP -i $FW_IFACE -j icmp_packets

# 進來的 TCP 由 tcp_packets 這個 chain 來處理
$IPTABLES -A INPUT -p TCP -i $FW_IFACE -j tcp_packets

# 進來的 UDP 由 udpincomming_packets 這個 chain 來處理
$IPTABLES -A INPUT -p UDP -i $FW_IFACE -j udpincoming_packets

#
# Rules for special networks not part of the Internet
#

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $FW_IP -m state --state ESTABLISHED,RELATED
-j ACCEPT

###############################
# OUTPUT chain

$IPTABLES -A FORWARD -p tcp -j tcp_packets

# 對外連線, 先全部打開
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $FW_IP -j ACCEPT

原文转自:http://www.ltesting.net