Linux服務器下Frp實現內網穿透(阿里雲Ubuntu)
有時候我們需要讓內網的服務器允許訪問,但是自己內網家庭常用帶寬,我發直接訪問IP,所以我們只能進行內網穿透,使用花生殼等軟件是付費的,所以我們選擇了frp作為內網穿透工具,配置如下,你需要的東西有:
- 公網服務器,具有外網IP(如阿里雲,騰訊雲等服務器)
- 內網服務器,能聯網即可。
一、下載Frp項目
分別下載frp到公網服務器和內網服務器:
wget https://github.com/fatedier/frp/releases/download/v0.25.0/frp_0.25.0_linux_amd64.tar.gz
然后解壓並進入服務器,
tar zxvf ./frp_0.25.0_linux_amd64.tar.gz
cd frp_0.25.0_linux_amd64/
# 目錄內容如下
# LICENSE frpc frpc.ini frpc_full.ini frps frps.ini frps_full.ini
二、配置公網服務器
進入公網IP服務器中修改目錄中的frps.ini配置文件, 將bind_port改為隨意可用端口
[common]
bind_port = 7000
三、修改內網服務器
在內網IP服務器中修改frpc.ini配置文件:
[common]
server_addr = 123.123.123.123
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
其中解釋如下:
- common表示基本配置
- server_addr:公網服務器地址
- server_port:公網bind_port配置的端口
- ssh表示使用ssh登錄內網服務器
- type:tcp即可
- local_ip:本地iP,127.0.0.1即可
- local_port: ssh端口
- remote_port:ssh鏈接端口
四、分別啟動內網公網服務器FRP
1、在公網服務器中啟動frps服務端:
為了方便調試,我們先啟動桌面版:
cd frp_0.25.0_linux_amd64/
./frps -c ./frps.ini
nohup ./frps -c ./frps.ini &
# 鏈接成功會出現如下內容
# 2019/03/19 16:41:16 [I] [service.go:88] frps tcp listen on 0.0.0.0:7000
# 2019/03/19 16:41:16 [I] [main.go:112] Start frps success
# 2019/03/19 16:41:16 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues
生產使用中可使用如下命令在后台運行:
nohup ./frps -c ./frps.ini > /dev/null 2>&1 &
2、在內網服務器中啟動frpc客戶端:
公網服務器啟動成功后,在內網服務器中啟動frpc,為了方便調試,我們一樣啟動桌面版:
cd frp_0.25.0_linux_amd64/
./frpc -c ./frpc.ini
nohup ./frpc -c ./frpc.ini &
# 鏈接成功會出現如下內容
# 2019/03/19 17:43:44 [I] [control.go:276] [f094394cf61f02fe] login to server success, get run id [f094394cf61f02fe]
# 2019/03/19 17:43:44 [I] [control.go:411] [f094394cf61f02fe] [ssh] start proxy success
生產使用中可使用如下命令在后台運行:
nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 &
五、ssh登錄服務器
如果配置成功,在進入本地服務器就相對容易了,與以前的ssh一樣:
ssh root@公網IP -p 6000
也可以使用
ssh -oPort=6000 test@公網IP
六、常見問題與解決方案
1、內網服務器無法連接frpc客戶端:
此問題一般情況是公網IP沒有開放bind_port設置的7000端口,此時可以檢查防火牆是否允許以及查看服務器安全規則,如阿里雲需要設置安全組規則允許訪問。
2、ssh無法使用內網賬號密碼登錄,只能使用公網密碼登錄
ssh無法使用內網賬號密碼登錄,只能使用公網密碼登錄;一登錄直接跳轉到外網服務器,沒有實現穿透效果,此時需要設置內網服務器的frpc.ini文件,修改local_ip = 127.0.0.1。
3、ssh無法登錄到frp服務器,提示超時
此問題的原因是公網未開放ssh配置的端口,開放一下即可,如我的是阿里雲,ssh端口為6000,我去阿里雲安全組規則允許訪問6000端口才搞定。
4、tcp撥號提示超時
2020/09/22 10:55:42 [W] [service.go:82] login to server failed: dial tcp xx.xx.xx.xx:7000: connect: connection timed out
dial tcp xx.xx.xx.xx:7000: connect: connection timed out # 檢查阿里雲的安全組規則與寶塔的開放端口
更多信息:
安全地暴露內網服務
對於某些服務來說如果直接暴露於公網上將會存在安全隱患。
使用 stcp(secret tcp) 類型的代理可以避免讓任何人都能訪問到要穿透的服務,但是訪問者也需要運行另外一個 frpc。
以下示例將會創建一個只有自己能訪問到的 ssh 服務代理。
frps 的部署步驟同上。
- 啟動 frpc,轉發內網的 ssh 服務,配置如下,不需要指定遠程端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
- 在要訪問這個服務的機器上啟動另外一個 frpc,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 綁定本地端口用於訪問 ssh 服務
bind_addr = 127.0.0.1
bind_port = 6000
- 通過 ssh 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@127.0.0.1
如果出現問題:
[secret_ssh_visitor] start error: listen tcp 127.0.0.1:6000: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
將本地地址改為127.0.0.2或者其他地址
設置bat文件,這樣就不需要每次都定位到指定目錄:
cd C:\Users\JChan\Desktop\frp_0.25.0_windows_amd64\frp_0.25.0_windows_amd64
start /b frpc -c frpc.ini
