- 論壇徽章:
- 0
|
本帖最后由 kkkggg 于 2013-11-21 17:01 編輯
備忘。
dummynet的動態(tài)帶寬分配功能很好用。在共享上網的環(huán)境下,要限制某些上傳流量過大堵塞網絡的ip的時候,按ip數動態(tài)分配帶寬比按優(yōu)先級或分配固定帶寬的方式要更有效。
下面先簡單描述一下數據包經過本防火墻規(guī)則匹配的流程,方便理清規(guī)則制定思路。復雜的地方在于本規(guī)則同時使用了透明代理和單ip流量控制以及狀態(tài)規(guī)則。
以下規(guī)則適用于系統(tǒng)參數net.inet.ip.fw.one_pass為1時的情況。即數據包只在同一方向放行一次。
如果把數據包按經過接口方向劃分類別的話,ipfw規(guī)則主要有in和out兩大方向,再乘以接口數就等于數據包接口方向類型總數。每種類型的數據包只匹配于同種類型的規(guī)則(一條規(guī)則可能屬于多種類型)。比方說通常一個數據包從內網傳輸到外網被看做是經過一個方向,但實際上這個數據包要至少匹配ipfw規(guī)則中的兩種規(guī)則:內網in方向和外網out兩種規(guī)則。
一般情況下(有一塊內網網卡,一塊外網網卡)的ipfw規(guī)則按接口方向分為6類
環(huán)路接口in
環(huán)路接口out
內網接口in
外網接口out
外網接口in
內網接口out
#環(huán)路接口in
放行所有數據包
#環(huán)路接口out
放行所有數據包
#內網接口in
拒絕指定的數據包
check-state
skipto跳轉需要放行并進行上行流量控制的數據包到拒絕規(guī)則后面,并加上keep-state
拒絕未匹配到的數據包
動態(tài)單個ip上行流量控制(因為涉及http代理,所以在這里進行每個ip上行流量控制。因為在外網接口那里已經分不出經過代理的http數據包原始源ip,無法很好的為每個ip分配帶寬)
#外網接口out
skipto跳轉不需要http代理的數據包到fwd規(guī)則后面
fwd重定向訪問http端口的數據包到本地http代理服務端口
nat源地址轉換
#外網接口in
拒絕指定的數據包
nat目的地址轉換
#內網接口out
check-stat
放行所有數據包
制定規(guī)則時,可以先按各個方向分別制定規(guī)則,然后把各個方向的規(guī)則根據優(yōu)先級順序拼在一起。規(guī)則匹配次數不一樣,對CPU造成的負荷不一樣。所以應該把匹配最頻繁、最多數量的數據包的規(guī)則盡量靠前。check-state規(guī)則在每個方向上都進行匹配,要特別小心。由于本規(guī)則在內網in和外網out方向均有跳轉語句,且跳轉到的規(guī)則動作不同。要想兩個這方向的規(guī)則互不影響的話,要把外網out規(guī)則放到前面,check-state放到中間,帶狀態(tài)的內網in規(guī)則放到后面。
下面是規(guī)則代碼,nat用的是libalias- #定義網絡接口名變量
- ext_if="tun0"
- int_if="xl0"
- lan_net="10.0.0.0/22"
- #定義細分類端口變量(規(guī)則中不直接引用此類變量名,只為方便標識,后面會合并到主要分類中)
- general_tcp_ports="25,53,110,143,443,636,993,995" #smtp,dns,pop3,imap,https,ldap,ipops,imaps
- general_udp_ports="53,123" #dns,ntp
- msn_tcp_ports="569,1503,1863,5061,7001"
- government_tcp_ports="5222,5678,7002,7888,8980" #某些政府服務器端口
- working_tcp_ports="212,1433,3306" #,mssql,mysql
- qq_udp_ports="8000"
- #定義主要分類端口變量(會在規(guī)則中直接引用的變量名)
- http_proxy_ports="80"
- #用戶組1額外開放的端口
- group1_tcp_ports="22,6618,8000,8080,9898" #ssh,酷狗,手機軟件,手機軟件,手機軟件
- group1_udp_ports="3545,6618" #酷狗,酷狗
- #定義特殊應用1的目的端口
- special_app1_tcp_ports="8080" #手機QQ
- #合并先前的細類,注意引號內不能有空格,一條規(guī)則端口參數項最多為30個
- permitted_tcp_ports_1="$general_tcp_ports,$msn_tcp_ports,$government_tcp_ports,$working_tcp_ports"
- permitted_udp_ports_1="$general_udp_ports,$qq_udp_ports"
- #本機開啟服務端口
- localhost_tcp_service="3000,3128,10000" #ntop,squid,webmin
- localhost_udp_service="53,123" #dns,dhcp,ntp
- #清空系統(tǒng)中已有的規(guī)則
- ipfw -q flush
- ipfw -q table all flush
- ipfw -q pipe flush
- #定義ip地址表
- #定義私有網絡地址表priv_net
- ipfw table 5 add 127.0.0.0/8
- ipfw table 5 add 192.168.0.0/16
- ipfw table 5 add 172.16.0.0/12
- ipfw table 5 add 10.0.0.0/8
- #定義拒絕的外網源地址
- ipfw table 10 add 200.0.0.1/32 #sample
- #定義無網絡權限客戶機ip
- ipfw table 15 add 10.0.1.25/32 #xxx
- #定義拒絕訪問目的地址ip
- ipfw table 20 add 220.164.144.207
- #無限制端口服務器地址
- ipfw table 25 add 202.105.113.38/32
- #定義允許訪問所有tcp端口的目的地址(http端口數據包依然要通過代理服務)
- ipfw table 30 add 116.228.70.245/32 #圓通物流
- #定義高訪問權限客戶機ip地址(除了不允許訪問的外網ip不能訪問外)
- ipfw table 35 add 10.0.0.9/32 #test
- ipfw table 35 add 10.0.0.63/32 #voip
- #定義不經過squid代理,直接訪問的服務器ip地址
- ipfw table 40 add 202.128.247.44/32 #海關物品編碼查詢
- ipfw table 40 add 58.61.142.185/32 #順豐快遞查單
- ipfw table 40 add 14.17.29.0/24 #qq離線文件服務器
- ipfw table 40 add 113.108.0.0/19 #qq離線文件服務器
- ipfw table 40 add 113.142.0.0/19 #qq離線文件服務器
- ipfw table 40 add 115.236.128.0/19 #qq離線文件服務器
- ipfw table 40 add 124.115.10.0/24 #qq離線文件服務器
- ipfw table 40 add 182.131.0.0/19 #qq離線文件服務器
- ipfw table 40 add 182.140.128.0/19 #qq離線文件服務器
- ipfw table 40 add 119.146.200.0/27 #網易云閱讀
- #定義不經過squid代理的客戶機ip
- ipfw table 45 add 10.0.1.64/32 #xxx
- #定義訪問與$special_app1_tcp_ports端口對應的地址
- ipfw table 50 add 121.14.64.0/18 #手機QQ
- #定義用戶組group1地址
- ipfw table 55 add 10.0.0.3/32 #xxx
- ipfw table 55 add 10.0.1.64/32 #xxx
- #規(guī)則開始
- #允許本地lo0接口雙向訪問
- ipfw -q add 100 allow all from any to any via lo0
- #放行發(fā)往內網的數據包
- ipfw -q add 200 allow all from any to $lan_net out xmit $int_if
- #丟棄指定外網ip發(fā)過來的數據包
- ipfw -q add 300 deny ip from table\(10\) to any in recv $ext_if
- #拒絕無網絡權限客戶機ip
- ipfw -q add 400 reject ip from table\(15\) to any in recv $int_if
- #丟棄ip分片包
- ipfw -q add 500 deny ip from any to any in frag
- #拒絕欺騙數據包進入
- ipfw -q add 600 deny ip from me to any in
- #ipfw -q add 700 deny ip from table\(5\) to any in recv $ext_if
- #NAT接收到的外網接口的數據包
- ipfw -q nat 1 config if $ext_if #nat綁定到外網接口
- ipfw -q add 999 nat 1 ip from any to any in recv $ext_if #nat從外網來的數據包
- #放行管理員客戶機
- #ipfw -q add 1100 allow ip from 10.0.1.10/32 to any in
- #ipfw -q add 1200 allow ip from any to 10.0.1.10/32 out
- #允許內網ssh連接本機(沒使用狀態(tài)規(guī)則,避免刷新規(guī)則時斷開連接)
- ipfw -q add 1300 allow tcp from any to me 22 in recv $int_if
- #ipfw -q add 1400 allow tcp from me 22 to any out xmit $int_if
- #允許本機dhcp服務
- ipfw -q add 1500 allow udp from any 68 to any 67 in recv $int_if
- #ipfw -q add 1600 allow udp from me 67 to any 68 out xmit $int_if
- #讓不使用http代理的數據包跳過下面的2999轉發(fā)規(guī)則
- ipfw -q add 1700 skipto 3999 tcp from any to table\(25\) out recv $int_if #無限制外網ip
- ipfw -q add 1800 skipto 3999 tcp from table\(35\) to any out recv $int_if #無限制用戶
- ipfw -q add 1900 skipto 3999 tcp from any to table\(40\) $http_proxy_ports out recv $int_if #訪問指定不使用http代理的服務器地址
- ipfw -q add 2000 skipto 3999 tcp from table\(45\) to any $http_proxy_ports out recv $int_if #指定不使用http代理的客戶機
- #轉發(fā)從內網接口進入的要出去的端口為$http_proxy_ports的非本機數據包到本機的3128端口(squid代理)
- ipfw -q add 2999 fwd 127.0.0.1,3128 tcp from $lan_net to not me $http_proxy_ports out recv $int_if
- #NAT要從外網接口出去的數據包
- ipfw -q add 3999 nat 1 ip from $lan_net to any out xmit $ext_if
- #狀態(tài)檢查
- ipfw -q add 4999 check-state
- #拒絕訪問指定目的地址
- ipfw -q add 5100 reject ip from any to table\(20\) in recv $int_if
- #允許指定放行的上行數據跳到規(guī)則10100進行流量控制
- #放行訪問指定本地服務端口的數據包(帶狀態(tài))
- ipfw -q add 5200 skipto 10100 udp from any to me $localhost_udp_service in recv $int_if keep-state
- ipfw -q add 5300 skipto 10100 tcp from any to me $localhost_tcp_service in setup recv $int_if keep-state
- #放行訪問任意端口的指定服務器地址
- ipfw -q add 5400 skipto 10100 ip from any to table\(25\) in recv $int_if keep-state
- #放行內網進入,訪問網頁代理端口$http_proxy_ports的數據包
- ipfw -q add 5500 skipto 10100 tcp from any to any $http_proxy_ports in recv $int_if
- #放行內網進入,$permitted_tcp_ports_1指定tcp端口的數據包
- ipfw -q add 5600 skipto 10100 tcp from any to any $permitted_tcp_ports_1 in setup recv $int_if keep-state
- #放行內網進入,$permitted_udp_ports_1指定udp端口的數據包
- ipfw -q add 5700 skipto 10100 udp from any to any $permitted_udp_ports_1 in recv $int_if keep-state
- #允許訪問所有tcp端口的指定目的地址(http依然要通過代理)
- ipfw -q add 5800 skipto 10100 tcp from any to table\(30\) in setup recv $int_if keep-state
- #放行高訪問權限客戶機
- ipfw -q add 5900 skipto 10100 ip from table\(35\) to any in recv $int_if keep-state
- #放行指定group1用戶組指定tcp端口的數據包
- ipfw -q add 6000 skipto 10100 tcp from table\(55\) to any $group1_tcp_ports in setup recv $int_if keep-state
- #放行指定group1用戶組指定udp端口的數據包
- ipfw -q add 6100 skipto 10100 udp from table\(55\) to any $group1_udp_ports in recv $int_if keep-state
- #放行訪問特殊應用1目的地址和tcp端口的數據包
- ipfw -q add 6200 skipto 10100 tcp from any to table\(50\) $special_app1_tcp_ports in setup recv $int_if keep-state #手機QQ
- #放行icmp
- ipfw -q add 6300 skipto 10100 icmp from any to any in recv $int_if keep-state
- #拒絕以上規(guī)則未匹配到的內網數據包并返饋回源地址
- ipfw -q add 9999 reject ip from $lan_net to any in recv $int_if
- #流量控制(包括http代理在內的本機外出數據包沒有到達這里的流量控制規(guī)則)
- #內網接口上綁定隊列
- ipfw -q add 10100 queue 1 ip from $lan_net to not me in recv $int_if
- ipfw -q add 10200 queue 1 tcp from $lan_net to me 3128 in recv $int_if #直接訪問本機http代理的數據包
- #為隊列指定pipe下,設定源地址匹配掩碼,按實時ip數平分帶寬
- ipfw -q queue 1 config pipe 1 mask src-ip 0x000003ff
- #設定管道帶寬(adsl上傳帶寬本應為500Kbit左右,但要為本機發(fā)出的數據包留出部分帶寬,否則http代理可能無法正常工作)
- ipfw -q pipe 1 config bw 420Kbit/s
- #最后一條
- ipfw -q add 65000 allow ip from any to any
復制代碼 |
|