什么是打洞
在NAT1
網(wǎng)絡(luò)下,我們可以通過(guò)一種 “打洞” 的方式,將本地的 TCP 端口暴露至公網(wǎng)上,運(yùn)行 HTTP 服務(wù)等。通過(guò)Natter 打洞+防火墻的轉(zhuǎn)發(fā)規(guī)則。我們可以方便地將內(nèi)網(wǎng)設(shè)備暴露在公網(wǎng)。
實(shí)驗(yàn)環(huán)境
- Centos7 (內(nèi)網(wǎng)主機(jī))
檢驗(yàn)網(wǎng)絡(luò)
首次使用,檢查當(dāng)前網(wǎng)絡(luò) NAT 情況。我們首先克隆項(xiàng)目到本地環(huán)境。
git clone https://github.com/MikeWang000000/Natter.git
cd Natter
# 檢驗(yàn)網(wǎng)絡(luò)
python natter.py --check-nat

如上圖,沒(méi)有任何報(bào)錯(cuò)的話。證明可以愉快地玩耍了。
大概率會(huì)失敗的原因: 你的家庭網(wǎng)絡(luò)是NAT,不是NAT1.(目前大多數(shù)運(yùn)營(yíng)商網(wǎng)絡(luò)都是NAT1)
牛刀小試
實(shí)驗(yàn)?zāi)康模?/strong>
通過(guò)外網(wǎng),訪問(wèn)我本地服務(wù)器(192.168.123.173:5244
)alist云盤(pán)。首先我們利用Natter
腳本打洞
python3 natter.py -t 5244
-t
即tcp協(xié)議。

上一步完成后,我們還無(wú)法訪問(wèn)。因?yàn)闆](méi)有指定內(nèi)網(wǎng)設(shè)備的IP和端口。因此我們需要在路由器中進(jìn)行端口轉(zhuǎn)發(fā)。
端口轉(zhuǎn)發(fā)
登錄路由器,在端口轉(zhuǎn)發(fā)中設(shè)置參數(shù)如下:

如上,當(dāng)我們?cè)L問(wèn)http://118.xxxx.xxxx.183:65317/便可以訪問(wèn)我們本地的5244端口。

多臺(tái)設(shè)備打洞
在上述方法中,我們僅僅打通了5244
端口。如果有多個(gè)端口和多臺(tái)設(shè)備怎么辦呢?或者路由器沒(méi)有端口轉(zhuǎn)發(fā)功能怎么辦?我們需要新建一個(gè)json文件。內(nèi)容如下
// 注意:JSON 配置文件不支持代碼注釋?zhuān)颂帪檎f(shuō)明配置用途。
{
"logging": {
"level": "info", // 日志等級(jí):可選值:"debug"、"info"、"warning"、"error"
"log_file": "./natter.log" // 將日志輸出到指定文件,不需要請(qǐng)留空:""
},
"status_report": {
// 當(dāng)外部IP/端口發(fā)生改變時(shí),會(huì)執(zhí)行下方命令。
// 大括號(hào) {...} 為占位符,命令執(zhí)行時(shí)會(huì)被實(shí)際值替換。
// 不需要請(qǐng)留空:""
"hook": "bash ./natter-hook.sh '{protocol}' '{inner_ip}' '{inner_port}' '{outer_ip}' '{outer_port}'",
"status_file": "./natter-status.json" // 將實(shí)時(shí)端口映射狀態(tài)儲(chǔ)存至指定文件,不需要請(qǐng)留空:""
},
"open_port": {
// 此處設(shè)置 Natter 打洞IP:端口。(僅打洞)
// 此處地址為 Natter 綁定(監(jiān)聽(tīng))的地址,Natter 僅對(duì)這些地址打洞,您需要手動(dòng)設(shè)置端口轉(zhuǎn)發(fā)。
// 注意:使用默認(rèn)出口IP,請(qǐng)使用 0.0.0.0 ,而不是 127.0.0.1 。
"tcp": [
"0.0.0.0:3456",
"0.0.0.0:3457"
],
"udp": [
"0.0.0.0:3456",
"0.0.0.0:3457"
]
},
"forward_port": {
// 此處設(shè)置需要 Natter 開(kāi)放至公網(wǎng)的 IP:端口。(打洞 + 內(nèi)置轉(zhuǎn)發(fā))
// Natter 會(huì)全自動(dòng)打洞、轉(zhuǎn)發(fā),您無(wú)需做任何干預(yù)。
// 注意:使用本機(jī)IP,請(qǐng)使用 127.0.0.1,而不是 0.0.0.0 。
"tcp": [
"127.0.0.1:80",
"192.168.1.100:443"
],
"udp": [
"127.0.0.1:53",
"192.168.1.100:51820"
]
},
"stun_server": {
// 此處設(shè)置公共 STUN 服務(wù)器。
// TCP 服務(wù)器請(qǐng)確保 TCP/3478 端口開(kāi)放可用;
// UDP 服務(wù)器請(qǐng)確保 UDP/3478 端口開(kāi)放可用。
"tcp": [
"stun.stunprotocol.org",
"stun.voip.blackberry.com"
],
"udp": [
"stun.miwifi.com",
"stun.qq.com"
]
},
"keep_alive": "www.qq.com" // 此處設(shè)置 HTTP Keep-Alive 服務(wù)器。請(qǐng)確保該服務(wù)器 80 端口開(kāi)放,且支持 HTTP Keep-Alive。
}

運(yùn)行
python3 natter.py -c ./config.json
總結(jié)
利用此工具,我們可以很便捷地實(shí)現(xiàn)外網(wǎng)訪問(wèn)內(nèi)網(wǎng)設(shè)備。但是當(dāng)運(yùn)營(yíng)商IP發(fā)生變化時(shí),還不能自動(dòng)更新IP。因此可以參照前期的文章配合域名自動(dòng)更新。此外,沒(méi)有必要盡量不要將內(nèi)網(wǎng)設(shè)備暴露在公網(wǎng)!
該文章在 2024/6/8 18:49:08 編輯過(guò)