自建伺服器解決外網訪問內網(內網穿透【埠對映】)問題的方法總結
自建一個伺服器,如何使外網裝置訪問到內網伺服器,將是個麻煩問題。下面我將介紹一些可以解決這一問題的常用辦法,也就是內網穿透或者說埠對映。
我將這些方法分為三大類,一類適用於沒有公網ip或具有公網ip的伺服器的情形;一類適用於有公網ip的情形;另一類適用於有具有公網ip的伺服器的情形。
第一類
我相信大多數人面臨的是第一種情形,畢竟公網ip較難獲取。
(一)、 nat123的埠對映
nat123對Linux、Windows、Android都適用,在其官網上都有相應的教程:
nat123提供了比較豐富的埠對映功能,有http對映(80埠)、https對映(443埠)、非80埠、非網站(其他埠)、全埠對映、全對映等。提醒大家注意,除全埠對映外,其他服務是不需要在訪問側(外網)加裝p2p訪問者軟體的,可以方便使用【全對映是全埠對映的面p2p訪問者軟體版本】。nat123有免費線路,也有收費服務,具體的收費情況大家自己再行了解。
我簡單說一下全埠對映,以樹莓派的vnc服務為例,首先你需要在nat123官網註冊一個賬號,然後樹莓派上安裝好nat123軟體,並在本地APP上登入賬號。nat123的埠對映管理功能在官網上【而不是在本地進行,或者說它只是沒有告訴我們如何在本地進行管理】,所以你需要在nat123官網上新增埠對映時選擇全埠對映(僅p2p),然後在安卓手機或Windows上安裝p2p訪問者(nat123官網下載),執行埠對映服務與vnc服務,對vnc來說,埠號=5900+桌面號,例如桌面號為1,那麼埠號就是5901,開啟p2p訪問者,新增訪問埠5901,注意p2p訪問者要在後臺執行,不要關掉,然後開啟vnc viewer,輸入域名和埠號5901,即可訪問樹莓派了。
nat123配置較為簡單,容易上手;有開放免費線路且使用體驗較好;Linux/Windows/Android皆可使用,可能適合較多的人。
(二)、 花生殼內網穿透
說到內網穿透,網上很多人都會提到花生殼的內網穿透。很多年前我使用花生殼的時候,這個服務確實還是可以的,免費,而且連線速度OK,現在用的人太多,速度自然降下來了,也開始提供付費服務了。大家瀏覽花生殼官網即可,我點到為止。
(三)、 Holer
Holer是基於SSH的內網穿透服務。在Holer倉庫的readme文件下有使用指南,沒什麼技術難度,我就簡單說說:例如你想遠端SSH登陸你的樹莓派,將conf/holer.conf檔案中原有的Holer Access Key修改為針對SSH服務的Holer Access Key,再啟動Holer即可,服務端就配置完成了。Holer提供的SSH服務的對映埠是holer.org:65534,則在客戶端的連線方式是:
ssh [email protected] -p 65534
可以看到,Holer的配置確實簡單,但是其問題也十分明顯,只有一個Holer Access Key作為唯一標識,大家都是用這個Key,下一個人使用了,上一個人就被踢下來了,所以體驗相當糟糕。想使用Holer的人就要注意了。
Holer也提供了獨立的Access Key,這是需要付費開通的。在我文章評論區打廣告的Holer營銷人員,還想說“配置比較簡單”的,請免開尊口,配置簡單別的就不考慮了嗎?不要影響朋友們選擇!!!
第二類
由於公網ipv4地址資源稀有,目前家庭網路中服務提供商分配的名義上的公網ip實際上都是NAT後的內網ip【ISP的內網】,表現為在閘道器中查到的公網ip與用查ip網站查到的公網ip不一致。此時你可以致電服務提供商諮詢是否可以幫你改為真的公網ip(以“安裝監控”為由)。
如果可以獲得公網ip,單臺伺服器的情況下,你可以直接將網線插到伺服器上;而如果有多臺伺服器都需要使用公網ip的話,下面的方法可以幫到你:
(一)、 路由器的虛擬伺服器(埠對映)功能
這種方法需要一個帶有埠對映功能的路由器。我以中興的天翼閘道器和樹莓派motion網路服務為例。配置時,其中外部埠是外網訪問的埠,例如可選9000,建議不要太小,因為服務提供商可能遮蔽較小的一些埠;內網埠是motion的埠,為8081或8080;協議選TCP;內部IP是樹莓派的區域網ip。例如你的公網ip為59.60.84.xxx,這些設定完以後就可以在瀏覽器中輸入59.60.84.xxx:9000,即可看到實時畫面。
如果沒有具有埠對映功能的路由器,那麼將網線插入一臺電腦做閘道器也是可行的,但你還需要解決的是各伺服器之間網路連線的問題,如何使其他伺服器連上這臺電腦,是通過網線橋接還是無線連線(可能不大穩定)需要自行衡量。我各推薦一款Windows和Linux上的埠對映工具:
(二)、 Windows上專用的埠對映工具PortTunnel
PortTunnel是一個實現埠對映的專用工具。它是一個直接執行的軟體。如果作業系統為Windows NT/Windows 2000/Windows XP,第一次執行時選擇Start,PortTunnel會自動以服務方式執行。點選[Add]按鈕新增條目,點選[Edit]按鈕編輯現有條目,點選[Delete]按鈕刪除條目。
在這個“新建/編輯埠對映”對話方塊中,我們要給該條目命名,然後設定輸入埠(Port In)、繫結地址(Bind address)、輸出埠(Port Out)和輸出地址(Address Out)。其中,“繫結地址”是指監聽該主機的哪一個IP(內部IP還是外部IP)。設為“Any(0.0.0.0)”則監聽該主機的全部IP。
PortTunnel專門針對HTTP、FTP、SMTP服務的埠對映,提供了較多的引數設定,在相應的標籤選單下調整。此外,PortTunnel還提供了安全性設定和日誌、統計等功能。
(三)、 Linux埠對映工具:RINETD
RINETD可以算得上Linux上最為簡單好用的埠對映工具了,安裝配置均很簡單。在此我也就不展開說了,附一篇教程:《rinetd 一個linux下的埠轉發工具》,若有需要,學著這個教程做一下就行。
第三類
如果你有一個有公網ip的伺服器,那做起內網穿透會有很大的自由度。
(一)、 ssh內網穿透
我將ssh內網穿透放在第一位,因為它只經過自己的伺服器,按照自己設定的命令進行操作,所以比較安全、穩定。
理論部分
ssh的三個強大的埠轉發命令:
轉發到遠端:ssh -C -f -N -g -L 本地埠:目標IP:目標埠 使用者名稱@目標IP
轉發到本地:ssh -C -f -N -g –R 本地埠:目標IP:目標埠 使用者名稱@目標IP
動態埠轉發:ssh -C -f -N -g -D listen_port 使用者名稱@目標IP
-C:壓縮資料傳輸。
-f :後臺認證使用者/密碼,通常和-N連用,不用登入到遠端主機。
-N :不執行指令碼或命令,通常與-f連用。
-g :在-L/-R/-D引數中,允許遠端主機連線到建立的轉發的埠,如果不加這個引數,只允許本地主機建立連線。
-L 本地埠:目標IP:目標埠:將本地機(客戶機)的某個埠轉發到遠端指定機器的指定埠. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 埠, 一旦這個埠上有了連線, 該連線就經過安全通道轉發出去, 同時遠端主機和 host 的 hostport 埠建立連線. 可以在配置檔案中指定埠的轉發. 只有 root 才能轉發特權埠. IPv6 地址用另一種格式說明: port/host/hostport
-R 本地埠:目標IP:目標埠:將遠端主機(伺服器)的某個埠轉發到本地端指定機器的指定埠. 工作原理是這樣的, 遠端主機上分配了一個 socket 偵聽 port 埠, 一旦這個埠上有了連線, 該連線就經過安全通道轉向出去, 同時本地主機和 host 的 hostport 埠建立連線. 可以在配置檔案中指定埠的轉發. 只有用 root 登入遠端主機才能轉發特權埠. IPv6 地址用另一種格式說明: port/host/hostport
-p :被登入的ssd伺服器的sshd服務埠。
-D listen_port:指定一個本地機器 “動態的'’ 應用程式埠轉發. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 埠, 一旦這個埠上有了連線, 該連線就經過安全通道轉發出去, 根據應用程式的協議可以判斷出遠端主機將和哪裡連線. 目前支援 SOCKS4 協議, 將充當 SOCKS4 伺服器. 只有 root 才能轉發特權埠. 可以在配置檔案中指定動態埠的轉發.
實踐部分
(1)只有樹莓派和伺服器
步驟①在樹莓派上,通過遠端埠對映,將伺服器的2222埠對映到樹莓派的22埠:
ssh -fNR 2222:localhost:22 [email protected]公網IP
步驟②伺服器上訪問樹莓派:
ssh -p 2222 [email protected]
但事實上,有時候我們可能更需要另一個裝置可以訪問樹莓派,而不是在伺服器上訪問。因此這個時候我們就需要做兩次對映。
(2)樹莓派、伺服器、第三方裝置
步驟①在樹莓派上,通過遠端埠對映,將伺服器的2222埠對映到樹莓派的22埠:
ssh -fNR 2222:localhost:22 [email protected]公網IP
步驟②在第三方裝置上,通過本地埠對映,將第三方裝置的2222埠對映到伺服器的2222埠:
ssh -fNL 2222:localhost:2222 [email protected]公網IP
步驟③在第三方裝置上訪問樹莓派:
ssh -p 2222 [email protected]
除了ssh內網穿透外,我們還可以藉助許多的反向代理工具來實現內網穿透,常見的有frp、ngrok、n2n等。
(二)、 frp內網穿透
根據伺服器/客戶端所屬架構與系統,在releases中分別下載合適的版本,並解壓出來。
frps.ini是伺服器端的配置檔案,配置如下:
[common]
bind_port = 6666
記住bind_port是frp服務的監聽埠。
啟動服務端frps:
./frps -c ./frps.ini
而在客戶端,我們要修改的配置檔案是frpc.ini(以ssh服務為例):
[common]
server_addr = x.x.x.x
server_port = 6666
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2222
server_addr是伺服器的公網ip,server_port是伺服器上設定的frp服務的監聽埠。
[ssh]部分的local_port是ssh服務的本地埠,預設是22,而remote埠並不是6666,而是由自己另外指定的伺服器上ssh轉發的目標埠,這裡我選擇2222。
啟動客戶端frpc:
./frpc -c ./frpc.ini
正確連線後,訪問本地伺服器則可以使用以下命令:
ssh [email protected]公網ip -p 2222
(三)、 ngrok內網穿透
(四)、 n2n內網穿透: