轉(zhuǎn)自我的個(gè)人博客https://blognas.hwb0307.com病曾。歡迎關(guān)注祸憋!
前言
有小伙伴提醒,
fatedier/frps
才是frp官方的Docker鏡像习劫。但我看這個(gè)官方鏡像都沒有詳細(xì)的使用說明叙谨,所以不太想折騰。我下面用的鏡像是我以前用過的瓤鼻,以前沒有注意它們不是官方秉版,所以不確定是否有潛在安全問題。如果擔(dān)心安全的話茬祷,小伙伴可以看看fatedier/frps
怎么用清焕,比如參考《容器化FRP使用方案》教程。也可通過其它方式使用frp祭犯,具體可以看官方Github地址:Repo秸妥。
最近有小伙伴問我:如果我有一個(gè)VPS,如何給自己家里的設(shè)備設(shè)置內(nèi)網(wǎng)穿透服務(wù)呢沃粗?今天粥惧,我這里給一個(gè)比較簡(jiǎn)單且久經(jīng)考驗(yàn)方案,就是利用Docker搭建frp實(shí)現(xiàn)內(nèi)網(wǎng)穿透最盅!
frp實(shí)現(xiàn)內(nèi)網(wǎng)穿透的大致工作原理如下:
- 在一個(gè)有公網(wǎng)ip的VPS中搭建frp server(frps)服務(wù)突雪。將域名
test.sample.com
解析到VPS里。 - 給frps開放某些特定的端口檩禾,比如
1234
- 在本地電腦安裝frp customer(frpc)服務(wù)挂签。通過
common
系列參數(shù)保證frps-frpc
的通信正常。 - 本地某服務(wù)上線盼产,比如
localapp:6534
饵婆。 - frpc進(jìn)行內(nèi)部連接,比如
frpc:1234
- 穿透路線:test.sample.com→VPS→frps:1234→frpc:1234→localapp:6534
差不多是這樣吧戏售,可能實(shí)際的情況有些出入侨核。本文不深入探討frps:1234→frpc:1234
是怎么工作的,有興趣自己Google一下即可(我也沒怎么研究過灌灾,這才是重點(diǎn)搓译,哈哈)。你只需要知道锋喜,frp是內(nèi)網(wǎng)穿透的常用方案之一些己,且frp確實(shí)是好用即可豌鸡。
由于我的本地寬帶已經(jīng)開通公網(wǎng)ip,所以內(nèi)網(wǎng)穿透對(duì)我而言沒有太大意義了段标。但是很多小伙伴家里的寬帶沒辦法申請(qǐng)到公網(wǎng)ip涯冠。所以我還是搞一期內(nèi)網(wǎng)穿透的教程吧,希望對(duì)他們有所幫助逼庞!
這一期的知識(shí)儲(chǔ)備和安裝一般Docker的基礎(chǔ)差不多蛇更。所以如果你看我過的Linux基礎(chǔ)和Docker系列,這一期十分簡(jiǎn)單赛糟。話不多說派任,沖!
服務(wù)器端
準(zhǔn)備工作
# 工作目錄璧南。按需修改work=~/docker/frps# 創(chuàng)建并進(jìn)入目錄mkdir -p $work/{conf,log} && cd $work# 日志文件touch $work/log/frps.log# 拉取docker鏡像docker pull ruiny/frps:latest
按需要修改配置文件
vim ./conf/frps.ini
內(nèi)容如下(有中文標(biāo)記的項(xiàng)要自己改好):
# [common] is integral section[common]# A literal address or host name for IPv6 must be enclosed# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"bind_addr = 0.0.0.0bind_port = 7000# udp port to help make udp hole to penetrate natbind_udp_port = 7001# udp port used for kcp protocol, it can be same with 'bind_port'# if not set, kcp is disabled in frpskcp_bind_port = 7000# specify which address proxy will listen for, default value is same with bind_addr# proxy_bind_addr = 127.0.0.1# if you want to support virtual host, you must set the http port for listening (optional)# Note: http port and https port can be same with bind_portvhost_http_port = 80vhost_https_port = 443# set dashboard_addr and dashboard_port to view dashboard of frps# dashboard_addr's default value is same with bind_addr# dashboard is available only if dashboard_port is setdashboard_addr = 0.0.0.0dashboard_port = 7500# 按需修改掌逛,Web管理frps時(shí)需要dashboard_user = supermandashboard_pwd = test0test# dashboard assets directory(only for debug mode)# assets_dir = ./static# console or real logFile path like ./frps.loglog_file = /var/log/frps.log# trace, debug, info, warn, errorlog_level = infolog_max_days = 3# 按需修改,在frpc的common系列參數(shù)中需要token = 12345678# heartbeat configure, it's not recommended to modify the default value# the default value of heartbeat_timeout is 90# heartbeat_timeout = 90# 按需修改穆咐,選自己要開放的網(wǎng)段allow_ports = 3505-3510# pool_count in each proxy will change to max_pool_count if they exceed the maximum valuemax_pool_count = 5# max ports can be used for each client, default value is 0 means no limitmax_ports_per_client = 0# authentication_timeout means the timeout interval (seconds) when the frpc connects frps# if authentication_timeout is zero, the time is not verified, default is 900sauthentication_timeout = 900# if subdomain_host is not empty, you can set subdomain when type is http or https in frpc's configure file# when subdomain is test, the host used by routing is test.frps.com# subdomain_host = frps.imgki.com# if tcp stream multiplexing is used, default is truetcp_mux = true
配置yml文件
新建一個(gè)docker-compose文件:
vim $work/docker-compose.yml
填入以下內(nèi)容:
version: '3'services: frps: image: 'ruiny/frps' container_name: frps1 restart: unless-stopped ports: - '6500:7000' - '6501:7500' - '6502:7001' # http端口 - '6503:80' # https端口 - '6504:443' # 這里寫自己要開放給frpc的端口 - '3505-3510:3505-3510' volumes: - ./conf:/var/frp/conf - ./log/frps.log:/var/log/frps.log
注意:
如果你的VPS是專門做內(nèi)網(wǎng)穿透用的颤诀,可以將
- '6503:80'
字旭、- '6504:443'
直接改成- '80:80'
对湃、- '443:443'
。否則遗淳,一般你要定義一個(gè)其它的端口拍柒,以免和Nginx類應(yīng)用沖突。如果你的VPS安裝了寶塔或者ufw等防火墻屈暗,你需要開放相應(yīng)端口拆讯!在本示范中,需要開放的端口號(hào)為:
6500-6504
和3505-3510
养叛。ufw就不演示了种呐,自己看我以前的Docker文章吧!
上線服務(wù):
cd $work && docker-compose up -d
觀察日志(和一般的Docker應(yīng)用有點(diǎn)不同):
tail -f $work/log/frps.log
(小白請(qǐng)忽視)高級(jí)用戶可以進(jìn)入docker內(nèi)部觀察或操作:
docker exec -it frps1 /bin/sh
你可以登陸http://<vps公網(wǎng)ip>:6501
查詢frps的工作狀態(tài)弃甥,用戶名/密碼為superman/test0test
爽室。界面類似于:
到此,frp的服務(wù)端就準(zhǔn)備好了淆攻。下面用Shell登陸自己的本地設(shè)備(如NAS或路由器)阔墩。
本地端
準(zhǔn)備工作
觀察一下本地電腦或NAS的ip地址∑可海可以這樣找:
ifconfig|less
在里面找enp
字符啸箫。比如,我的NAS的信息就類似于:
這個(gè)inet后面的192.168.X.X
的地址就是當(dāng)前設(shè)備的局域網(wǎng)ip伞芹。下面忘苛,我們以192.168.0.125
為例進(jìn)行示范。
設(shè)定工作目錄:
# 工作目錄。按需改動(dòng)work=~/docker/frpc# 創(chuàng)建并進(jìn)入工作目錄mkdir -p $work && cd $work# 拉取docker鏡像docker pull chenhw2/frp:latest
新建frpc.ini
文件:
vim ./frpc.ini
填入以下內(nèi)容:
[common]# 填寫服務(wù)器實(shí)際IP或解析該IP的某域名server_addr = sample.com# 填寫服務(wù)器frps的主端口號(hào)扎唾,本示范中是6500server_port = 6500# 與frps.ini中的token要一一對(duì)應(yīng)token = 12345678[ssh-3505]# 將服務(wù)端的3505端口連接到本地的22端口進(jìn)行ssh連接type = tcp# 本地iplocal_ip = 192.168.0.125# 你的ssh端口蜀肘。默認(rèn)是22。如果有自定義ssh端口稽屏,就寫那個(gè)自定義端口扮宠。local_port = 22# frps開放的端口之一。我隨便寫了個(gè)3505狐榔。remote_port = 3505[http-www.sample.cn]# 測(cè)試httptype = http# 本地iplocal_ip = 192.168.0.125# 比如坛增,某個(gè)Docker應(yīng)用的端口號(hào)。Emby,jellyfin之類的有Web界面的應(yīng)用薄腻。local_port = 6533custom_domains = httptest.sample.com[https-@.sample.cn]# 測(cè)試httpstype = https# 填寫域名custom_domains = httpstest.sample.complugin = https2httpplugin_local_addr = 192.168.0.125:6533# HTTPS 證書相關(guān)的配置plugin_crt_path = /frp/sample.com.pemplugin_key_path = /frp/sample.com.keyplugin_host_header_rewrite = 192.168.0.125plugin_header_X-From-Where = frp
最后收捣,記得將證書通過sftp上傳到$work
目錄里面。目錄內(nèi)容類似于:
$ ls -hl $work-rw-r--r-- 1 test_user test 1.1K Jun 13 13:38 frpc.ini-rw-r--r-- 1 test_user test 1.7K Jun 13 13:42 sample.com.key-rw-r--r-- 1 test_user test 3.8K Jun 13 13:42 sample.com.pem
我個(gè)人建議你申請(qǐng)一個(gè)頂級(jí)域名的證書庵楷,即*.sample.com, sample.com
罢艾,這樣所有的*.sample.com
都可以用同一個(gè)證書,省去了證書維護(hù)的麻煩尽纽。你如果不想咐蚯,也可以給每一個(gè)子域名單獨(dú)申請(qǐng)一個(gè)證書。全部都上傳到$work
文件夾里即可弄贿。對(duì)于每一條https記錄春锋,都定義下面的規(guī)則:
# HTTPS 證書相關(guān)的配置plugin_crt_path = /frp/目標(biāo)域名證書.pemplugin_key_path = /frp/目標(biāo)域名證書.keyplugin_host_header_rewrite = 192.168.0.125plugin_header_X-From-Where = frp
http則比較簡(jiǎn)單,和tcp類的端口差不多差凹。我強(qiáng)烈建議您使用https遠(yuǎn)程訪問Web界面期奔,這樣會(huì)比較安全。
細(xì)心的小伙伴可能發(fā)現(xiàn)危尿,上面的操作與sample.com
呐萌、httptest.sample.com
和httpstest.sample.com
這三個(gè)域名有關(guān)。確實(shí)谊娇!如果你要使用某域名作為內(nèi)網(wǎng)穿透所用肺孤,你需要將該域名解析到frps所屬的VPS的公網(wǎng)ip。以后邮绿,你每添加一個(gè)新的域名渠旁,都要對(duì)其進(jìn)行域名解析。這個(gè)道理不難理解吧船逮?
配置yml文件
新建docker-compose文件:
vim $work/docker-compose.yml
將以下內(nèi)容填入:
version: '3'services: frps: image: 'chenhw2/frp' container_name: frpc1 restart: unless-stopped environment: - ARGS=frpc volumes: - .:/frp
上線服務(wù)顾腊,稍等片刻即可:
cd $work && docker-compose up -d
觀察日志輸出:
cd $work && docker-compose logs -f
日后想下線服務(wù),只要:
cd $work && docker-compose down
都是常規(guī)操作挖胃。
測(cè)試
SSH
你在自己的Shell終端里測(cè)試一下即可:
- 地址:sample.com
- 端口號(hào):3505
- 帳戶:<自己的帳戶>
- 密碼:<自己的密碼>
HTTP
訪問http://httptest.sample.com:6503
可成功訪問應(yīng)用杂靶。
HTTPS
訪問https://httpstest.sample.com:6504
可成功訪問應(yīng)用梆惯。
小結(jié)
FRP內(nèi)網(wǎng)穿透還是蠻簡(jiǎn)單的,是吧吗垮?根據(jù)我過去2年的使用經(jīng)驗(yàn)來看垛吗,F(xiàn)RP內(nèi)網(wǎng)穿透方案還是十分穩(wěn)定的,體驗(yàn)不錯(cuò)烁登!不過怯屉,我要提醒你一下:內(nèi)網(wǎng)穿透的流量和帶寬受限于frps端,即你的VPS饵沧。平時(shí)訪問一下Web界面管理應(yīng)用好了锨络,千萬不要做類似于用內(nèi)網(wǎng)穿透地址看高清視頻之類的事情,否則VPS的流量很容易耗盡狼牺!
參考
- frp 與免費(fèi) SSL證書實(shí)現(xiàn)內(nèi)網(wǎng)穿透并支持 HTTPS 訪問
- frps配置文件:https://github.com/ruinny/frp-in-docker/blob/master/frps.ini
本文使用 文章同步助手 同步