端口轉(zhuǎn)發(fā)有兩種方式:
1. 內(nèi)核層次的轉(zhuǎn)發(fā)
2. 應(yīng)用層的轉(zhuǎn)發(fā)
### 內(nèi)核層轉(zhuǎn)發(fā)
內(nèi)核層轉(zhuǎn)發(fā)采用netfilter模塊,如iptables和firewalld。內(nèi)核主要工作在Network Layer和Link Layer層次上,且?guī)旌瘮?shù)不支持RSA加密(防止性能損耗),因此,無(wú)法實(shí)現(xiàn)TLS等加密方法。
在需求對(duì)接中,用戶(hù)提出將內(nèi)核層流量轉(zhuǎn)發(fā)到一個(gè)指定端口,然后通過(guò)這個(gè)端口動(dòng)態(tài)的解析流量包,并實(shí)時(shí)控制端口的開(kāi)放,這個(gè)面對(duì)以下幾個(gè)問(wèn)題:
1. 端口信息保存問(wèn)題:在內(nèi)核層如果修改了端口號(hào),原有端口號(hào)信息的保存問(wèn)題
2. 動(dòng)態(tài)開(kāi)放端口問(wèn)題:由于網(wǎng)絡(luò)環(huán)境的不穩(wěn)定,何時(shí)決定這個(gè)端口關(guān)閉
3. 效率問(wèn)題: 至少經(jīng)過(guò)內(nèi)核修改數(shù)據(jù)--轉(zhuǎn)發(fā)--開(kāi)啟端口--處理丟包--轉(zhuǎn)發(fā)等階段
### 應(yīng)用層轉(zhuǎn)發(fā)
在應(yīng)用層轉(zhuǎn)發(fā)中,常見(jiàn)的開(kāi)源工具不計(jì)其數(shù),比較好的用proxychains4、proxy-connect等等。但是他們沒(méi)有解決:
1. 上萬(wàn)個(gè)端口轉(zhuǎn)發(fā)監(jiān)聽(tīng)導(dǎo)致的性能異常(端口范圍過(guò)大)
2. 配置相對(duì)復(fù)雜
我們?cè)诨趐roxychains4和proxy-connect上,重新調(diào)整了源代碼,我們?cè)谶@里用了約兩百多行代碼實(shí)現(xiàn)了一個(gè)進(jìn)程(單個(gè)線程)控制數(shù)萬(wàn)個(gè)監(jiān)聽(tīng)端口,如果該端口沒(méi)有流量進(jìn)入,這個(gè)端口對(duì)性能沒(méi)有任何損耗(在linux中就相當(dāng)于一個(gè)空文件)。
### 端口的批量轉(zhuǎn)發(fā)
為了方便用戶(hù)使用,我們特意增加了配置文件,確定轉(zhuǎn)發(fā)的超時(shí)時(shí)間等。