使用frp實(shí)現(xiàn)內(nèi)網(wǎng)服務(wù)器的公網(wǎng)訪問

內(nèi)容轉(zhuǎn)載自我的博客

1. 目的和機(jī)器信息

云主機(jī)A(服務(wù)端)烙丛,購買于云服務(wù)器提供商舅巷,以下IP、端口河咽、用戶名钠右、密碼均為示例:

IP: 67.89.12.34
默認(rèn)開啟ssh的22端口,用戶名為ubuntu忘蟹,密碼為Test&123456+pwd
手動配置安全組飒房,放通7000搁凸、8000-8100、8888端口的TCP連接(端口可任意設(shè)置情屹,不與其他服務(wù)沖突即可)
7000端口用于服務(wù)端(frps.ini中的bind_port)與客戶端(frpc.ini中的server_port)建立基本通信坪仇、鑒權(quán)等
         一個服務(wù)端可以用同一個端口連接不同的客戶端
8000-8100端口用來進(jìn)行轉(zhuǎn)發(fā),只在客戶端的配置文件frpc.ini中設(shè)置remote_port垃你,每個端口轉(zhuǎn)發(fā)不同的服務(wù)
         可以是一臺內(nèi)網(wǎng)服務(wù)器有多個服務(wù);也可以是多臺內(nèi)網(wǎng)服務(wù)器喂很,每臺有不同數(shù)量的服務(wù)
8888端口用來配置frps的管理面板(80惜颇、443端口默認(rèn)開啟)

內(nèi)網(wǎng)服務(wù)器B(客戶端),自己購買的配置較高的服務(wù)器少辣,但是沒有公網(wǎng)地址凌摄,所以只能局域網(wǎng)訪問,安裝ssh以便于其他用戶可以ssh連接到本機(jī):

IP: 192.160.0.135
內(nèi)網(wǎng)服務(wù)器B安裝ssh漓帅,選擇22端口锨亏,用戶名為myserver,密碼為Myser123456ver
將內(nèi)網(wǎng)服務(wù)器B的22端口忙干,轉(zhuǎn)發(fā)到云主機(jī)A的8000端口
    則用戶C可以使用如下代碼來遠(yuǎn)程ssh連接內(nèi)網(wǎng)服務(wù)器B
    ssh -p 8000 myserver@67.89.12.34
    使用如下代碼來將內(nèi)網(wǎng)服務(wù)器B的/home/myserver/test.txt文件下載到用戶C的機(jī)器上
    scp -P 8000 myserver@67.89.12.34:/home/myserver/test.txt ./Desktop/

用戶C(用戶端)器予,只需要具備ssh連接的軟件
frp的系統(tǒng)架構(gòu)和最終實(shí)現(xiàn)的效果如下圖

frp-architecture.png

2. 云主機(jī)A下載和配置frp-server

在github倉庫frp下載linux-amd64版本,解壓為文件夾frp_linux_amd64并放在/home/ubuntu/目錄下捐迫,在frp_linux_amd64文件夾創(chuàng)建log目錄用于保存日志乾翔。修改frps.ini文件為如下

[common]
# 綁定的IP地址,支持IPv6施戴,不指定默認(rèn)0.0.0.0
bind_addr = 0.0.0.0
# 服務(wù)端口
bind_port = 7000

# 設(shè)置服務(wù)器與客戶端的鑒權(quán)方式
authentication_method = token
# 客戶端與服務(wù)端通信的身份驗(yàn)證令牌
token = ToKen&pwd+123for56

# 開啟frps儀表盤可以檢查frp的狀態(tài)和代理的統(tǒng)計(jì)信息
# frps儀表盤綁定的地址
dashboard_addr = 0.0.0.0
# frps儀表盤綁定的端口
dashboard_port = 8888
# 訪問frps儀表盤的用戶 
dashboard_user = example_admin
# 用戶密碼 
dashboard_pwd = AdMinVgfsHT67TFg
# 儀表盤頁面文件目錄反浓,只適用于調(diào)試
# assets_dir = ./static

# 日志配置文件
# 日志文件,不指定日志信息默認(rèn)輸出到控制臺
log_file = /home/ubuntu/frp_linux_amd64/log/frps.log
# 日志等級,可用等級“trace, debug, info, warn, error”
log_level = info
# 日志保存最大保存時(shí)間
log_max_days = 7

# 每個客戶端連接服務(wù)端的最大連接數(shù)
max_pool_count = 5
# 每個客戶端最大可以使用的端口赞哗,0表示無限制
max_ports_per_client = 0
# 自定義子域名雷则,需要在dns中將域名解析為泛域名
# subdomain_host = example.cn
# 是否使用tcp復(fù)用,默認(rèn)為true
tcp_mux = true

3. 云主機(jī)A安裝使用nginx(dashboard自定義域名肪笋,可選)

更新軟件源:sudo apt-get update
安裝nginx:sudo apt-get install nginx
訪問云主機(jī)的ip確認(rèn)nginx安裝成功
修改nginx配置文件:sudo vi /etc/nginx/nginx.conf
http{}合適位置添加以下代碼月劈,這里的8888端口與frps.inidashboard_port一致
一定要將http{}里面的最后兩個include行注釋掉,修改才會生效

    server{
        listen 80;
        # 如果需要ssl涂乌,參考https://blog.whuzfb.cn/blog/2020/07/07/web_https/
        # listen 443 ssl;
        # include ssl/example.cn.ssl.conf;
        # 此時(shí)支持http與https
        server_name frp.example.cn;
        access_log /home/ubuntu/frp_linux_amd64/log/access.log;
        error_log /home/ubuntu/frp_linux_amd64/log/error.log;
        location /{
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass http://127.0.0.1:8888;
        }
    }

不重啟重新載入最新配置文件內(nèi)容:sudo service nginx reload
停止nginx服務(wù):sudo service nginx stop
重啟nginx服務(wù):sudo service nginx restart
為域名example.cn添加一條名為frp的A記錄解析到67.89.12.34

4. 云主機(jī)A設(shè)置frps開機(jī)自啟動(systemd)

打開frp_linux_amd64文件夾下的systemd目錄艺栈,編輯frps.service文件(frps@.service文件只是多了個自定義ini文件的功能),將其中的user=nobody改為user=ubuntu(即本機(jī)的用戶名)湾盒,如果不改湿右,啟動時(shí)候會報(bào)錯無法寫入日志文件,權(quán)限禁止
然后修改ExecStart罚勾、ExecReload中的路徑為自己的文件路徑
將修改后的frps.service文件復(fù)制到/etc/systemd/system/sudo cp ./frps.service /etc/systemd/system/
激活frps開機(jī)啟動:systemctl enable frps
手動運(yùn)行frps服務(wù):systemctl start frpsservice frps start
手動停止frps服務(wù):systemctl stop frpsservice frps stop
手動重啟frps服務(wù):systemctl restart frpsservice frps restart
查看frps運(yùn)行狀態(tài):systemctl status frpsservice frps status
關(guān)閉frps開機(jī)啟動systemctl disable frps

5. 云主機(jī)A設(shè)置frps開機(jī)自啟動(init.d)

創(chuàng)建start_frp.sh文件:vi start_frp.sh毅人,內(nèi)容如下(注釋不可刪除):

#!/bin/sh
### BEGIN INIT INFO
# Provides:          svnd.sh
# Required-start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the svnd.sh daemon
# Description:       starts svnd.sh using start-stop-daemon
### END INIT INFO
/home/ubuntu/frp_linux_amd64/frps -c /home/ubuntu/frp_linux_amd64/frps.ini

給予執(zhí)行權(quán)限: chmod 775 start_frp.sh
復(fù)制到指定位置: sudo cp ./start_frp.sh /etc/init.d/
刷新即可: sudo update-rc.d start_frp.sh defaults 90
重啟即可發(fā)現(xiàn)自啟動進(jìn)程: ps -ef | grep frp
取消frps自啟動(/etc/init.d/)

sudo rm /etc/init.d/start_frp.sh
sudo update-rc.d -f start_frp remove

6. 內(nèi)網(wǎng)服務(wù)器B安裝配置frp-client

在github倉庫frp下載linux-amd64版本吭狡,解壓為文件夾frp_linux_amd64并放在/home/myserver/目錄下,在frp_linux_amd64文件夾創(chuàng)建log目錄用于保存日志丈莺。修改frpc.ini文件為如下

[common]
# 云主機(jī)的公網(wǎng)ip
server_addr = 67.89.12.34
# 云主機(jī)端frps.ini文件中的bind_port
server_port = 7000

# 客戶端與服務(wù)端通信的身份驗(yàn)證令牌
token = ToKen&pwd+123for56

# 設(shè)置管理地址划煮,用于通過http api控制frpc的動作,如重新加載
# admin_addr = 127.0.0.1
# admin_port = 7400
# admin_user = admin
# admin_passwd = admin

# 初始連接池的數(shù)量缔俄,默認(rèn)為0
pool_count = 5

# 客戶端日志存儲位置
log_file = /home/myserver/frp_linux_amd64/log/frpc.log
# 保存日志的等級trace, debug, info, warn, error
log_level = info
# 最大保存天數(shù)
log_max_days = 7

# 是否啟用tcp復(fù)用弛秋,默認(rèn)為true
tcp_mux = true

# 代理配置段名稱,如果上面配置user=your_name,則顯示為your_name.ssh
[ssh_B1_00]
# 協(xié)議默認(rèn)tcp,可選tcp,udp,http,https,stcp,xtcp
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 22
# 在服務(wù)器端開啟的遠(yuǎn)程端口俐载,即用戶使用自己電腦ssh連接時(shí)的端口
remote_port = 8000
    
# 云服務(wù)器管理面板創(chuàng)建安全組
# 0.0.0.0/0 TCP:7000,8000-8100,8888 允許

# 從第三臺機(jī)器上直接用ssh即可連接本機(jī)蟹略,即:
# 云主機(jī)A安裝frps,內(nèi)網(wǎng)自己配的服務(wù)器B安裝frpc
# 用戶不需要安裝frp遏佣,用戶直接使用ssh連接即可
# ssh -p 8000 myserver@67.89.12.34
# 此命令實(shí)現(xiàn)用戶C在他的電腦上遠(yuǎn)程登錄到內(nèi)網(wǎng)服務(wù)器B挖炬,
# myserver是內(nèi)網(wǎng)服務(wù)器B的用戶名,67.89.12.34是云主機(jī)A的ip
# scp -P 8000 ./1.deb myserver@67.89.12.34:/home/myserver/Desktop/
# 此命令實(shí)現(xiàn)用戶本機(jī)文件上傳到內(nèi)網(wǎng)服務(wù)器B

# 若內(nèi)網(wǎng)還有服務(wù)器B2,則云主機(jī)A的frps不需要動
# 在內(nèi)網(wǎng)服務(wù)器B2上面安裝frpc即可状婶,注意其配置為:
# [common]
# server_addr = 67.89.12.34
# server_port = 7000
# 不要與內(nèi)網(wǎng)服務(wù)器B重名
# [ssh_B2_00]   
# type = tcp
# local_ip = 127.0.0.1
# local_port = 22
# 新的用于ssh訪問內(nèi)網(wǎng)服務(wù)器B2的端口
# remote_port = 8001

7. 內(nèi)網(wǎng)服務(wù)器B設(shè)置frpc開機(jī)自啟動(systemd)

打開frp_linux_amd64文件夾下的systemd目錄意敛,編輯frpc.service文件(frpc@.service文件只是多了個自定義ini文件的功能),將其中的user=nobody改為user=myserver(即本機(jī)的用戶名)膛虫,如果不改草姻,啟動時(shí)候會報(bào)錯無法寫入日志文件,權(quán)限禁止
然后修改ExecStart走敌、ExecReload中的路徑為自己的文件路徑
將修改后的frpc.service文件復(fù)制到/etc/systemd/system/sudo cp ./frpc.service /etc/systemd/system/
激活frpc開機(jī)啟動:systemctl enable frpc
手動運(yùn)行frpc服務(wù):systemctl start frpcservice frpc start
手動停止frpc服務(wù):systemctl stop frpcservice frpc stop
手動重啟frpc服務(wù):systemctl restart frpcservice frpc restart
查看frpc運(yùn)行狀態(tài):systemctl status frpcservice frpc status
關(guān)閉frpc開機(jī)啟動systemctl disable frpc

8. 內(nèi)網(wǎng)服務(wù)器B設(shè)置frpc開機(jī)自啟動(init.d)

創(chuàng)建start_frp.sh文件:vi start_frp.sh碴倾,內(nèi)容如下(注釋不可刪除):

#!/bin/sh
### BEGIN INIT INFO
# Provides:          svnd.sh
# Required-start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the svnd.sh daemon
# Description:       starts svnd.sh using start-stop-daemon
### END INIT INFO
/home/myserver/frp_linux_amd64/frpc -c /home/myserver/frp_linux_amd64/frpc.ini

給予執(zhí)行權(quán)限: chmod 775 start_frp.sh
復(fù)制到指定位置: sudo cp ./start_frp.sh /etc/init.d/
刷新即可: sudo update-rc.d start_frp.sh defaults 90
重啟即可發(fā)現(xiàn)自啟動進(jìn)程: ps -ef | grep frp
取消frpc自啟動(/etc/init.d/)

sudo rm /etc/init.d/start_frp.sh
sudo update-rc.d -f start_frp remove

9. SSH保活的幾種方法

ssh钡衾觯活

10. 測試內(nèi)網(wǎng)穿透

保證frps.servicefrpc.service處于運(yùn)行狀態(tài)跌榔,用戶C(可以是linux系統(tǒng)、Windows系統(tǒng)等)在本機(jī)使用ssh命令即可連接到內(nèi)網(wǎng)服務(wù)器B:

  • 使用如下代碼來遠(yuǎn)程ssh連接內(nèi)網(wǎng)服務(wù)器B
    ssh -p 8000 myserver@67.89.12.34
  • 使用如下代碼來將內(nèi)網(wǎng)服務(wù)器B的/home/myserver/test.txt文件下載到用戶C的機(jī)器上
    scp -P 8000 myserver@67.89.12.34:/home/myserver/test.txt ./Desktop/

11. frp暴露多個內(nèi)網(wǎng)web服務(wù)

本部分是針對jupyterlab搭建瀏覽器開發(fā)環(huán)境的過程

云主機(jī)配置

修改frps.ini文件捶障,添加以下內(nèi)容:

# 不需要和frpc.ini一致僧须,與frpc的端口無關(guān)
vhost_http_port = 6888
subdomain_host = example.cn

[myjupyter]
type = http
subdomain = myjupyter

[web02]
type = http
subdomain = web02

然后修改nginx的配置文件sudo vim /etc/nginx/nginx.conf

    server{
        listen 80;
        server_name myjupyter.example.cn;
        # 如果需要ssl,參考https://blog.whuzfb.cn/blog/2020/07/07/web_https/
        # listen 443 ssl;
        # include ssl/example.cn.ssl.conf;
        # 此時(shí)支持http與https
        access_log /home/ubuntu/frp_linux_amd64/log/access_jupyter.log;
        error_log /home/ubuntu/frp_linux_amd64/log/error_jupyter.log;
        location /{
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass http://127.0.0.1:8888;
        }
        location /api/kernels/ {
            proxy_pass            http://127.0.0.1:8888;
            proxy_set_header      Host $host;
            # websocket support
            proxy_http_version    1.1;
            proxy_set_header      Upgrade "websocket";
            proxy_set_header      Connection "Upgrade";
            proxy_read_timeout    86400;
        }
        location /terminals/ {
            proxy_pass            http://127.0.0.1:8888;
            proxy_set_header      Host $host;
            # websocket support
            proxy_http_version    1.1;
            proxy_set_header      Upgrade "websocket";
            proxy_set_header      Connection "Upgrade";
            proxy_read_timeout    86400;
        }
    }

    server{
        listen 80;
        server_name web02.example.cn;
        # include ssl/example.cn.ssl.conf;
        access_log /home/ubuntu/frp_linux_amd64/log/access_web.log;
        error_log /home/ubuntu/frp_linux_amd64/log/error_web.log;
        location /{
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_buffering off;
            proxy_pass http://127.0.0.1:8888;
        }
        location /api/kernels/ {
            proxy_pass            http://127.0.0.1:8888;
            proxy_set_header      Host $host;
            # websocket support
            proxy_http_version    1.1;
            proxy_set_header      Upgrade "websocket";
            proxy_set_header      Connection "Upgrade";
            proxy_read_timeout    86400;
        }
        location /terminals/ {
            proxy_pass            http://127.0.0.1:8888;
            proxy_set_header      Host $host;
            # websocket support
            proxy_http_version    1.1;
            proxy_set_header      Upgrade "websocket";
            proxy_set_header      Connection "Upgrade";
            proxy_read_timeout    86400;
        }
    }

內(nèi)網(wǎng)服務(wù)器配置

修改frpc.ini文件项炼,添加以下內(nèi)容:

[myjupyter]
type = http
# 此端口運(yùn)行web服務(wù)
local_port = 7777
subdomain = myjupyter

[web02]
type = http
# 此端口運(yùn)行web服務(wù)
local_port = 7778
subdomain = web02

分別重啟nginx担平、frps與frpc即可配置成功

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锭部,隨后出現(xiàn)的幾起案子暂论,更是在濱河造成了極大的恐慌,老刑警劉巖拌禾,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件取胎,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闻蛀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門匪傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人觉痛,你說我怎么就攤上這事役衡。” “怎么了薪棒?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵手蝎,是天一觀的道長。 經(jīng)常有香客問我俐芯,道長柑船,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任泼各,我火速辦了婚禮,結(jié)果婚禮上亏拉,老公的妹妹穿的比我還像新娘扣蜻。我一直安慰自己,他們只是感情好及塘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布尤误。 她就那樣靜靜地躺著阻课,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朱监,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音翎承,去河邊找鬼净当。 笑死,一個胖子當(dāng)著我的面吹牛栋猖,可吹牛的內(nèi)容都是我干的净薛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蒲拉,長吁一口氣:“原來是場噩夢啊……” “哼肃拜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雌团,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤燃领,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锦援,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猛蔽,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年雨涛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枢舶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懦胞。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凉泄,靈堂內(nèi)的尸體忽然破棺而出躏尉,到底是詐尸還是另有隱情,我是刑警寧澤后众,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布胀糜,位于F島的核電站,受9級特大地震影響蒂誉,放射性物質(zhì)發(fā)生泄漏教藻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一右锨、第九天 我趴在偏房一處隱蔽的房頂上張望括堤。 院中可真熱鬧,春花似錦绍移、人聲如沸悄窃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧抗。三九已至,卻和暖如春瞬测,著一層夾襖步出監(jiān)牢的瞬間横媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工月趟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灯蝴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓狮斗,卻偏偏與公主長得像绽乔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碳褒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348