之前使用Teamviewer來遠程電腦,更新之后老是提示被商用,無奈,尋求其他方案如anyDesk、向日葵遠程控制、splashtop、VNC。
frp項目地址:https://github.com/fatedier/frp
frp 是一個可用于內網穿透的高性能的反向代理應用,支持 tcp, udp,http 和 https協議。
VNC,全稱為Virtual Network Computing,它是一個桌面共享系統。功能,類似于windows中的遠程桌面功能。VNC與Windows遠程桌面一樣是使用RFB(Remote FrameBuffer,遠程幀緩沖)協議來實現遠程控制另外一臺計算機。
目的
本文介紹的是在Ubuntu 18.04.2LTS Bionic Beaver上開啟VNC服務端并frp穿透內網實現遠程桌面共享。
環境
- 操作系統 Ubuntu 18.04.2LTS Bionic Beaver(x86_64)
- 云服務器(公網ip地址)
注意事項
-
#
-要求使用root權限直接以root用戶使用命令或對執行的命令使用linuxsudo
-
$
-要求給定的linux命令作為常規非特權用戶執行
Step 1 啟用遠程桌面共享
首先查看下Ubuntu系統上是否安裝遠程桌面共享,沒有的話就執行安裝:
$ sudo apt update && sudo apt install -y vino
使用Activities
菜單搜索Sharing
可以在Settings
部分看到選項,直接打開它,或者以命令行的方式打開
$ gnome-control-center sharing
單擊Screen Sharing以開始遠程桌面配置
將開關打開為ON
,可以選擇設置密碼并記住你設置的密碼,后面連接的時候要用密碼。
Allow connections to control the screen
選項使遠程用戶能夠主動與遠程桌面交互。如果未選中此選項,則遠程桌面會話將設置為只讀。
啟用Ubuntu的遠程桌面功能后,可以看到系統正在偵聽端口5900
如果您啟用了UFW防火墻,請打開5900
端口
類似于:
$ sudo ufw allow from any to any port 5900 proto tcp
Rule added
Rule added (v6)
Step 2 建立遠程桌面連接
我們將在Ubuntu 18.04系統上使用Remmina遠程桌面客戶端,如果沒有先安裝一個,打開Ubuntu Software
搜索remmina
安裝或者命令行方式安裝:
$ sudo apt install remmina
使用Activities
菜單搜索并啟動Remmina遠程桌面客戶端或運行命令行
$ remmina
從下拉菜單中選擇協議VNC
,然后輸入Ubuntu遠程桌面系統的主機名或IP地址,按下Enter
鍵即可連接.
輸入前面設置的密碼確認連接。
連接成功,是這個樣子。
遠程桌面共享連接成功。你也可以使用Remmina面板進一步調整遠程桌面連接設置。
好了,到了這一步已經確認我們Ubuntu18.04系統的桌面共享服務已經安裝好了。這意味著你將可以與你局域網內的機器實現桌面共享,接下來,使用frp實現內網穿透,對外網提供服務,隨時隨地可以使用網絡遠程桌面到Ubuntu 18.04。
Step 3 配置frp實現內網穿透
首先下載frp二進制文件 https://github.com/fatedier/frp/releases
根據處理器架構選擇對應壓縮包
- 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版本開始,新版與舊版不兼容,并且部分配置字段不同。請確保服務端和客戶端使用同一版本。
下載程序
我這里云服務器和Ubuntu18.04都是x86_64
架構的,所以我下載linux_amd64
的壓縮包
下面以x84_64
處理器架構舉例, 此時frp 最新版是v0.27.0
# 查看cpu架構
arch
# 創建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 程序具有可執行權限
chmod +x frps
# 運行
./frps --help
如果有報錯
-bash: ./frps: cannot execute binary file: Exec format error
就說明你下錯版本
配置程序
服務端配置參考frps_full.ini
客戶端配置參考frpc_full.ini
服務端 -frps.ini
# 下面這句開頭必須要有,表示配置的開始
[common]
# frp 服務端端口(必須)
bind_port = 7000
# frp 服務端密碼(必須)
token = 12345678
# 認證超時時間,由于時間戳會被用于加密認證,防止報文劫持后被他人利用
# 因此服務端與客戶端所在機器的時間差不能超過這個時間(秒)
# 默認為900秒,即15分鐘,如果設置成0就不會對報文時間戳進行超時驗證
authentication_timeout = 900
# 儀表盤端口,只有設置了才能使用儀表盤(即后臺)
dashboard_port = 7500
# 儀表盤訪問的用戶名密碼,如果不設置,則默認都是 admin
dashboard_user = admin
dashboard_pwd = admin
# 如果你想要用 frp 穿透訪問內網中的網站(例如路由器設置頁面)
# 則必須要設置以下兩個監聽端口,不設置則不會開啟這項功能
vhost_http_port = 10080
vhost_https_port = 10443
# 此設置需要配合客戶端設置,僅在穿透到內網中的 http 或 https 時有用(可選)
# 假設此項設置為 example.com,客戶端配置 http 時將 subdomain 設置為 test,
# 則你將 test.example.com 解析到服務端后,可以使用此域名來訪問客戶端對應的 http
subdomain_host = example.com
這是我的服務端-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 服務端地址,可以填ip或者域名
server_addr = 0.0.0.0
# frp 服務端端口,即填寫服務端配置中的 bind_port
server_port = 7000
# 填寫 frp 服務端密碼
token = 12345678
###########################################
# 轉發 ssh
# 自定義一個配置名稱,格式為“[名稱]”,放在開頭
###########################################
[ssh]
# 連接類型,填 tcp 或 udp
type = tcp
# 本地ip,填你需要轉發到的目的ip
# 如果是轉發到frp客戶端所在本機(比如路由器)則填 127.0.0.1
# 否則填對應機器的內網ip
local_ip = 127.0.0.1
# 需要轉發到的端口,比如 ssh 端口是 22
local_port = 22
# 是否加密客戶端與服務端之間的通信,默認是 false
use_encryption = false
# 是否壓縮客戶端與服務端之間的通信,默認是 false
# 壓縮可以節省流量,但需要消耗 CPU 資源
# 加密自然也會消耗 CPU 資源,但是不大
use_compression = false
# frp 服務端的遠程監聽端口,即你訪問服務端的 remote_port 就相當于訪問
# 客戶端的 local_port,如果填0則會隨機分配一個端口
remote_port = 6001
###########################################
# 轉發HTTP(s)
# 自定義一個配置名稱,格式為“[名稱]”,放在開頭
###########################################
[router-web]
# 連接類型,填 http 或 https
type = http
local_ip = 127.0.0.1
local_port = 80
# http 可以考慮加密和壓縮一下
use_encryption = true
use_compression = true
# 自定義訪問網站的用戶名和密碼,如果不定義的話誰都可以訪問,會不安全
# 有些路由器如果從內部訪問web是不需要用戶名密碼的,因此需要在這里加一層密碼保護
# 如果你發現不加這個密碼保護,路由器配置頁面原本的用戶認證能正常生效的話,可以不加
http_user = admin
http_pwd = admin
# 還記得我們在服務端配置的 subdomain_host = example.com 嗎
# 假設這里我們填 web01,那么你將 web01.example.com 解析到服務端ip后
# 你就可以使用 域名:端口 來訪問你的 http 了
# 這個域名的作用是用來區分不同的 http,因為你可以配置多個這樣的配置
subdomain = web01
# 自定義域名,這個不同于 subdomain,你可以設置與 subdomain_host 無關的其他域名
# subdomain 與 custom_domains 中至少有一個必須要設置
custom_domains = web02.yourdomain.com
# 匹配路徑,可以設置多個,用逗號分隔,比如你設置 locations 為以下這個,
# 那么所有 http://xxx/abc 和 http://xxx/def 都會被轉發到 http://xxx/
# 如果不需要這個功能可以不寫這項,就直接該怎么訪問就怎么訪問
locations = /abc,/def
# 重寫 host header,相當于反向代理中的“發送域名”
# 如果設置了,轉發 http 時,請求中的 host 會被替換成這個
# 一般情況下不需要用到這個,可以不寫這項
host_header_rewrite = dev.yourdomain.com
##############################################
# TCP/UDP 范圍轉發
# 自定義一個配置名稱,格式為“[range:名稱]”,放在開頭
##############################################
[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
# 本地端口和遠程端口可以指定多個范圍,如下格式,且范圍之間必須一一對應
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
服務器端運行啟動
$ 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
云服務器注意放行相關端口.
開機啟動
自啟動可以修改/etc/rc.local
文件,加入啟動命令
或者其他系統自行設置。
#!/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
映射到云服務器的5900
端口,建立連接時,連接你的服務器+服務器端口號
。
這里我使用手機開數據網絡,關閉WIFi,下載VNC Viewer
客戶端來一下遠程連接。
打開手機VNC Viewer
,點擊+
,在Address
處填入 ip+端口形式 xxx.xxx.xxx.xxx::5900
或者 域名+端口形式 example.com::5900
。
點擊進行下一步輸入密碼以看到畫面了。
Issues
No matching security types
VNC客戶端不支持加密。任何連接到遠程桌面共享服務器的嘗試都將導致No matching security types
錯誤
如果遇到這個錯誤,請按照以下步驟解決:
- 安裝
dconf
工具
$ sudo apt-get install dconf-tools
- 打開
dconf-editor
$ dconf-editor
依次切換到org->gnome->desktop->remote-access
并將require-encryption
項目關閉。
- 執行
$ 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.
可以先執行export GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules/
然后再執行3。
- 確認已禁用遠程服務器上的加密
$ gsettings list-recursively org.gnome.Vino | grep encrypt
Reference
How To Enable Desktop Sharing In Ubuntu and Linux Mint
內網穿透神器搭建 萌新也看得懂的教程系列