分类: LINUX
2005-01-11 17:14:03
開機自動叫用 rc.firewall
在 /etc/rc.d/rc.local 檔末,加入以下指令:
if [ -f /etc/rc.d/rc.firewall ]; then |
該檔屬性: 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 |
該檔屬性: 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,這樣,維護上會比較方便。
其它大部份常用的指令值,也都會用上述方式來定義及取代。
以下設定,便可分割出一個乾淨的網段,對外以 $FW_IP 為代表號。
修改一下 IP,直接套用,很快便可架設一個簡易的防火牆。
#! /bin/sh |
FW_IP 是指對外網卡的真實 IP,您要套用時,記得要修改成您的防火牆的第一片網卡的IP
修改一下 IP,直接套用,很快便可架設一個簡易的防火牆。
#! /bin/sh |
$FW_IP 是防火牆主機上的第一片網卡的 IP,各位應把它換成您的防火牆的第一片網卡的IP
#! /bin/sh |
以下的 $FW_IP 代表防火牆的第一片網卡的真實 IP。
#! /bin/sh |
#!/bin/sh
# 本 scritp 參考 Oskar Andreasson 的 script 而來, 其版權如下所示。
# OLS3 謹誌。ols3@
#-----------------------------------------------------------------------------
# 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