Docker系列 通過FRP實(shí)現(xiàn)內(nèi)網(wǎng)穿透

轉(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.comVPSfrps:1234frpc:1234localapp: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-65043505-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.comhttpstest.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的流量很容易耗盡狼牺!

參考

本文使用 文章同步助手 同步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羡儿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子是钥,更是在濱河造成了極大的恐慌掠归,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悄泥,死亡現(xiàn)場(chǎng)離奇詭異虏冻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)码泞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門兄旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人余寥,你說我怎么就攤上這事∶跎” “怎么了宋舷?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓢姻。 經(jīng)常有香客問我祝蝠,道長(zhǎng),這世上最難降的妖魔是什么幻碱? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任绎狭,我火速辦了婚禮,結(jié)果婚禮上褥傍,老公的妹妹穿的比我還像新娘儡嘶。我一直安慰自己,他們只是感情好恍风,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布蹦狂。 她就那樣靜靜地躺著誓篱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凯楔。 梳的紋絲不亂的頭發(fā)上窜骄,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音摆屯,去河邊找鬼邻遏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虐骑,可吹牛的內(nèi)容都是我干的党远。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼富弦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沟娱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腕柜,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤济似,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盏缤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砰蠢,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年唉铜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了台舱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潭流,死狀恐怖竞惋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灰嫉,我是刑警寧澤拆宛,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站讼撒,受9級(jí)特大地震影響浑厚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜根盒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一钳幅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炎滞,春花似錦敢艰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丽惭。三九已至,卻和暖如春辈双,著一層夾襖步出監(jiān)牢的瞬間责掏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工湃望, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留换衬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓证芭,卻偏偏與公主長(zhǎng)得像瞳浦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子废士,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容