自制迷你路由器過程中的常見問題的一些經驗分享
更新日期:2023-09-23 21:34:18
來源:轉載
手機掃碼繼續觀看
端午假期搞了一塊帶有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,否則調試就麻煩了。
所謂的一個路由器,使用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,否則調試就麻煩了。
該文章是否有幫助到您?
常見問題
- monterey12.1正式版無法檢測更新詳情0次
- zui13更新計劃詳細介紹0次
- 優麒麟u盤安裝詳細教程0次
- 優麒麟和銀河麒麟區別詳細介紹0次
- monterey屏幕鏡像使用教程0次
- monterey關閉sip教程0次
- 優麒麟操作系統詳細評測0次
- monterey支持多設備互動嗎詳情0次
- 優麒麟中文設置教程0次
- monterey和bigsur區別詳細介紹0次
系統下載排行
周
月
其他人正在下載
更多
安卓下載
更多
手機上觀看
掃碼手機上觀看
下一個:
U盤重裝視頻