自制迷你路由器過程中的常見問題的一些經驗分享
2024-09-12 21:55:01
供稿:網友
端午假期搞了一塊帶有Wifi模塊的開發板,本來這是用于研發Android終端的,我本無意于此,因此就拿來做迷你路由器了,當然,我事先知道它肯定可以很方便的灌入Linux內核以及應用程序,否則光這一步就夠我喝一壺的了。
所謂的一個路由器,使用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端口,然后將“發現”的端口動態設置在路由器上...花了一下午之間,終于可行了,后來問題又來了,問題在于何時刪除這些映射...維持一個狀態機太復雜了,于是我就坐到此為止了,反正能用即可。