自制迷你路由器過程中的常見問題的一些經(jīng)驗分享
更新日期:2023-09-23 21:34:18
來源:轉(zhuǎn)載
手機掃碼繼續(xù)觀看
端午假期搞了一塊帶有Wifi模塊的開發(fā)板,本來這是用于研發(fā)Android終端的,我本無意于此,因此就拿來做迷你路由器了,當然,我事先知道它肯定可以很方便的灌入Linux內(nèi)核以及應(yīng)用程序,否則光這一步就夠我喝一壺的了。
所謂的一個路由器,使用Linux來做實在太方便了,對照著家里的TP-LINK,無非就是實現(xiàn)以下的模塊,甚至都不用寫一行C代碼:
1.實現(xiàn)路由添加,修改,刪除操作界面
界面可以使用PHP來做,當然也可以使用字符界面,不過這樣做看起來沒有PHP做出來的專業(yè)。底層建議使用iproute2工具集而不是route命令,因為iproute2可以很方便的配置復(fù)雜的路由策略,比如策略路由,force-onlink路由等。
2.防火墻模塊
底層使用iptables命令設(shè)置filter表,然后用PHP做一個前端接口。
3.地址轉(zhuǎn)換模塊
底層使用iptables命令設(shè)置nat表,然后用PHP做一個前端接口。這一個模塊完全是仿效一般的家用路由器來的,這種路由器一般用于一個家庭多臺機器的上網(wǎng),因此有必要將內(nèi)網(wǎng)地址MASQUERADE到唯一的公網(wǎng)地址。當然如果你本身就有很多公網(wǎng)IP且無意隱藏你的內(nèi)部網(wǎng)絡(luò),那真的就不需要這個了。
4.流控模塊
底層使用iptables命令以及tc命令,基于IP地址,五元組,MAC信息等進行流控,用PHP做一個前端配置接口。
5.NAT穿越模塊
這個模塊不得不多說一些,畢竟對于我等喜歡用BT,電驢的那是沒有它不行的啊。說實話,我還真想將基于hack技術(shù)的NAT穿越技術(shù)用到自制的路由器上,后來發(fā)現(xiàn)這太難了,還不能保證每次都能成功,其實一直以來我就對這種點子不是很感冒,因此就想其他的辦法。穿越NAT其實是可以用另一種技術(shù)來替代的,那就是設(shè)置一個DNAT,畢竟路由器都是我自己的,我想怎么搞就怎么搞,設(shè)置一個DNAT是容易的,但是問題是我到底需要將內(nèi)網(wǎng)的哪些地址和端口開放呢?如果全部開放,那還不如當初不設(shè)置SNAT呢,然而不設(shè)置SNAT又涉及到共享公網(wǎng)IP的問題...
于是,想了好久終于想出一個看起來還不錯的主義,那就是讓內(nèi)網(wǎng)主機主動通報自己的IP和需要映射的端口,路由器上始終運行一個接收進程即可,接收到某一主機的通報后,就將以下規(guī)則設(shè)置到路由器上:
iptables -t nat -A PREROUTING -i 外網(wǎng)口 -d 唯一的公網(wǎng)地址 -p 需要映射的協(xié)議 --dport 需要映射的端口 -j DNAT --to-destination 通報上來的內(nèi)網(wǎng)地址
于是,這就需要在每一個主機上放置一個用于通報的程序。想了一下,這樣還是很麻煩,還不如將工作留給路由器呢,也就是說由路由器主動詢問內(nèi)部網(wǎng),看誰有需要映射的端口,這樣也不行,因為這樣需要內(nèi)網(wǎng)主機的回答,還需要編程。于是索性使用nmap每隔一段時間掃一下內(nèi)網(wǎng)的熟知的P2P端口,然后將“發(fā)現(xiàn)”的端口動態(tài)設(shè)置在路由器上...花了一下午之間,終于可行了,后來問題又來了,問題在于何時刪除這些映射...維持一個狀態(tài)機太復(fù)雜了,于是我就坐到此為止了,反正能用即可。
為何花了一下午呢?原來犯了一個低級錯誤,我在VMWare里面試驗nmap掃描,發(fā)現(xiàn)得到的結(jié)果OS都是MacOS,問題恰恰就在這,因為我用于試驗的機器運行的還真都是MacOS...最終發(fā)現(xiàn)所有的結(jié)果OS都是我的那個VMWare的宿主機,因為我的VMWare中的Linux的網(wǎng)卡模式是NAT,而VMWare的NAT是由宿主機在用戶態(tài)完成的,它實則就是一個代理,因此nmap的結(jié)果表現(xiàn)不出目標機的真實信息。
后來仔細研究了一下家里的TP-LINK路由器,發(fā)現(xiàn)了一個叫做uPnP的協(xié)議,噢,原來這個協(xié)議就是實現(xiàn)我那個功能的啊,太孤陋寡聞了...還好意思說自己網(wǎng)絡(luò)技術(shù)很厲害,慚愧啊。于是直接搞uPnP,頓時完美了。
6.IP/MAC綁定模塊
同樣用iptables,沒別的比這更方便。
7.IPSec穿越模塊
我基本不使用IPSec,因此忽略。
8.日志模塊
很重要,雖然我一直都不知道為何日志很重要...
9.SSH開放
最后,我沒有忘記給自己開放一個SSH,否則調(diào)試就麻煩了。
所謂的一個路由器,使用Linux來做實在太方便了,對照著家里的TP-LINK,無非就是實現(xiàn)以下的模塊,甚至都不用寫一行C代碼:
1.實現(xiàn)路由添加,修改,刪除操作界面
界面可以使用PHP來做,當然也可以使用字符界面,不過這樣做看起來沒有PHP做出來的專業(yè)。底層建議使用iproute2工具集而不是route命令,因為iproute2可以很方便的配置復(fù)雜的路由策略,比如策略路由,force-onlink路由等。
2.防火墻模塊
底層使用iptables命令設(shè)置filter表,然后用PHP做一個前端接口。
3.地址轉(zhuǎn)換模塊
底層使用iptables命令設(shè)置nat表,然后用PHP做一個前端接口。這一個模塊完全是仿效一般的家用路由器來的,這種路由器一般用于一個家庭多臺機器的上網(wǎng),因此有必要將內(nèi)網(wǎng)地址MASQUERADE到唯一的公網(wǎng)地址。當然如果你本身就有很多公網(wǎng)IP且無意隱藏你的內(nèi)部網(wǎng)絡(luò),那真的就不需要這個了。
4.流控模塊
底層使用iptables命令以及tc命令,基于IP地址,五元組,MAC信息等進行流控,用PHP做一個前端配置接口。
5.NAT穿越模塊
這個模塊不得不多說一些,畢竟對于我等喜歡用BT,電驢的那是沒有它不行的啊。說實話,我還真想將基于hack技術(shù)的NAT穿越技術(shù)用到自制的路由器上,后來發(fā)現(xiàn)這太難了,還不能保證每次都能成功,其實一直以來我就對這種點子不是很感冒,因此就想其他的辦法。穿越NAT其實是可以用另一種技術(shù)來替代的,那就是設(shè)置一個DNAT,畢竟路由器都是我自己的,我想怎么搞就怎么搞,設(shè)置一個DNAT是容易的,但是問題是我到底需要將內(nèi)網(wǎng)的哪些地址和端口開放呢?如果全部開放,那還不如當初不設(shè)置SNAT呢,然而不設(shè)置SNAT又涉及到共享公網(wǎng)IP的問題...
于是,想了好久終于想出一個看起來還不錯的主義,那就是讓內(nèi)網(wǎng)主機主動通報自己的IP和需要映射的端口,路由器上始終運行一個接收進程即可,接收到某一主機的通報后,就將以下規(guī)則設(shè)置到路由器上:
iptables -t nat -A PREROUTING -i 外網(wǎng)口 -d 唯一的公網(wǎng)地址 -p 需要映射的協(xié)議 --dport 需要映射的端口 -j DNAT --to-destination 通報上來的內(nèi)網(wǎng)地址
于是,這就需要在每一個主機上放置一個用于通報的程序。想了一下,這樣還是很麻煩,還不如將工作留給路由器呢,也就是說由路由器主動詢問內(nèi)部網(wǎng),看誰有需要映射的端口,這樣也不行,因為這樣需要內(nèi)網(wǎng)主機的回答,還需要編程。于是索性使用nmap每隔一段時間掃一下內(nèi)網(wǎng)的熟知的P2P端口,然后將“發(fā)現(xiàn)”的端口動態(tài)設(shè)置在路由器上...花了一下午之間,終于可行了,后來問題又來了,問題在于何時刪除這些映射...維持一個狀態(tài)機太復(fù)雜了,于是我就坐到此為止了,反正能用即可。
為何花了一下午呢?原來犯了一個低級錯誤,我在VMWare里面試驗nmap掃描,發(fā)現(xiàn)得到的結(jié)果OS都是MacOS,問題恰恰就在這,因為我用于試驗的機器運行的還真都是MacOS...最終發(fā)現(xiàn)所有的結(jié)果OS都是我的那個VMWare的宿主機,因為我的VMWare中的Linux的網(wǎng)卡模式是NAT,而VMWare的NAT是由宿主機在用戶態(tài)完成的,它實則就是一個代理,因此nmap的結(jié)果表現(xiàn)不出目標機的真實信息。
后來仔細研究了一下家里的TP-LINK路由器,發(fā)現(xiàn)了一個叫做uPnP的協(xié)議,噢,原來這個協(xié)議就是實現(xiàn)我那個功能的啊,太孤陋寡聞了...還好意思說自己網(wǎng)絡(luò)技術(shù)很厲害,慚愧啊。于是直接搞uPnP,頓時完美了。
6.IP/MAC綁定模塊
同樣用iptables,沒別的比這更方便。
7.IPSec穿越模塊
我基本不使用IPSec,因此忽略。
8.日志模塊
很重要,雖然我一直都不知道為何日志很重要...
9.SSH開放
最后,我沒有忘記給自己開放一個SSH,否則調(diào)試就麻煩了。
該文章是否有幫助到您?
常見問題
- monterey12.1正式版無法檢測更新詳情0次
- zui13更新計劃詳細介紹0次
- 優(yōu)麒麟u盤安裝詳細教程0次
- 優(yōu)麒麟和銀河麒麟?yún)^(qū)別詳細介紹0次
- monterey屏幕鏡像使用教程0次
- monterey關(guān)閉sip教程0次
- 優(yōu)麒麟操作系統(tǒng)詳細評測0次
- monterey支持多設(shè)備互動嗎詳情0次
- 優(yōu)麒麟中文設(shè)置教程0次
- monterey和bigsur區(qū)別詳細介紹0次
系統(tǒng)下載排行
周
月
其他人正在下載
更多
安卓下載
更多
手機上觀看
掃碼手機上觀看
下一個:
U盤重裝視頻