【教學】以 舊電腦安裝Linux 成為功能強大的防火牆兼頻寬管理器



贊助商連結


flight88
2004-03-04, 11:26 PM
IP分享器是不錯的玩意,但區網中只要遇到一個下載狂,再大的頻寬也一樣被撐爆,其他人只得忍受如龜爬的上網速度,我想,用IP分享器Shere頻寬的人一定有這樣的切身之痛,只要你有一台舊電腦插上兩片網卡,再參考下面的防火牆設定檔,嘿嘿,管他養動物還是玩BT,其他人再也不用乾跳腳了,以下是我的網路環境
ADSL 1.5M/384 固定IP,分享給10個用戶
防火牆主機 P2-350 128mb ram,scsi 18g硬碟,兩片螃蟹卡,RED HAT 9.0完全安裝

防火牆內部網卡IP 192.168.0.1 故區網中的電腦請將IP設為192.168.0.2~254,閘道器192.168.0.1

有關Linux 的安裝問題,請參考相關網站,如鳥哥的私房菜或小紅帽論壇,您最好具備一些網路的基本知識,不然可能又是另一場惡夢

基本上只要將下面的script檔,設定成開機自動執行,你的舊電腦便成為一台具有頻寬控管功能的IP分享器
****浮動IP的的設定有點不同,請待下回分解


firewall script檔(以下僅有初步的防火牆功能,但應已足夠使用)
#!/bin/bash
#===================================================
#開啟IP轉送
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
#定義變數IPT
IPT=/sbin/iptables
#----------------------------------
# 請把下行的 x.x.x.x 改成對外的 IP
#目前為固定IP,,故將變數REALIP填入對外網卡eth0的IP
REALIP="x.x.x.x"

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

# Flush filter
$IPT -F
$IPT -X

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


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


#先載入FTP相關的模組

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
#----------------------------------
# 設定 filter 內的 chain 之 Policy
$IPT -t filter -P INPUT DROP
$IPT -t filter -P OUTPUT ACCEPT
$IPT -t filter -P FORWARD ACCEPT
#-------------------------------------------
# 設定 nat 這個 table 的 chain 之 Policy
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
#----------------------------------------------

#--------------------------------------------------------------------------
#開放連外的IP列表,,新開用戶後請至檔案尾端設定頻寬
#--------------------------------------------------------------------------
$IPT -t nat -A POSTROUTING -o eth0 -j SNAT -s 192.168.0.100 --to-source $REALIP
$IPT -t nat -A POSTROUTING -o eth0 -j SNAT -s 192.168.0.30 --to-source $REALIP
$IPT -t nat -A POSTROUTING -o eth0 -j SNAT -s 192.168.0.121 --to-source $REALIP
$IPT -t nat -A POSTROUTING -o eth0 -j SNAT -s 192.168.0.122 --to-source $REALIP
$IPT -t nat -A POSTROUTING -o eth0 -j SNAT -s 192.168.0.123 --to-source $REALIP
#開幾個IP就將上面的描述複製,再修改一下IP即可,未在列表內的IP無法上網
#---------------------------------------------------------
# 定義處理 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
#====================================================================
# 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 -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
#------------------------------------------------------------------------
# C.來自 internet, 屬於 ICMP 的封包, 交由 icmp_chain 處理
$IPT -t filter -A INPUT -i eth0 -p icmp -j icmp_chain
#------------------------------------------------------------------------
# D.只提供給外界 Mail (smtp) 及 Web (www) 連線(TCP),
# 以及 DNS 查詢(UDP), 其他一律不提供.
#$IPT -t filter -A INPUT -p tcp --dport 10000 -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
#=================================================================
#虛擬伺服器 virturl server
#=================================================================
# E-donkey,E-mule to 192.168.0.122
$IPT -t nat -A PREROUTING -p tcp -d $REALIP --dport 4661 -j DNAT --to 192.168.0.122:4661
$IPT -t nat -A PREROUTING -p udp -d $REALIP --dport 4672 -j DNAT --to 192.168.0.122:4672

#------------------------------------------------------------------------
#kuro to 192.168.0.121
$IPT -t nat -A PREROUTING -p tcp -d $REALIP --dport 6699 -j DNAT --to 192.168.0.121:6699

#edonkey to 192.168.0.100
$IPT -t nat -A PREROUTING -p tcp -d $REALIP --dport 14661 -j DNAT --to 192.168.0.100:14661
$IPT -t nat -A PREROUTING -p udp -d $REALIP --dport 14672 -j DNAT --to 192.168.0.100:14672

#edonkey to 192.168.0.100
$IPT -t nat -A PREROUTING -p tcp -d $REALIP --dport 20001 -j DNAT --to 192.168.0.100:20001
$IPT -t nat -A PREROUTING -p udp -d $REALIP --dport 24672 -j DNAT --to 192.168.0.100:24672

#--------------------------------------------------------------------
# E. 由於 INPUT chain 的 Policy 設為 DROP,
# 未被先前 rule 處理的封包至此將被 DROP 掉.
#

#開始定義頻寬
#========================================================================
# 定義流量管制上傳的封包將之Mark起來,所有用戶都要設,否則上傳管制會失敗
# 向核心解釋封包樣別:

$IPT -I PREROUTING -t mangle -s 192.168.0.100 -j MARK --set-mark 1
$IPT -I PREROUTING -t mangle -s 192.168.0.250 -j MARK --set-mark 2
$IPT -I PREROUTING -t mangle -s 192.168.0.251 -j MARK --set-mark 3
$IPT -I PREROUTING -t mangle -s 192.168.0.252 -j MARK --set-mark 4
$IPT -I PREROUTING -t mangle -s 192.168.0.30 -j MARK --set-mark 5

#bounded 敘述拿掉那麼該類別就能夠借取其它類別的頻寬來用。
# eth0 為上傳
# eth1 為下傳
#先清除eth0 eth1 的規則
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root
#tc filter del
#tc filter del dev eth1

#--------------------------------------------------------------------
# 上傳部份:eth0
#上傳需配合IPTABLES指令,如增加用戶,請一併增加該IP的封包mark
#
#--------------------------------------------------------------------



# 宣告上傳佇列戒律
/sbin/tc qdisc add dev eth0 root handle 10: cbq bandwidth 100Mbit avpkt 1000

# 宣告頂層的類別:10:0
/sbin/tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 100Mbit rate 100Mbit allot 1514 weight 40Kbit prio 8 maxburst 20 avpkt 1000 bounded
#/sbin/tc class add dev eth0 parent 10:0 classid 10:2 cbq bandwidth 100Mbit rate 384Kbit allot 1514 weight 40Kbit prio 8 maxburst 20 avpkt 1000


# 宣告客戶類別,及其頻寬大小
/sbin/tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 384Kbit rate 256Kbit allot 1514 weight 26Kbit prio 5 maxburst 20 avpkt 1000 bounded
/sbin/tc class add dev eth0 parent 10:1 classid 10:110 cbq bandwidth 180Kbit rate 150Kbit allot 1514 weight 15Kbit prio 5 maxburst 20 avpkt 1000 bounded
/sbin/tc class add dev eth0 parent 10:1 classid 10:120 cbq bandwidth 200Kbit rate 128Kbit allot 1514 weight 13Kbit prio 5 maxburst 20 avpkt 1000 bounded
/sbin/tc class add dev eth0 parent 10:1 classid 10:130 cbq bandwidth 200Kbit rate 128Kbit allot 1514 weight 13Kbit prio 5 maxburst 20 avpkt 1000 bounded


#--------------------------------------------------------------------

# 宣告管理佇列
/sbin/tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 10:110 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 10:120 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 10:130 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 10:140 sfq quantum 1514b perturb 15

#-----------------------------------------------------------------------

# 核心解釋什麼樣的封包屬於什麼樣別
#prio為封包之優先順序 1為最大,100為最小
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 1 fw classid 10:100
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 2 fw classid 10:110
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 3 fw classid 10:120
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 4 fw classid 10:130
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 5 fw classid 10:140


#--------------------------------------------------------------------
# 下載部份:eth1
#--------------------------------------------------------------------

# bounded 敘述拿掉那麼該類別就能夠借取其它類別的頻寬來用。
#下例為下傳:宣告佇列戒律
/sbin/tc qdisc add dev eth1 root handle 20: cbq bandwidth 100Mbit avpkt 1000

#宣告頂層的類別為: 20:0
/sbin/tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 100Mbit rate 100Mbit allot 1514 weight 150Kbit prio 8 maxburst 20 avpkt 1000 bounded
#/sbin/tc class add dev eth1 parent 20:0 classid 20:2 cbq bandwidth 100Mbit rate 100Mbit allot 1514 weight 100Kbit prio 8 maxburst 20 avpkt 1000 bounded
# 宣告客戶類別,及其頻寬大小





# 下傳頻寬 最後面加bounded 則不可借頻寬
/sbin/tc class add dev eth1 parent 20:1 classid 20:100 cbq bandwidth 2048Kbit rate 1024Kbit allot 1514 weight 102Kbit prio 6 maxburst 20 avpkt 1000
/sbin/tc class add dev eth1 parent 20:1 classid 20:110 cbq bandwidth 1536Kbit rate 800Kbit allot 1514 weight 80Kbit prio 6 maxburst 20 avpkt 1000 bounded
/sbin/tc class add dev eth1 parent 20:1 classid 20:120 cbq bandwidth 1536Kbit rate 800Kbit allot 1514 weight 90Kbit prio 6 maxburst 20 avpkt 1000 bounded
/sbin/tc class add dev eth1 parent 20:1 classid 20:130 cbq bandwidth 1536Kbit rate 800Kbit allot 1514 weight 90Kbit prio 6 maxburst 20 avpkt 1000 bounded
/sbin/tc class add dev eth1 parent 20:1 classid 20:140 cbq bandwidth 1536Kbit rate 800Kbit allot 1514 weight 90Kbit prio 6 maxburst 20 avpkt 1000 bounded




# 宣告管理佇列
/sbin/tc qdisc add dev eth1 parent 20:100 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth1 parent 20:110 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth1 parent 20:120 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth1 parent 20:130 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth1 parent 20:140 sfq quantum 1514b perturb 15



# 向核心解釋封包樣別
/sbin/tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.0.100 flowid 20:100
/sbin/tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.0.250 flowid 20:110
/sbin/tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.0.251 flowid 20:120
/sbin/tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.0.252 flowid 20:130
/sbin/tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.0.30 flowid 20:140

贊助商連結


阿 土
2004-03-04, 11:45 PM
Good , 其實不想買分享器又有舊電腦的人士可以嘗試來玩 Linux

不過上面教學對一般初學者恐怕還有些困難 , 有基礎者應該很好上手

dou0228
2004-03-05, 12:15 AM
我覺得你與其寫這種東西..
不如花時間改成Web 界面..

這些指令, 說老實話, 網路上文件多到數不完..
單就指令來說, 從完全不知道 到瞭解的時間太長..

而且這樣的安裝方式, 你必須先有 "能裝好 Linux 的基礎"..
說實在..

就像土大講的, It's difficult

aaronyih
2004-03-05, 11:28 AM
自從有硬體防火牆及QoS後就沒再碰linux,我的linux版本一直還在6.2,7.0,剛剛看了一下上頭script檔
還要回憶一下,想一想真的要適合有linux基礎的玩才適合阿,用硬體還是比較適合像我這種已經把linux忘光光的人囉!!

wrdu
2004-03-05, 11:44 AM
謝謝很實用

mingsheu
2004-03-05, 10:53 PM
這很不錯啊...
iptables 還能搞優先權喔:D:D

dou0228
2004-03-06, 03:11 PM
最初由 mingsheu 發表
這很不錯啊...
iptables 還能搞優先權喔:D:D

哪時候 iptables 可以搞優先權了阿?
那明明是 tc 的功能..:(

mingsheu
2004-03-06, 09:58 PM
最初由 dou0228 發表
哪時候 iptables 可以搞優先權了阿?
那明明是 tc 的功能..:(


小弟是看到這個啦,不過是真的沒有看清楚 :)
總之先 Copy 下來放著....IPTABLES 的功能太多了...... 有天要用時再研究.....
-------------------------------------------------------------------
# 核心解釋什麼樣的封包屬於什麼樣別
#prio為封包之優先順序 1為最大,100為最小
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 1 fw classid 10:100
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 2 fw classid 10:110
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 3 fw classid 10:120
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 4 fw classid 10:130
/sbin/tc filter add dev eth0 protocol ip parent 10:0 prio 100 handle 5 fw classid 10:140
--------------------------------------------------------------------