自制迷你路由器過程中的點滴
所謂的一個路由器,使用Linux來做實在太方便了,對照著家裡的TP-LINK,無非就是實現以下的模組,甚至都不用寫一行C程式碼:
1.實現路由新增,修改,刪除操作介面
介面可以使用PHP來做,當然也可以使用字元介面,不過這樣做看起來沒有PHP做出來的專業。底層建議使用iproute2工具集而不是route命令,因為iproute2可以很方便的配置複雜的路由策略,比如策略路由,force-onlink路由等。
2.防火牆模組
底層使用iptables命令設定filter表,然後用PHP做一個前端介面。
3.地址轉換模組
底層使用iptables命令設定nat表,然後用PHP做一個前端介面。這一個模組完全是仿效一般的家用路由器來的,這種路由器一般用於一個家庭多臺機器的上網,因此有必要將內網地址MASQUERADE到唯一的公網地址。當然如果你本身就有很多公網IP且無意隱藏你的內部網路,那真的就不需要這個了。
4.流控模組
底層使用iptables命令以及tc命令,基於IP地址,五元組,MAC資訊等進行流控,用PHP做一個前端配置介面。
5.NAT穿越模組
這個模組不得不多說一些,畢竟對於我等喜歡用BT,電驢的那是沒有它不行的啊。說實話,我還真想將基於hack技術的NAT穿越技術用到自制的路由器上,後來發現這太難了,還不能保證每次都能成功,其實一直以來我就對這種點子不是很感冒,因此就想其他的辦法。穿越NAT其實是可以用另一種技術來替代的,那就是設定一個DNAT,畢竟路由器都是我自己的,我想怎麼搞就怎麼搞,設定一個DNAT是容易的,但是問題是我到底需要將內網的哪些地址和埠開放呢?如果全部開放,那還不如當初不設定SNAT呢,然而不設定SNAT又涉及到共享公網IP的問題…
於是,想了好久終於想出一個看起來還不錯的主義,那就是讓內網主機主動通報自己的IP和需要對映的埠,路由器上始終執行一個接收程式即可,接收到某一主機的通報後,就將以下規則設定到路由器上:
iptables -t nat -A PREROUTING -i 外網口 -d 唯一的公網地址 -p 需要對映的協議 –dport 需要對映的埠 -j DNAT –to-destination 通報上來的內網地址
於是,這就需要在每一個主機上放置一個用於通報的程式。想了一下,這樣還是很麻煩,還不如將工作留給路由器呢,也就是說由路由器主動詢問內部網,看誰有需要對映的埠,這樣也不行,因為這樣需要內網主機的回答,還需要程式設計。於是索性使用nmap每隔一段時間掃一下內網的熟知的P2P埠,然後將“發現”的埠動態設定在路由器上…花了一下午之間,終於可行了,後來問題又來了,問題在於何時刪除這些對映…維持一個狀態機太複雜了,於是我就坐到此為止了,反正能用即可。
為何花了一下午呢?原來犯了一個低階錯誤,我在VMWare裡面試驗nmap掃描,發現得到的結果OS都是MacOS,問題恰恰就在這,因為我用於試驗的機器執行的還真都是MacOS…最終發現所有的結果OS都是我的那個VMWare的宿主機,因為我的VMWare中的Linux的網路卡模式是NAT,而VMWare的NAT是由宿主機在使用者態完成的,它實則就是一個代理,因此nmap的結果表現不出目標機的真實資訊。
後來仔細研究了一下家裡的TP-LINK路由器,發現了一個叫做uPnP的協議,噢,原來這個協議就是實現我那個功能的啊,太孤陋寡聞了…還好意思說自己網路技術很厲害,慚愧啊。於是直接搞uPnP,頓時完美了。
6.IP/MAC繫結模組
同樣用iptables,沒別的比這更方便。
7.IPSec穿越模組
我基本不使用IPSec,因此忽略。
8.日誌模組
很重要,雖然我一直都不知道為何日誌很重要…
9.SSH開放
最後,我沒有忘記給自己開放一個SSH,否則除錯就麻煩了。
添煤,開火,真的發現真不如燒鍋爐的,人家燒鍋爐的都需要高壓作業證,我卻什麼證都沒有…
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1268950
相關文章
- asm點滴ASM
- oracle點滴Oracle
- sql點滴42—mysql中的資料結構MySql資料結構
- sql點滴42—mysql中的時間轉換MySql
- mailx使用點滴AI
- 網站製作過程中把握的幾點網站
- 軟體測試過程中的痛點思考
- 不可錯過的javascript迷你庫JavaScript
- 工作點滴積累
- lzma 知識點滴
- 前端點滴記錄前端
- 專題:點滴JavascriptJavaScript
- hp-ux點滴UX
- clang -rewrite-objc的使用點滴OBJ
- 盤點機器學習過程中的彎路,帶你避坑!機器學習
- 生活點滴小筆記筆記
- Django之學習點滴Django
- Mac | 技巧點滴記錄Mac
- 技術點滴記錄
- 無線路由器撥號過程中可能會遇到的問題以及解決方法路由器
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程
- Springboot 開發過程中遇到坑點 (一)Spring Boot
- Laravel 初學者學習點滴Laravel
- 前端技術點滴整理-1前端
- 架構之路(七)MVC點滴架構MVC
- 物化檢視知識點滴
- Dev-C++使用點滴 (轉)devC++
- 研發專案管理點滴專案管理
- [期望] 想象中的技術迷你書
- Sqlserver中的儲存過程SQLServer儲存過程
- 在 Python 除錯過程中設定不中斷的斷點Python除錯斷點
- 微信小程式測試過程中的各個要點(乾貨)微信小程式
- 直播系統開發過程中的一些關鍵點
- 某資產管理系統打點過程中的免殺經歷
- Ubuntu的點滴-Vim、VM Tools、Samba、換源UbuntuSamba
- 路由器配置基礎--設定對話過程 (轉)路由器
- 學習過程中,專案檔案、程式碼疑惑點
- Android中父View和子view的點選事件的執行過程AndroidView事件