2007年9月29日

Linux & RAID

比較有玩電腦的都知道,RAID可以容許硬碟故障,家裏的file server和nat最早都是淘汰的電腦組的,file server在一開始組的時候,只是因為mp3都放自己電腦的磁碟,別人不方便聽,而且別人聽mp3,複製個mp3,電腦就會lag,因此當時把淘汰的電腦拿來組file server。
當時組file server時,就是盡全力把所有能動的硬碟都往上面塞,反正廢物利用~後來硬碟不夠大了,開始針對它買硬碟,當時也都沒有想到硬碟掛了怎麼辦,只在想,哪會這麼衰,而且這幾顆硬碟耐操的勒~溫度50,60都沒事,哪是說掛就掛的~
這次暑假,更新gigabit網路,添購了gigabit網路卡、HUB和網路線(更新幾條線變成CAT6,預期這幾條線未來到10G頻寬應該都ok),誰知道K7的機器似乎不大支援Intel PRO/1000 Server Adapter,100M時沒事,1G就不行了~
我因此改了改CMOS的設定,擔心是CMOS設定的問題,誰知道這一改,反而就出事了~~
因為那台K7,裝了很多硬碟,我另外加了IDE擴充卡和SATA1擴充卡,CMOS設定一改,動到了PCI write cache, pci 2x之類的設定,結果SATA卡剛好在設定的插槽上,開進Linux之後,就亂動亂跑,結果聽聽mp3, 讀讀資料就彈出資料錯誤的訊息,然後硬碟資料就毀了~
受害者有SATA 80G和SATA 250G,裡面卡通mp3,無失真音樂檔,資料.............唉~~~

也因此全面更新file server主機板和建RAID的想法,暑假就砸了不少錢建起來了,目前這台電腦的硬體在新電腦中很初階,P5KPL-VM + E2140 + DDR2 667 1G................

說了半天終於要開始說重點了~~~RAID~~
要建立RAID,我一開始很猶豫要買RAID卡還是用Linux的soft RAID,結果在看了這兩篇的討論之後:
http://moto.debian.org.tw/viewtopic.php?t=6915
http://moto.debian.org.tw/viewtopic.php?t=4104

我發現除非買到超過6000的RAID卡,否則要有硬體RAID的支援,都是天方夜譚,連一些高級RAID卡,在Linux下也是靠soft,那何必用它呢?因此,我決定用soft RAID來建置file server的磁碟陣列。

話說Linux的soft RAID非常的有彈性,Linux的soft RAID是以partition為單位的,因此不像硬體RAID卡,它不需要使用整顆硬碟作RAID,只要每個磁碟都切出相同大小的partition(大小差一點沒關係),就可以組建RAID了,此外,也因為是partition為單位,SCSI、IDE、SATA都沒差,只要不在意速度的差異,完全可以混組RAID,這點~硬體RAID卡是作不到的,此外,硬體卡有個麻煩,如果是主機板內建,主機板掛了,資料就讀不出來了,除非找到同樣晶片的主機板來開機,如果是硬體RAID卡,要擔心卡片壞掉,壞掉一樣資料就讀不出來了,soft RAID則不,只要有Linux LiveCD,隨時可以把RAID掛載使用,不受硬體的影響。
而以我這邊來說,因為家裏的硬碟是陸陸續續買的,因此size有差,大部分都是80G的(本來有1顆60G,但RAID安裝上去後,就經常出現DMA error,之後RAID就顯示fail,因此換新了),1顆是160G的,其餘的主要就是這次新添購的3顆SATA 320G組成的RAID,分別是
80G x 3 + 160G => 240G RAID5 (160切剩下80G當Linux系統碟,按一般方式安裝Linux使用)
320G x 3 => 640G RAID5

至於前面提過的250G,目前閒置中,準備東征西討去跟別人copy卡通mp3,接著考慮網拍賣了改買320G,把320G RAID再提昇~

至於RAID的組建其實不難,剛開始不瞭解時會有些緊張,但是習慣之後就還好,我個人覺得安裝的部份,寫的不錯的是:
http://williewu.pbwiki.com/SoftRaid

至於損毀之後的加入動作也很容易,首先要知道的是,Linux的soft RAID會自己判斷硬碟是否損毀,判定損毀會自動把該磁碟自動設成fail和removed,之後只要將新的硬碟裝上去,進入系統,用cfdisk將RAID partition切割好(要確定有正確寫入唷~cfdisk最下面會顯示訊息,提示正確寫入,或需要重新開機),就可以用mdadm --add來把它加入了,加入之後,它就會自己rebuilding(過程和前面網頁教的,RAID1硬碟損毀時排除方法相同)~

中間要注意的是,rebuild的時候,不論是一開始建立還是換上新硬碟,過程中都不能關機或重新開機,必需要一直待在OS中,直到rebuild完成才可重新開機。

如果想體驗一下過程,我們也可以下指令,手動的讓RAID的特定磁碟發生fail、removed的狀態,當然,這情況下磁碟是好的,只是我們以下指令的方式,達到和真實的情況相同。

最後,RAID5的技術很有趣,不知道有沒有人想過,為何它的容錯技術,不論幾顆磁碟,都只需要花費1顆磁碟?
它其實滿神奇的,使用邏輯閘XOR,以1個bit來說,不論有多少顆硬碟,每顆的1個bit,假設是1,0,0,1,0,1,0,0,經過XOR計算之後,就只會產生1個bit的數值1,這是很巧妙的事,而當壞掉1顆磁碟時,同樣的,用包括XOR得出的那1個bit作XOR,又會反過來得出其中任何1個數值,達成容錯的效果。

2007年9月25日

UPnP Client

這篇算是接續前一篇,因為隨便搜尋就會發現,很多很多很多的人在問,有沒有UPnP tools可以很簡單的開port,有人要Linux版的,有人要Windows版的,因此我特別將miniupnp的UPnP Client抓出來圖文解說一下,心動的自己點連結下載,沒感覺、不瞭解、看熱鬧的..........隨意即可。
miniupnp的網站在http://miniupnp.free.fr/,在其中Download的頁面中,就有可以直接下載的連結。
連結中,Windows的部份直接就有提供編譯好的binary版本,省去了安裝MinGW,以及編譯的麻煩。
至於Linux部份,我直接下載source code,解壓縮後打make.....make install.....cp upnpc /usr/local/bin/ 就完成了,非常之輕鬆愉快~

以下是在Windows上執行的畫面,首先我們先執行看看,看長什麼樣子(備註:我已經先copy到C:\WINNT\system32\ 我是win2k系統):

我們可以看到,它有簡單而詳盡的說明。

接著我們可以用它來查詢目前UPnP Server開了哪些Port:

ㄟ~可以看到目前開了1個Port,是192.168.1.6的utorrent開的35050。

再來我們試著來開port看看,我們開TCP 11131和UDP 11142:


恩~看到了,我們成功的把port開出來了。

再來我們把它們刪掉:


簡單方便吧~這樣一來,只要有支援UPnP的NAT,不論是AP、Linux、FreeBSD,我們都可以輕易的開個port來用,而Client更是沒有顧忌,不論是Linux、FreeBSD、Windows,也都可以簡單方便的使用這個工具,ㄟ~MacOS目前我不清楚有沒有支援,不過MacOS和Linux、FreeBSD都很親近,我相信是有支援的。

最後補充一點,有沒有發現整個示範過程中,沒有出現任何的帳號、密碼,而且由upnpc建立的port,他的程式名稱也只是簡單的libminiupnpc,看起來很容易竄改的感覺。
沒錯~UPnP方便歸方便,畢竟是M$提出來的東西,但是目前的UPnP有很大的問題,就是安全性極差,可以在google上搜尋upnp和安全漏洞,一定可以發現,之前已經有人發出UPnP有嚴重的安全性問題,主要原因可能就在於目前的UPnP Server多半都沒有認證機制,像miniupnpd只有簡單的設定許可的網路區段,這在目前是很嚴重的問題,沒有大量的浮現,主要原因恐怕是目前大部分人對它技術還不夠熟悉,不過最近client已經有很多人寫出來了,我相信相關的病毒在不久的未來就會出現,不論是針對UPnP的DDoS,或者是病毒利用UPnP自動開洞進行入侵,我相信會出現的,可能再說這麼說得時候,已經有寫好的版本,只是還沒大規模感染或我不知道罷了。

新神兵利器~UPnP(miniupnpd)

說來有點遜,很久前就把UPnP弄上FreeBSD了,可是一直以來都怪怪的,對UPnP又不瞭解,也就一直放著爛~
UPnP在FreeBSD上得資料不多,永遠都是安裝libupnp和LinuxIGD,然後就是開MSN測試,話是沒錯,可是MSN怎樣都會上線,也只會顯示個你是透過UPnP上線,過程順不順利,完全不知道~

最近重新安裝Azureus後,發現它UPnP的部份很詳盡,對於成功、失敗、和Server的對談都有顯示,才發現UPnP已經掛點很久了~更進一步發現,LinuxIGD和libupnp在FreeBSD上根本不支援pf,因此重新搜尋相關資料。
搜尋後發現,BSD系列有另一套UPnP,而且整個程式很小,甚至被移植到Linux上,像是OpenWRT就有它的身影,它叫做miniupnpd。

miniupnpd設定不難,也就1個設定檔miniupnpd.conf,裡面設定也很簡單,也就設定WAN界面卡和LAN IP,還有allow的網路區段。
不過它很方便的是,它可以直接執行,用「-d」參數即可前端執行,然後就可以看到UPnP Client和它的對話,像是Azureus、MSN都很清楚~
最最重要的是,它在設計時,就是針對pf設計,所以對pf的支援性很好。

話說UPnP在Linux、FreeBSD上,幹嘛要跟防火牆配合?
這就是我一直不瞭解的部份,這次找資料後終於理解了~

UPnP它當然有它的規範,就像其他protocol一樣,他有自己的protocol spec,簡單的來說,UPnP Server其實是一個小型的應答器,走的是類似Web Server的protocol(根本就算是),對於Client,Client部份發出Request,UPnP Server則利用Web Server的對話方式,提供以xml檔案為基礎的對話內容。

在FreeBSD上,基本的UPnP Server設計很簡單,它的功能就是幫你作Port對應,而實際上,就像前面說過的,它本身只是應答器,所有的對應動作,它還是交給Firewall,因此UPnP Server要支援防火牆,針對特定防火牆下Port對應的指令,以miniupnpd來說,在BSD上支援pf,在Linux上支援Netfilter;而LinuxIGD+libupnp在FreeBSD上則是支援IPFilter(ipnat)。

此外,miniupnpd除了UPnP Server之外,也有開發UPnP Client,最重要的是,miniupnp整個講求的就是小,因此不論是Server還是Client,都很容易被移植,所以miniupnp的client支援Linux、FreeBSD、Windows(MinGW),而且Client還可以用來顯示目前UPnP Server的狀態(Server資訊和目前對應情況),這樣一來,任何時候要開任何Port,都可以很輕易的用Client程式對應,任何時候要查詢Server目前的對應狀況,也可以輕鬆的查詢。

2007年9月23日

FON & heartbeat


FON是一個理想,它希望透過大家共享的方式,在全世界將wireless建置起來,為此,它提供了便宜的wireless AP讓大家購買、使用,尤其在一開始時,它提供了免費的wireless AP(在台灣要165元運費),這一批wireless AP正如之前提過好幾次的,硬體還不錯。

可惜FON提供的軟體不夠好用,功能不夠強,因此很多人就開始自己編譯自己需要的Linux kernel供使用,大大強化它的能力。

麻煩的是,FON的AP便宜歸便宜,它要求你第一年一定要開機,並且隨時檢查你的開機狀態,只要你關機超過1個月,就會被寄信通知要你注意,一旦超過一定時間,就要你付賠償金,正因為這個限制,讓很多人不敢隨便的將FON亂刷,乖乖的用FON提供的軟體。

正所謂有需要,就有破解..................... = =||

國外有人將它的開機狀態檢查進行了完整的分析,其實它的開機狀態檢查很簡單,它利用Linux上的crontab,每5分鐘執行一次script,而script主要的功能,則是利用ssh client連線到FON的伺服器,連線之後一方面提供FON的資訊(MAC位址)讓伺服器知道是哪一台FON被檢查,另一方面則提供FON查詢是否有更新程式,有~則自動更新,這樣的開機狀態檢查行為,國外的人取了個巧妙的名稱,叫做「heartbeat」,也就是「心跳」。

因此,為了提供將FON刷成DD-WRT的人也能通過檢查,國外有人寫了simthefon,讓DD-WRT或其他FON也能夠發出心跳。

之前我一直很乖,FON都乖乖開著,只是改過了bridge mode而已,沒想到有次更改,把心跳改停了,加上那陣子正好換Hibet FTTB,家裏網路不大穩,過了一陣子就收到通知信了..... = =
那時候FON有開165元買天線的活動,我還因此差點買不成,讓我在刷完DD-WRT之後,毅然決然的改用simthefon。



simthefon的程式設定很簡單,它只是個script,程式最前面就可以設定幾個需要的變數,像是最重要的WLAN網卡MAC和LAN的MAC(預設是直接讀取環境變數,DD-WRT直接寫在環境變數中),其他也可以設定路徑。
接著就是放入/etc/crontab中定時執行。
在DD-WRT中,因為DD-WRT本身都是由web介面控制的,整個系統除了web介面的設定外,不大能儲存,因此它是寫成startup script,開機的時候將simthefon下載好,並把排程寫入到/etc/crontab當中。

如果是非DD-WRT,有一點要注意的,因為它的ssh client不是openssh-client,而是專為嵌入式這類小型系統而開發的SSH~dropbear的client程式,它叫做dbclient,如果要在Linux上執行,以Debian來說,我們要安裝dropbear,否則它會說欠缺了程式。

安裝方式如下網頁:
http://www.dd-wrt.com/wiki/index.php/LaFonera_Software_Heartbeat

而標題圖片就是FON上線的檢查頁面,這是我停掉一個FON的心跳後抓的圖。

家裡網路架構之變化-2(使用2個FON(Bridge mode與Client Bridge mode)建置無線網路)

話說FON真是好東西阿~那時候花330元買了2個(1個165元),現在覺得實在是物超所值,而且很後悔早知道就多買幾個了。

正如數個月前剛裝FON時說過的,FON硬體其實很不錯,就是軔體的設定莫名其妙,不能設置Bridge mode非常的麻煩,雖然說市面上很多AP也都是這樣,但是不方便就是不方便,這也讓我對市面上的AP很有些未知,如果要買,我還真的是不會挑,很怕挑到不符合需求的機器,我不能瞭解的是,Bridge mode是很進階的功能嗎?為何這明明是軟體的設定,AP卻不做進Web介面中,而且不讓你這麼設~~

話說家裏的wireless從PCI卡改成FON後,以往wireless不穩、容易斷線的問題統統消失了,不過話說回來,PCI的wireless好像是PCI2.1規格的介面卡,不知道會不會是因為PII-300不支援PCI2.1,所以才問題不斷~~

這次暑假家裏網路架構的變化,第2個比較大的,就是將第2顆FON從學校拿回來,然後設置成了Client Bridge mode。

在家裏的網路中,我爸的房間一直以來都沒拉網路線,一直都是用wireless,然後我爸房間事主臥房,會有個獨立衛浴,這增加了牆壁的數量,讓隔壁房間的wireless訊號到了我爸房間就可憐兮兮,而我爸使用的電腦,是舊式的精英攜帶式電腦,也就是做的很像筆電,但是沒有PCMCIA、沒有電池,使用桌上型電腦用的CPU、晶片組,因此價位上很便宜。
這台電腦因為很舊了,又沒有擴充槽,整台電腦能夠外接的部份,就是4個USB1.1和1個網路接頭,之前給它用USB wireless,可是信號一直很差,而且因為是USB1.1,USB1.1速度太慢,根本沒辦法上到802.11g,802.11b/g USB wireless卡還很貼心的跳出訊息說,因為只支援到USB1.1,因此將關閉802.11g,只使用802.11b來傳輸~
結果就是那台電腦網路很慢~慢~慢~
連開網路芳鄰傳檔案,都可以跳出是否強制關閉的訊息~

為了解決這個問題,我想到利用FON,把原本 有線->無線 的AP功能反過來用,改成 無線->有線 的功能,可惜設了很久都失敗,上網查了之後才知道,原來這樣的功能是一個特殊的模式,稱之為Client Bridge mode,而且最重要的是,FON內建的系統~不~支~援~
因此,我終於在使用了4個月後,將一台FON給刷了,這台FON徹底的違約了.... = =||

雖然FON內建的系統不支援,但是FON的第三方系統DD-WRT支援(講這麼文謅謅,就是說別人惡搞的FON Linux有支援就對了)。
所謂的Client Bridge mode其實是很特殊的模式,不過它在一些場合被使用,而且很方便,下面這張圖,是國外的網站解說Client Bridge的架構圖,我就公然的借用拉~
http://www.wi-fiplanet.com/tutorials/article.php/3639271

這就是Client Bridge mode,也就是說,網路的兩端不使用網路線來連接,直接用wireless的2個AP來連接,兩端可以各自接上多個網路設備、電腦,全部都在同一個網路中,下面這張架構圖則表示了更為複雜一點點的架構。
http://www.dd-wrt.com/wiki/index.php/Wireless_Bridge

這張圖的架構,可以想做兩層樓的辦公室,各有自己的網路,透過Client Bridge mode,可以讓2層樓的網路串連在一起,不但電腦間可以方便的連線,也只需要一條ADSL即可上網際網路。

Client Bridge mode的架構上,其實就是2台AP,一台AP是一般的AP,使用一般的AP mode,另一台AP則需要設為Client Bridge mode,之所以稱為Client Bridge,因為Client Bridge的這台AP以wireless的角度來說,它是Client,但是同時,它又有bridge的功能,讓有線網路的其他電腦可以透過它橋接在wireless上。

還記得舊版的XBOX嗎?舊版的XBOX本身是一台PIII-700的電腦,它有額外販賣wireless的模組,而且這個模組要價3000多元(新台幣),一般市面上的USB wireless都不能用,為什麼這麼貴?難道XBOX有綁wireless嗎?
不是~相反地,XBOX根本沒有wireless,根本不支援wireless,它的wireless模組好聽叫做模組,實際上就是一台道地的Client Bridge mode AP,而且只提供1個網路接頭,硬體上和FON非常接近,連大小都很接近,但是價格是FON的好幾倍。

因此事實上,在論壇中,的確有很多人拿FON接XBOX,也有人拿FON接網路印表機,變成wireless Network Printer,都很有趣~

喔~回正題,我前後花了約2周左右的時間,搞清楚了FON不支援,DD-WRT支援,膽顫心驚的刷了DD-WRT,測試了很久才發現DD-WRT的Client Bridge不是每一版都能很好的支援,經過多次測試之後,發現能很好的支援Client Bridge mode的最新版,是2007-06-20的版本,更新的版本,相同的設定都無法動作。

不過很不幸的,Client Bridge mode後面的電腦,無法使用PPPoE撥接,最近查了之後才知道,Client Bridge的bridge功能,不是單純的bridge,所以並沒有辦法像bridge一樣將所有網路protocol都傳遞過來,可能需要Client Bridge mode的AP上再設定一個PPPoE Relay,不過這部份現階段仍然沒有設定成功,2007-06-20這個版本的軔體,pppoe-relay似乎有問題,不然就是client bridge環境太怪異,pppoe-relay不支援。

家裡網路架構之變化-1(MPD+pf設定檔與心得)

FreeBSD PF 心得:

FreeBSD PF 推薦網址如下:
==================================================================
我的pf.conf的主體是參考
http://72.14.235.104/search?q=cache:uLgfqA9R6c4J:fangshen.hwai.edu.tw/%3Fp%3D24+freebsd+pf%E8%AA%AA%E6%98%8E&hl=zh-TW&ct=clnk&cd=3&gl=tw&lr=lang_zh-TW&client=firefox

這裡除了很簡要的設定之外,最下面的指令介紹我到現在還經常上google查
FreeBSD 5.3 Release PF 初體驗

這裡的防掃描偵測不錯,不過我沒用就是了,他的指令更完整....
http://netflow.kmseh.gov.tw/blog/index.php?op=ViewArticle&articleId=6&blogId=1
(失聯)

FreeBSD handbook的PF教學,這一定要看的,他的重點是跟你說kernel怎麼選會支援pf.....ALTQ有哪些~~~
FreeBSD 使用手冊 Chapter 27 防火牆

這篇很容易被查到,我好像看了好幾次了... = =||
他對pf的介紹還不錯
FreeBSD-我的 PF 學習筆記

這是大陸的善心人士,他們把pf的man 給翻譯成簡體了~
pf中文手冊(for openbsd,但同樣適用FREEBSD)
==================================================================

看的順序則建議如下:
==================================================================
先看handbook瞭解pf要怎麼編譯進去~~
FreeBSD 使用手冊 Chapter 27 防火牆

再來看介紹
FreeBSD-我的 PF 學習筆記

之後大致瞭解pf的架構(Macro、Table...等一堆的語法順序),接著需要個樣板,參考主體
http://72.14.235.104/search?q=cache:uLgfqA9R6c4J:fangshen.hwai.edu.tw/%3Fp%3D24+freebsd+pf%E8%AA%AA%E6%98%8E&hl=zh-TW&ct=clnk&cd=3&gl=tw&lr=lang_zh-TW&client=firefox

從主體中可以知道變數的定義方式,然後特別注意,有分單一的變數和多個的變數,接著可以這個,它對NAT、防火牆的定義講解的比較簡單,ALTQ一律先跳過,這東西每個人說得都不同,因為他有好幾種~
http://freebsd.ntut.idv.tw/document/freebsd_pf_nat.html

最後看上面或下面的網址,知道指令怎麼下
http://netflow.kmseh.gov.tw/blog/index.php?op=ViewArticle&articleId=6&blogId=1

而翻成簡體的pf man文件,則可以用來查
pf中文手冊(for openbsd,但同樣適用FREEBSD)
==================================================================

mpd可以先抄我的來改,之後再去看......基本上就是sample改的~

至於ALTQ.....我建議先不要用........
ALTQ很多人寫法差異很大,因為ALTQ是QoS的名稱....它裡面有好幾種演算法,每種演算法的設定參數和方式都不同.........

mpd.conf
startup:
# configure the console
set console port 5005
set console ip 0.0.0.0
set console user ycfu sister
set console open
# configure the web server
set web port 5006
set web user ycfu sister
set web open

#
# Default configuration is "myisp"

default:
#PPPoE Relay設定
rnew r1 PPPoE-in PPPoE-out
#載入PPPoE撥接設定
load PPPoE

#
# PPPoE client example (see also mpd.links.sample entry "PPPoE")
#

PPPoE:
new PPPoE PPPoE
set iface route default
set iface disable on-demand
set iface idle 0
set iface enable tcpmssfix
set iface up-script /usr/local/etc/mpd4/mpd_init.sh
set ipcp yes vjcomp
set link max-redial 0
set link mtu 1492
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set bundle disable multilink
set auth authname ooxxoox@ip.hinet.net
set link no acfcomp protocomp
set link disable pap chap
set link accept chap
set ipcp enable req-pri-dns
set ipcp enable req-sec-dns
set link keep-alive 10 60
open


mpd.links
#
# For our PPPoE connection, using Ethernte interface "fxp1"
# Often the service is ignored. If yours is required, replace
# the "whatever" string with your PPPoE service string.
#

PPPoE-in:
set phys type pppoe
set pppoe iface ste0
set pppoe service ""
set pppoe enable incoming

PPPoE-out:
set phys type pppoe
set pppoe iface ste1
set pppoe service ""
set pppoe enable originate
set pppoe disable incoming
PPPoE:
set phys type pppoe
set pppoe iface ste1
set pppoe service ""
set pppoe enable originate
set pppoe disable incoming


pf.conf
#===================== 介面與變數設定 ================
ext_if = "ng0"
int_if = "ste1"
out_bw = "20Mb" # 要做 QoS 要設定頻寬總量(總上傳頻寬20Mb)
in_bw = "100Mb" # 下載頻寬(總下載頻寬100Mb)
ack_bw = "19.6Mb" # TCP ACK 的頻寬設定(ack頻寬保留2%, 0.4Mb)
internal_net = "192.168.0.0/16"
ycfu_pc = "192.168.1.1" # 個人PC區域網路IP
file_server = "192.168.1.6" # 檔案伺服器區域網路IP
media_server = "192.168.1.7" # MediaCenter區域網路IP

# 表格區,同上也是變數定義,但可以定義多個位址
ftp_port="{21,2201,20021}"
# Linux aMule
linux_amule_port = "{4712, 4662, 4665, 4672}"
windows_emule_port = "{4771, 4772, 4775}"
windows_telnet_ssh = "1024"
bittorrent_port = "1045"
windows_vnc_port = "{7800, 7801, 7802, 7803, 7804, 7805, 7900, 7901, 7902, 7903, 7904, 7905}"
file_nx_port = "5901"
media_nx_port = "5902"
web_port = "{1000, 1001}"
bbonline_port = "{2927, 2896, 2897, 2898, 2899}"

# 針對 Echo Request 即 icmp type 8 如 ping 做出回應
icmp_types = "echoreq"

#===================== 選項設定區 ================
set loginterface $ext_if
#set optimization normal #一般的網路環境
#set optimization high-latency #高反應時間的網路
set block-policy return
set limit { states 30000, src-nodes 30000, frags 15000 }

# scrub 重新整理
scrub in all
scrub out on $ext_if max-mss 1452 # PPPoE 時,MSS (Maximum Segment Size) 的設定

#===================== ALTQ QoS ================
# Queueing: rule-based bandwidth control.
#altq on $ext_if bandwidth 2Mb cbq queue { dflt, developers, marketing }
#queue dflt bandwidth 5% cbq(default)
#queue developers bandwidth 80%
#queue marketing bandwidth 15%

# TCP ACK 設置
#(因為上下傳不對稱,當上傳滿載時就會影響下載)
#(原因在於 TCP「下載」時,需要回應「上傳」ACK,上傳已經滿載了,ACK自然送不出去)
#(透過 ALTQ QoS,我們可以設定 TCP ACK 有高於所有封包的優先權)
#關於 TCP ACK 可以參考:http://www.chweng.idv.tw/swintro/cfos.php
#關於 pf ALTQ 設定 TCP ACK 可以參考:http://www.benzedrine.cx/ackpri.html
#(測試中)
altq on $ext_if priq bandwidth $ack_bw queue { ack_pri, def_pri}
queue ack_pri priority 7
#queue ssh_pri priority 2
queue def_pri priority 1 priq(default)

#altq on $ext_if priq bandwidth $out_bw queue { max_out }
#queue max_out priority 2 priq(default)

#queue file_server_p2p priority 1 priq # File Server 的預設優先權最低 (限制 P2P 用)
#queue file_server_std priority 2 priq # File Server 的其他 Port 優先權一般
#queue default_std priority 2 priq

#altq on $ext_if priq bandwidth $in_bw queue { max_in }
#queue max_in priority 1 priq(default)

#===================== NAT 設定區 ================
# 基本設定
nat on $ext_if from $internal_net to any -> ($ext_if)

# Port 對應
# rdr: packets coming in on $ext_if with destination $external_addr:1234 will
# be redirected to 10.1.1.1:5678. A state is created for such packets, and
# outgoing packets will be translated as coming from the external address.
rdr on $ext_if proto tcp from any to any port $linux_amule_port -> $file_server
rdr on $ext_if proto udp from any to any port $linux_amule_port -> $file_server
rdr on $ext_if proto tcp from any to any port $bittorrent_port -> $file_server
#rdr on $ext_if proto tcp from any to any port $windows_vnc_port -> $ycfu_pc
rdr on $ext_if proto tcp from any to any port $windows_telnet_ssh -> $ycfu_pc
rdr on $ext_if proto tcp from any to any port $bbonline_port -> $ycfu_pc
rdr on $ext_if proto tcp from any to any port $file_nx_port -> $file_server
rdr on $ext_if proto tcp from any to any port $media_nx_port -> $media_server
rdr on $ext_if proto tcp from any to any port $web_port -> $file_server

# IP 對應
# 參照: http://blog.chinaunix.net/u/10047/showart_218183.html
#web_serv_int = "192.168.1.100"
#web_serv_ext = "24.5.0.6"
#binat on tl0 from $web_serv_int to any -> $web_serv_ext

# 解決 FTP 問題
# 參考 http://www.chinaunix.net/jh/5/879515.html
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
anchor "ftp-proxy/*"
#antispoof for $ext_if inet

#===================== 防火牆規則區 ================
pass in all
pass out all

# 搭配 ALTQ QoS 的防火牆設定
#block on $ext_if proto tcp from any to any # 先將所有 TCP 封包擋住,之後兩個再作 QoS
pass out on $ext_if proto tcp from $ext_if to any flags S/SA keep state queue ( def_pri, ack_pri )
pass in on $ext_if proto tcp from any to $ext_if flags S/SA keep state queue ( def_pri, ack_pri )
#pass out on $ext_if proto tcp from any to any port 22 keep state queue ssh_pri #無作用

#pass out on $ext_if proto tcp from 192.168.1.6 to any port $linux_amule_port keep state queue p2p_pri
#pass out on $ext_if proto tcp from 192.168.1.6 to any port $bittorrent_port keep state queue p2p_pri

#pass out on $ext_if proto { tcp, udp } from $file_server to any queue (file_server_p2p, file_server_std)
#pass in on $ext_if proto { tcp, udp } from any to $file_server queue (file_server_p2p, file_server_std)
#pass out on $ext_if proto { tcp, udp } from $ext_if to any flags S/SA keep state queue ( max_out )
#pass out on $ext_if proto { tcp, udp } from any to $ext_if flags S/SA keep state queue ( max_in )

# block all incoming packets but allow ssh, pass all outgoing tcp and udp
# connections and keep state, logging blocked packets.
#block in log all
#pass in on $ext_if proto tcp from any to $ext_if port 22 keep state
#pass out on $ext_if proto { tcp, udp } all keep state

# pass incoming packets destined to the addresses given in table .
#pass in on $ext_if proto { tcp, udp } from any to port 80 keep state

# pass incoming ports for ftp-proxy
#pass in on $ext_if inet proto tcp from any to $ext_if user proxy keep state

# assign packets to a queue.
#pass out on $ext_if from 192.168.0.0/24 to any keep state queue developers
#pass out on $ext_if from 192.168.1.0/24 to any keep state queue marketing

家裏網路架構之變化-1(改用MPD+pf)

話說前陣子辦了中華電信的FTTB之後,速度真的是快非常多阿~~
不比較還好,一比較就深深地為東森(亞太)那爛到爆炸的網路品質感到非常不爽,之前竟然可以忍耐這麼久,人真是容易滿足.... = =||
辦了中華電信的FTTB之後,發現之前的NAT主機(PII-300 64MB RAM FreeBSD 5.5-STABLE)不太夠力了,這真的是讓人感到不可思議,因此打算更換電腦,目前已經更新完成,換成了前任桌機K7度龍800,並且make world將FreeBSD更新到6.2-STABLE。
這次換FTTB之後,之前的網路設定幾乎重新設定了,在使用東森時,因為是用DHCP,不需要PPPoE撥接,這也是我遲遲不願意換ISP的主要原因,畢竟要將設定上手,要一點時間,這會造成網路無法使用的窘境。
原本使用東森時,使用DHCP取得IP,並使用IPFilter來建置NAT防火牆,現在則改為使用MPD進行PPPoE撥接,並使用pf來建置NAT防火牆,雖然IPFilter已經是kernel級的NAT了,可是它不具備QoS的能力,而pf是FreeBSD自5.5開始,從OpenBSD移植來的防火牆,它提供ALTQ來進行QoS的管制。
這次的設定更新其實很循序漸進,一開始先使用FreeBSD內建的ppp進行PPPoE撥接,並使用內建的NAT功能(使用最早期的natd完成),但是它是使用者層級的PPP撥接程式,它的NAT(natd)也是使用者層級的防火牆,很吃系統資源,因此逐步改為MPD+IPFilter,之後再改為MPD+pf。

升級到pf之後,照例對QoS進行些微設定,參照了
http://www.chweng.idv.tw/swintro/cfos.php
http://www.benzedrine.cx/ackpri.html

這兩個網頁後,簡單的對TCP ACK進行優先權設定,看起來是有點效果的,至少chw來時,我問他,然後當場用2個FileZilla對ftp.adsl.hinet.net進行上傳和下載,下載能夠維持在全速,上傳則會浮動的變化,這看來應該就是有效了~

再更新了軟體之後,這時候自然而然的,會想知道全速下載、上傳時,系統的負載量如何~
很驚人的,出現了令人意外的情況。
在PII-300的電腦上,當全速在下載時(每秒1.1~1.2MBytes),使用top來監測,發現雖然系統的Load幾乎都是0.0x,可是CPU的interrupt竟然高達30%,甚至出現過40%,這表示當全速在下載時,FreeBSD的系統中,CPU有1/3甚至到接近1/2的時間都在進行中斷操作,這是否意味著CPU花了大量的時間在切換kernel mode和user mode?
因此,我決定更新電腦,因為在10M/2M的寬頻中,10M的下載速度(1.2MBytes)就會讓CPU這麼忙碌了,如果未來更新到20M、30M、50M甚至100M時,PII-300似乎是無法擔負這樣的工作量了。
現在更新到K7之後,在全速下載時,CPU的interrupt降低到了10%上下,大約是9%~11%之間跳動,情況好了很多~
不過我也想了一下,interrupt的數量可能並沒有減少,但是因為K7-800的時脈比PII-300高了2倍~3倍,有可能因此讓interrupt佔據CPU的時間相對減少了1/3。

此外,在使用了MPD之後,現在使用MPD最新版本4.3版後,也增加了新的功能,那就是PPPoE-Relay。
所謂的PPPoE-Relay,它和DHCP Relay類似,它們都可以將網路protocol的資訊進行轉發,PPPoE Relay可以將PPPoE的訊息轉發出來,而DHCP Relay則可以將另一個網路段的DHCP Server資訊轉發到這個網路段。
PPPoE Relay的功能簡單的說,就是可以讓NAT下面的電腦,也可以進行PPPoE的撥接,這樣一來,只要我想要真實IP,我可以在任何時候,用中華電信的撥接帳號、密碼,直接用PPPoE撥接來取得真實IP,而且這樣的操作,不會影響到目前的工作,像是網路芳鄰...等,都不會因此斷線,MSN則是會瞬斷後重連。

中秋節快樂......

又很長一陣子沒發文了~
這段時間,尤其是暑假期間,做了很多事情,這些事情都想著等全部完成再來寫,結果是都沒寫~ = =||

這次趁著中秋節期間,把幾篇寫出來吧~