#!/bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter IPT=/sbin/iptables #---------------------------------- # 請把下行的 x.x.x.x 改成對外的 IP REALIP="x.x.x.x" #---------------------------------- # 設定 filter 內的 chain 之 Policy $IPT -t filter -P INPUT DROP $IPT -t filter -P OUTPUT ACCEPT $IPT -t filter -P FORWARD DROP #------------------------------------------- # 設定 filter 這個 table 的 chain 之 Policy $IPT -t nat -P PREROUTING ACCEPT $IPT -t nat -P OUTPUT ACCEPT $IPT -t nat -P POSTROUTING ACCEPT #---------------------------------------------- # 清除所有 chain 的 rule, 刪除自行定義的 chain $IPT -t nat -F $IPT -t nat -X #--------------------------------------------------------- # 定義處理 ICMP 封包的 chain: 'icmp_chain' # 其中 type 0 代表 echo-reply (ping 對方時的回應), # type 8 為 echo-request (其他機器 ping 我們). $IPT -t filter -F $IPT -t filter -X $IPT -t filter -N icmp_chain $IPT -t filter -A icmp_chain -p icmp --icmp-type 0 -j ACCEPT $IPT -t filter -A icmp_chain -p icmp --icmp-type 3 -j ACCEPT $IPT -t filter -A icmp_chain -p icmp --icmp-type 5 -j ACCEPT $IPT -t filter -A icmp_chain -p icmp --icmp-type 8 -j ACCEPT $IPT -t filter -A icmp_chain -p icmp --icmp-type 11 -j ACCEPT $IPT -t filter -A icmp_chain -p icmp -j DROP #================================================================== # PREROUTING (table:nat) # 1.即使是從內部 NAT 出去的連線, 它傳送回來的封包的目的位址也絕對不會是內部IP! # 2.而 NAT 出去的連線所傳回的封包之目的位址在經過 PREROUTING 階段後 # 才會被轉換成內部 IP $IPT -t nat -A PREROUTING -i eth0 -d 192.168.0.0/24 -j DROP $IPT -t nat -A PREROUTING -i eth0 -d 127.0.0.0/8 -j DROP # 3.從外界進來,但宣稱是來自內部網路的封包(來搗蛋的),一律擋掉。 $IPT -t nat -A PREROUTING -i eth0 -s 192.168.0.0/24 -j DROP $IPT -t nat -A PREROUTING -i eth0 -s 127.0.0.0/8 -j DROP #=========================================================================== # FORWARD (table:filter) # 要能順利讓內部網路連到 internet, 也讓資料能傳回內部, # 必須允許 FORWARD, 但僅限於 # (1) 從內部網路主動連至 internet 的連線 # (2) 上述連線所傳遞的資料(因此連線狀態必須是ESTABLISHED 或 RELATED 的才行) #--------------------------------------------------------------------------- $IPT -t filter -A FORWARD -s 192.168.0.0/24 -j ACCEPT $IPT -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #======================================================================== # POSTROUTING (table:nat) # 要讓內部網路能連到 internet, 必須把來自內部網路, # 且要從 eth0 送出去的封包之來源位址改成真實 IP, 此即為 SNAT(Source NAT) #------------------------------------------------------------------------ $IPT -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source $REALIP #======================================================================== # INPUT (table:filter) # A.信任內部網路(192.168.0.0/24)及 lo 介面(127.0.0.0/8) # 接受任何來自於這兩個介面的封包. #------------------------------------------------------------------------ $IPT -t filter -A INPUT -p all -s 192.168.0.0/24 -j ACCEPT $IPT -t filter -A INPUT -p all -s 127.0.0.0/8 -j ACCEPT #------------------------------------------------------------------------ # 從此處起, 開始處理來自 internet 的封包 #------------------------------------------------------------------------ # B.接受任何屬於已建立的連線之封包. $IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #------------------------------------------------------------------------ # C.來自 internet, 屬於 ICMP 的封包, 交由 icmp_chain 處理 $IPT -t filter -A INPUT -p icmp -j icmp_chain #------------------------------------------------------------------------ # D.只提供給外界 Mail (smtp) 及 Web (www) 連線(TCP), # 以及 DNS 查詢(UDP), 其他一律不提供. $IPT -t filter -A INPUT -p tcp --dport smtp -m state --state NEW --syn -j ACCEPT $IPT -t filter -A INPUT -p tcp --dport www -m state --state NEW --syn -j ACCEPT $IPT -t filter -A INPUT -p udp --dport domain -j ACCEPT #------------------------------------------------------------------------ # E. 由於 INPUT chain 的 Policy 設為 DROP, # 未被先前 rule 處理的封包至此將被 DROP 掉.