會員 | 【教學】以 舊電腦安裝Linux 成為功能強大的防火牆兼頻寬管理器 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 |
回覆 |
校長兼撞鐘 | Good , 其實不想買分享器又有舊電腦的人士可以嘗試來玩 Linux 不過上面教學對一般初學者恐怕還有些困難 , 有基礎者應該很好上手 |
回覆 |
拉登長官 | 我覺得你與其寫這種東西.. 不如花時間改成Web 界面.. 這些指令, 說老實話, 網路上文件多到數不完.. 單就指令來說, 從完全不知道 到瞭解的時間太長.. 而且這樣的安裝方式, 你必須先有 "能裝好 Linux 的基礎".. 說實在.. 就像土大講的, It's difficult |
回覆 |
會員 | 自從有硬體防火牆及QoS後就沒再碰linux,我的linux版本一直還在6.2,7.0,剛剛看了一下上頭script檔 還要回憶一下,想一想真的要適合有linux基礎的玩才適合阿,用硬體還是比較適合像我這種已經把linux忘光光的人囉!! |
回覆 |
會員 | 謝謝很實用 |
回覆 |
會員 | 這很不錯啊... 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 -------------------------------------------------------------------- | |
回覆 |
|
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。