阿里云服务器实现 frp 内网穿透
更多精彩內容請訪問我的新博客站點
前言
前幾天在一臺具有公網IP的 vultr 云服務器上實現了 frp 內網穿透(參考鏈接),可以從寢室 ssh 登錄到教研室的服務器,但是由于 vultr 的云服務器位于國外的節點,連接速度太慢了,導致連接 ssh 登錄的體驗很差。今天又弄了一臺阿里云的云服務器 ECS,所以現在來介紹如何在阿里云上實現 frp 內網穿透。
配置 ssh 訪問內網機器
之前使用的 vultr 的VPS是 CentOS 系統的,這次阿里云服務器是 Ubuntu 的操作系統,但其實不同操作系統的云服務器在使用 frp 時操作都是一樣的,就是下載,配置,運行。可能有區別的地方就是防火墻相關的配置,不同云服務廠商的鏡像不同可能也有一些差別。下面來說明在阿里云的公網服務器的 frp 實現步驟:
下載
在阿里云的公網服務器和內網機器上都要下載安裝包并解壓:
$ wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz $ tar -xzvf frp_0.21.0_linux_amd64.tar.gz解壓之后的文件夾中既包含了服務端的文件又包括客戶端的文件,所以可以分別在兩個機器上刪除掉不必要的文件,也可以不刪,都沒有影響。強迫癥還是來刪一下,在解壓后的文件夾中:
-
在公網服務器上刪除客戶端相關的文件,只保留一下兩個文件:
frps frps.ini -
在內網機器上刪除服務端相關的文件,只保留以下兩個文件:
frpc frpc.ini
配置
就是需要修改配置文件 frps.ini 及 frpc.ini。
-
修改公網服務器上的服務端配置文件 frps.ini,如下:
[common] bind_port = 7000 #frp服務端端口(必須) -
修改內網目標主機的客戶端配置文件 frpc.ini,如下:
[common] server_addr = xxx.xxx.xxx.xxx #frp服務端地址,必須是公網ip或者域名,這里假設為xxx.xxx.xxx.xxx server_port = 7000 #frp服務端端口,即填寫服務端配置中的 bind_port[ssh] type = tcp #連接類型,填tcp或udp local_ip = 127.0.0.1 #填127.0.0.1或內網ip都可以 local_port = 22 #需要轉發到的端口,ssh端口是22 remote_port = 6000 #frp服務端的遠程監聽端口,即你訪問服務端的remote_port就相當于訪#問客戶端的 local_port,如果填0則會隨機分配一個端口
運行
-
在公網服務器上運行服務端程序:
$ nohup ./frps -c frps.ini &查看 nohup.out 的信息,success
$ tail -f nohup.out 2018/09/17 21:34:01 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000 2018/09/17 21:34:01 [I] [root.go:207] Start frps success 2018/09/17 22:06:02 [I] [service.go:319] client login info: ip [125.71.229.32:60516] version [0.21.0] hostname [] os [linux] arch [amd64] 2018/09/17 22:06:02 [I] [proxy.go:217] [7940291c148c2fca] [ssh] tcp proxy listen port [6000] 2018/09/17 22:06:02 [I] [control.go:335] [7940291c148c2fca] new proxy [ssh] success -
在內網目標主機上運行客戶端程序:
$ nohup ./frpc -c frpc.ini &查看 nohup.out 的信息,success
$ tail -f nohup.out 2018/09/17 22:42:22 [I] [proxy_manager.go:300] proxy removed: [] 2018/09/17 22:42:22 [I] [proxy_manager.go:310] proxy added: [ssh1] 2018/09/17 22:42:22 [I] [proxy_manager.go:333] visitor removed: [] 2018/09/17 22:42:22 [I] [proxy_manager.go:342] visitor added: [] 2018/09/17 22:42:23 [I] [control.go:246] [0624b332c3465118] login to server success, get run id [0624b332c3465118], server udp port [0] 2018/09/17 22:42:23 [I] [control.go:169] [0624b332c3465118] [ssh1] start proxy success
配置多個內網主機
錯誤的多客戶端配置
使用一臺阿里云的公網服務器,我們可以配置很多內網機器的 frp 內網穿透,公網服務器上只需要按照上述的配置一次即可,但是內網機器的配置稍有不同,如果使用了一樣的配置則后添加的內網機器是無法連接上公網服務器的。這里假設另一臺內網機器2的 frpc.ini 配置如下,來說明會遇到的問題:
$ vi frpc.ini [common] server_addr = xxx.xxx.xxx.xxx <==這里還是按照上面的假設,公網服務器的ip為xxx.xxx.xxx.xxx server_port = 7000[ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6001 <==remote_port設置為另一個值兩個內網主機的配置除了 remote_port 不一樣之外,都是一樣的。但是在內網機器2上運行 frpc 后,公網服務器的 nohup.out 中會記錄一下的錯誤:
[W] [control.go:332] [280d36891a6ae0c7] new proxy [ssh] error: proxy name [ssh] is already in use后來發現,frp 中是通過 [ssh] 這個名字來區分不同客戶端的,所以不同的客戶端要配置成不同的名字。
正確的多客戶端配置
內網機器1和內網機器2的配置應該區分如下:
內網機器1: [ssh] <==不同點 type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 <==不同點內網機器2: [ssh1] <==不同點 type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6001 <==不同點在兩個內網機器上分別運行 frpc 客戶端程序后,一般就可以通過以下的方法 ssh 登錄:
內網機器1: $ ssh -p 6000 user_name1@server_addr內網機器2: $ ssh -p 6001 user_name2@server_addr以上參數中,server_addr是公網服務器的公網ip;user_name1、user_name2 分別是內網機器1、2的用戶名,之后分別使用登錄密碼就可以登錄。
connection timed out 解決
但是有時候會發現按照以上的配置還是使 frp 的服務端與客戶端建立連接,在客戶端上會出現以下錯誤:
2018/09/17 22:02:23 [W] [control.go:113] login to server failed: dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out仔細檢查了一下云服務器上面的防火墻設置,發現并沒有任何過濾規則,那應該不是防火墻的問題
# iptables -vnL Chain INPUT (policy ACCEPT 46165 packets, 28M bytes)pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 42223 packets, 3001K bytes)pkts bytes target prot opt in out source destination然后又仔細想了一下我以前在做關于 OpenStack 的項目中也碰到了類似的問題,就是創建了云實例,發現無法通過 ssh 來登錄,就是因為 OpenStack 有安全組規則相關的設置。
想到了這里就有一種熟悉的感覺,還是原來的配方,hahaha。。。
登錄到阿里云對應云服務器的管理控制臺,如下找到左上方的本實例安全組:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Tun0BAfr-1612859329577)(https://raw.githubusercontent.com/cao0507/My-Pictures-Repository/master/blog/aliyun%20instance%20info.jpg)]
然后點擊右上角的配置規則:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8ZhP1IfJ-1612859329578)(https://raw.githubusercontent.com/cao0507/My-Pictures-Repository/master/blog/aliyun%20group%20rules.jpg)]
再點擊右上角的添加安全組規則:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GKvNLe1q-1612859329579)(https://raw.githubusercontent.com/cao0507/My-Pictures-Repository/master/blog/aliyun%20groups%20rules%20setting.jpg)]
最后在添加安全組規則的界面添加相應的規則:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zkx1nfaH-1612859329581)(https://raw.githubusercontent.com/cao0507/My-Pictures-Repository/master/blog/aliyun%20group%20rules%20adding.jpg)]
主要有兩個配置項,端口范圍和授權對象
- 端口范圍就是你要開放的端口的范圍,需要將 server_port 和 remote_port 都添加進去,可以分成兩條規則分別添加;
- 授權對象是你要授權的對象,一般設為 0.0.0.0/0 表示允許所有IP的訪問。
以上就是針對阿里云的云服務器的安全組設置,其他廠商如果有安全組規則也應該是類似的。
總結
以上是生活随笔為你收集整理的阿里云服务器实现 frp 内网穿透的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自控力如何改变
- 下一篇: Linux ManJaro 换源、安装应