自制迷你路由器過程中的點滴

科技小能手發表於2017-11-12
端午假期搞了一塊帶有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埠,然後將“發現”的埠動態設定在路由器上…花了一下午之間,終於可行了,後來問題又來了,問題在於何時刪除這些對映…維持一個狀態機太複雜了,於是我就坐到此為止了,反正能用即可。
        為何花了一下午呢?原來犯了一個低階錯誤,我在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



相關文章