之前使用Teamviewer來遠程電腦柏肪,更新之后老是提示被商用,無奈天吓,尋求其他方案如anyDesk贿肩、向日葵遠程控制、splashtop龄寞、VNC汰规。
frp項目地址:https://github.com/fatedier/frp
frp 是一個可用于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 tcp, udp,http 和 https協(xié)議物邑。
VNC溜哮,全稱為Virtual Network Computing,它是一個桌面共享系統(tǒng)色解。功能茂嗓,類似于windows中的遠程桌面功能。VNC與Windows遠程桌面一樣是使用RFB(Remote FrameBuffer科阎,遠程幀緩沖)協(xié)議來實現(xiàn)遠程控制另外一臺計算機述吸。
目的
本文介紹的是在Ubuntu 18.04.2LTS Bionic Beaver上開啟VNC服務(wù)端并frp穿透內(nèi)網(wǎng)實現(xiàn)遠程桌面共享。
環(huán)境
- 操作系統(tǒng) Ubuntu 18.04.2LTS Bionic Beaver(x86_64)
- 云服務(wù)器(公網(wǎng)ip地址)
注意事項
-
#
-要求使用root權(quán)限直接以root用戶使用命令或?qū)?zhí)行的命令使用linuxsudo
-
$
-要求給定的linux命令作為常規(guī)非特權(quán)用戶執(zhí)行
Step 1 啟用遠程桌面共享
首先查看下Ubuntu系統(tǒng)上是否安裝遠程桌面共享锣笨,沒有的話就執(zhí)行安裝:
$ sudo apt update && sudo apt install -y vino
使用Activities
菜單搜索Sharing
可以在Settings
部分看到選項蝌矛,直接打開它道批,或者以命令行的方式打開
$ gnome-control-center sharing
單擊Screen Sharing以開始遠程桌面配置
將開關(guān)打開為ON
,可以選擇設(shè)置密碼并記住你設(shè)置的密碼入撒,后面連接的時候要用密碼隆豹。
Allow connections to control the screen
選項使遠程用戶能夠主動與遠程桌面交互。如果未選中此選項茅逮,則遠程桌面會話將設(shè)置為只讀噪伊。
啟用Ubuntu的遠程桌面功能后,可以看到系統(tǒng)正在偵聽端口5900
如果您啟用了UFW防火墻氮唯,請打開5900
端口
類似于:
$ sudo ufw allow from any to any port 5900 proto tcp
Rule added
Rule added (v6)
Step 2 建立遠程桌面連接
我們將在Ubuntu 18.04系統(tǒng)上使用Remmina遠程桌面客戶端鉴吹,如果沒有先安裝一個,打開Ubuntu Software
搜索remmina
安裝或者命令行方式安裝:
$ sudo apt install remmina
使用Activities
菜單搜索并啟動Remmina遠程桌面客戶端或運行命令行
$ remmina
從下拉菜單中選擇協(xié)議VNC
,然后輸入Ubuntu遠程桌面系統(tǒng)的主機名或IP地址惩琉,按下Enter
鍵即可連接.
輸入前面設(shè)置的密碼確認連接豆励。
連接成功,是這個樣子瞒渠。
遠程桌面共享連接成功良蒸。你也可以使用Remmina面板進一步調(diào)整遠程桌面連接設(shè)置。
好了伍玖,到了這一步已經(jīng)確認我們Ubuntu18.04系統(tǒng)的桌面共享服務(wù)已經(jīng)安裝好了嫩痰。這意味著你將可以與你局域網(wǎng)內(nèi)的機器實現(xiàn)桌面共享,接下來窍箍,使用frp實現(xiàn)內(nèi)網(wǎng)穿透串纺,對外網(wǎng)提供服務(wù),隨時隨地可以使用網(wǎng)絡(luò)遠程桌面到Ubuntu 18.04椰棘。
Step 3 配置frp實現(xiàn)內(nèi)網(wǎng)穿透
首先下載frp二進制文件 https://github.com/fatedier/frp/releases
根據(jù)處理器架構(gòu)選擇對應(yīng)壓縮包
- Windows 64位 :frp_版本號_windows_amd64.zip
- Windows 32位:frp_版本號_windows_386.zip
- Linux 64位:frp_版本號_linux_amd64.tar.gz
- Linux 32位:frp_版本號_linux_386.tar.gz
注意:從0.18.0版本開始纺棺,新版與舊版不兼容,并且部分配置字段不同邪狞。請確保服務(wù)端和客戶端使用同一版本祷蝌。
下載程序
我這里云服務(wù)器和Ubuntu18.04都是x86_64
架構(gòu)的,所以我下載linux_amd64
的壓縮包
下面以x84_64
處理器架構(gòu)舉例帆卓, 此時frp 最新版是v0.27.0
# 查看cpu架構(gòu)
arch
# 創(chuàng)建frp文件夾并進入
mkdir frp && cd frp
# 下載
wget -q -c --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz
# 解壓
tar -xzvf frp_0.27.0_linux_amd64.tar.gz
# 進入文件夾
cd frp_0.27.0_linux_amd64
# 確保 frps 程序具有可執(zhí)行權(quán)限
chmod +x frps
# 運行
./frps --help
如果有報錯
-bash: ./frps: cannot execute binary file: Exec format error
就說明你下錯版本
配置程序
服務(wù)端配置參考frps_full.ini
客戶端配置參考frpc_full.ini
服務(wù)端 -frps.ini
# 下面這句開頭必須要有巨朦,表示配置的開始
[common]
# frp 服務(wù)端端口(必須)
bind_port = 7000
# frp 服務(wù)端密碼(必須)
token = 12345678
# 認證超時時間,由于時間戳?xí)挥糜诩用苷J證剑令,防止報文劫持后被他人利用
# 因此服務(wù)端與客戶端所在機器的時間差不能超過這個時間(秒)
# 默認為900秒糊啡,即15分鐘,如果設(shè)置成0就不會對報文時間戳進行超時驗證
authentication_timeout = 900
# 儀表盤端口尚洽,只有設(shè)置了才能使用儀表盤(即后臺)
dashboard_port = 7500
# 儀表盤訪問的用戶名密碼悔橄,如果不設(shè)置,則默認都是 admin
dashboard_user = admin
dashboard_pwd = admin
# 如果你想要用 frp 穿透訪問內(nèi)網(wǎng)中的網(wǎng)站(例如路由器設(shè)置頁面)
# 則必須要設(shè)置以下兩個監(jiān)聽端口腺毫,不設(shè)置則不會開啟這項功能
vhost_http_port = 10080
vhost_https_port = 10443
# 此設(shè)置需要配合客戶端設(shè)置癣疟,僅在穿透到內(nèi)網(wǎng)中的 http 或 https 時有用(可選)
# 假設(shè)此項設(shè)置為 example.com,客戶端配置 http 時將 subdomain 設(shè)置為 test潮酒,
# 則你將 test.example.com 解析到服務(wù)端后睛挚,可以使用此域名來訪問客戶端對應(yīng)的 http
subdomain_host = example.com
這是我的服務(wù)端-frps.ini的配置
[common]
bind_port = 7000
token = 12345678
authentication_timeout = 900
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 8080
subdomain_host = example.com
max_pool_count = 10
log_file = ./frps.log
log_level = info
log_max_days = 3
客戶端 -frpc.ini
############################################
# 基本配置(必須)
# 下面這句開頭必須要有,表示配置的開始
############################################
[common]
# frp 服務(wù)端地址急黎,可以填ip或者域名
server_addr = 0.0.0.0
# frp 服務(wù)端端口扎狱,即填寫服務(wù)端配置中的 bind_port
server_port = 7000
# 填寫 frp 服務(wù)端密碼
token = 12345678
###########################################
# 轉(zhuǎn)發(fā) ssh
# 自定義一個配置名稱,格式為“[名稱]”勃教,放在開頭
###########################################
[ssh]
# 連接類型淤击,填 tcp 或 udp
type = tcp
# 本地ip,填你需要轉(zhuǎn)發(fā)到的目的ip
# 如果是轉(zhuǎn)發(fā)到frp客戶端所在本機(比如路由器)則填 127.0.0.1
# 否則填對應(yīng)機器的內(nèi)網(wǎng)ip
local_ip = 127.0.0.1
# 需要轉(zhuǎn)發(fā)到的端口故源,比如 ssh 端口是 22
local_port = 22
# 是否加密客戶端與服務(wù)端之間的通信污抬,默認是 false
use_encryption = false
# 是否壓縮客戶端與服務(wù)端之間的通信,默認是 false
# 壓縮可以節(jié)省流量绳军,但需要消耗 CPU 資源
# 加密自然也會消耗 CPU 資源印机,但是不大
use_compression = false
# frp 服務(wù)端的遠程監(jiān)聽端口,即你訪問服務(wù)端的 remote_port 就相當(dāng)于訪問
# 客戶端的 local_port门驾,如果填0則會隨機分配一個端口
remote_port = 6001
###########################################
# 轉(zhuǎn)發(fā)HTTP(s)
# 自定義一個配置名稱射赛,格式為“[名稱]”,放在開頭
###########################################
[router-web]
# 連接類型奶是,填 http 或 https
type = http
local_ip = 127.0.0.1
local_port = 80
# http 可以考慮加密和壓縮一下
use_encryption = true
use_compression = true
# 自定義訪問網(wǎng)站的用戶名和密碼楣责,如果不定義的話誰都可以訪問,會不安全
# 有些路由器如果從內(nèi)部訪問web是不需要用戶名密碼的聂沙,因此需要在這里加一層密碼保護
# 如果你發(fā)現(xiàn)不加這個密碼保護腐魂,路由器配置頁面原本的用戶認證能正常生效的話,可以不加
http_user = admin
http_pwd = admin
# 還記得我們在服務(wù)端配置的 subdomain_host = example.com 嗎
# 假設(shè)這里我們填 web01逐纬,那么你將 web01.example.com 解析到服務(wù)端ip后
# 你就可以使用 域名:端口 來訪問你的 http 了
# 這個域名的作用是用來區(qū)分不同的 http蛔屹,因為你可以配置多個這樣的配置
subdomain = web01
# 自定義域名,這個不同于 subdomain豁生,你可以設(shè)置與 subdomain_host 無關(guān)的其他域名
# subdomain 與 custom_domains 中至少有一個必須要設(shè)置
custom_domains = web02.yourdomain.com
# 匹配路徑兔毒,可以設(shè)置多個,用逗號分隔甸箱,比如你設(shè)置 locations 為以下這個育叁,
# 那么所有 http://xxx/abc 和 http://xxx/def 都會被轉(zhuǎn)發(fā)到 http://xxx/
# 如果不需要這個功能可以不寫這項,就直接該怎么訪問就怎么訪問
locations = /abc,/def
# 重寫 host header芍殖,相當(dāng)于反向代理中的“發(fā)送域名”
# 如果設(shè)置了豪嗽,轉(zhuǎn)發(fā) http 時,請求中的 host 會被替換成這個
# 一般情況下不需要用到這個,可以不寫這項
host_header_rewrite = dev.yourdomain.com
##############################################
# TCP/UDP 范圍轉(zhuǎn)發(fā)
# 自定義一個配置名稱龟梦,格式為“[range:名稱]”隐锭,放在開頭
##############################################
[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
# 本地端口和遠程端口可以指定多個范圍,如下格式计贰,且范圍之間必須一一對應(yīng)
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028
這是我的客戶端-frpc.ini的配置
[common]
server_addr = example.com
server_port = 7000
token = 12345678
[web]
type = http
local_ip = 192.168.103.145
local_port = 80
custom_domains = example.com
[RDP]
type = tcp
local_ip = 192.168.103.145
local_port = 5900
remote_port = 5900
服務(wù)器端運行啟動
$ nohup /root/frp/frps -c /root/frp/frps.ini &
客戶端(Ubuntu18.04)啟動
$ nohup /home/xmaihh/frp/frpc -c /home/xmaihh/frp/frpc.ini &
停止
$ pkill frps 或者 pkill frpc
云服務(wù)器注意放行相關(guān)端口.
開機啟動
自啟動可以修改/etc/rc.local
文件,加入啟動命令
或者其他系統(tǒng)自行設(shè)置钦睡。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#nohup socat TCP4-LISTEN:4443,reuseaddr,fork TCP4:192.168.103.145:8123 >> /root/socat.log 2>&1 &
#nohup socat UDP4-LISTEN:4443,reuseaddr,fork UDP4:192.168.103.145:8123 >> /root/socat.log 2>&1 &
nohup /root/frp/frps -c /root/frp/frps.ini &
exit 0
建立遠程連
請注意remote_port = 5900
我把Ubuntu18.04的VNC Sharing端口5900
映射到云服務(wù)器的5900
端口,建立連接時躁倒,連接你的服務(wù)器+服務(wù)器端口號
荞怒。
這里我使用手機開數(shù)據(jù)網(wǎng)絡(luò),關(guān)閉WIFi秧秉,下載VNC Viewer
客戶端來一下遠程連接褐桌。
打開手機VNC Viewer
,點擊+
,在Address
處填入 ip+端口形式 xxx.xxx.xxx.xxx::5900
或者 域名+端口形式 example.com::5900
。
點擊進行下一步輸入密碼以看到畫面了象迎。
Issues
No matching security types
VNC客戶端不支持加密荧嵌。任何連接到遠程桌面共享服務(wù)器的嘗試都將導(dǎo)致No matching security types
錯誤
如果遇到這個錯誤,請按照以下步驟解決:
- 安裝
dconf
工具
$ sudo apt-get install dconf-tools
- 打開
dconf-editor
$ dconf-editor
依次切換到org->gnome->desktop->remote-access
并將require-encryption
項目關(guān)閉挖帘。
- 執(zhí)行
$ gsettings set org.gnome.Vino require-encryption false
如果輸出警告:
GLib-GIO-Message: 10:19:43.137: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.
可以先執(zhí)行export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/
然后再執(zhí)行3完丽。
- 確認已禁用遠程服務(wù)器上的加密
$ gsettings list-recursively org.gnome.Vino | grep encrypt
Reference
How To Enable Desktop Sharing In Ubuntu and Linux Mint
內(nèi)網(wǎng)穿透神器搭建 萌新也看得懂的教程系列