其他操作
工控機如何連wifi
當我們工控機從一個環境移動到另一個環境,且新的環境的wifi我們沒有連接過,我們沒有屏幕如何讓工控機連上網呢?
進入工控機的硬盤目錄,進入/etc/netplan/,底下有很多yaml,找到一個最符合下方格式的yaml:
network:
version: 2
wifis:
NM-6f414fe0-2658-48ff-89ee-c7981b87bc96:
renderer: NetworkManager
match:
name: "wlan0"
dhcp4: true
dhcp6: true
access-points:
"EMIS_Vinci_Robocon_5G":
auth:
key-management: "psk"
password: "vinci666"
networkmanager:
uuid: "6f414fe0-2658-48ff-89ee-c7981b87bc96"
name: "EMIS_Vinci_Robocon_5G"
passthrough:
wifi-security.auth-alg: "open"
ipv6.addr-gen-mode: "default"
ipv6.ip6-privacy: "-1"
proxy._: ""
networkmanager:
uuid: "6f414fe0-2658-48ff-89ee-c7981b87bc96"
name: "EMIS_Vinci_Robocon_5G"
將其改為新wifi的名和密碼:
network:
version: 2
wifis:
wlan0:
dhcp4: true
dhcp6: true
access-points:
"EMIS_Vinci_Robocon_5G":
password: "vinci666"
工控機開機即可連上網。
SSH遠程開發
環境準備
1.硬件準備
首先要有一臺工控機(X86小型電腦,專業工控機,樹莓派等等)。
控制系統的硬件載體是具有多樣性的,常用的多是基於ARM、x86等架構的處理器,比如:PC、工控機、樹莓派、NVIDIA Jetson...。不同的處理器都存在一定的優缺點,PC和工控機,處理器性能強大,但是功耗高、體積大、靈活性差,嵌入式系統則反之。對於我們而言,可以根據機器人平臺的電氣、載重、空間以及用途等諸多要素自主選擇合適的控制系統。
無論選用何種處理器,只要是要進行機器人的開發,安裝了ROS或者ROS2,那麼對於開發人員而言,在使用上,沒有任何本質的區別,或者換言之,作為軟件工程師,部分場景下無需關注於硬件的選型。
2.設置固定IP
遠程連接時,不管使用何種工具,需要根據IP地址定位到被連接的主機,再通過賬號和密碼登錄該主機,因此,我們需要先獲取該IP地址。並且每次連接時,都需要使用到IP,為了保證連接的便利性和穩定性,最好將被連接主機的IP地址設置為固定IP,具體操作如下。
1.進入設置界面
啟動被連接的主機(啟動時需要連接顯示器或使用HDMI採集卡,並且配置完SSH遠程訪問之後,可以不再使用顯示器或HDMI採集卡),並進入設置界面。

2.配置所連接的網絡

3.設置固定IP
查看當前IP地址。

設置固定IP。

至此,IP配置完畢。
環境搭建
概念
SSH(Secure Shell)是一種通用的、功能強大的、基於軟件的網絡安全解決方案。計算機每次向網絡發送數據時,SSH都會自動對其進行加密。數據到達目的地時,SSH自動對加密數據進行解密。整個過程都是透明的,使用OpenSSH工具將會增進你的系統安全性。SSH安裝容易、使用簡單。
實現
SSH實現架構上分為客戶端和服務器端兩大部分,客戶端是數據的發送方,服務端是數據的接收方,當前場景下,我們需要從本地主機發送數據到遠程主機,那麼本地主機需要安裝並啟動SSH客戶端,而遠程主機則需要安裝並啟動SSH服務端,整個實現具體流程如下:
- 本地主機安裝SSH客戶端,遠程主機安裝SSH服務端;
- 遠程主機啟動SSH服務;
- 本地主機登陸遠程主機;
- 實現數據傳輸。
1.安裝SSH客戶端與服務端
默認情況下,Ubuntu系統已經安裝了SSH客戶端,因此只需要在遠程主機安裝SSH服務端即可,安裝命令如下:
sudo apt install openssh-server
如果SSH客戶端需要自行安裝,那麼調用如下命令:
sudo apt install openssh-client
2.遠程主機啟動SSH服務
遠程主機啟動 ssh 服務命令如下:
sudo /etc/init.d/ssh start
啟動後可使用如下命令查看服務是否正常運行:
ps -e | grep ssh
如果啟動成功,會包含 sshd 程序。
以後需要頻繁的使用ssh遠程登錄,為了簡化實現,可以將遠程主機的ssh服務設置為開機自啟動,命令如下:
sudo systemctl enable ssh
3.本地遠程登錄
登錄遠程主機可以調用如下命令:
ssh -X 用户名@ip地址
然後根據提示,錄入登陸密碼,即可成功登錄。
如果退出,可以調用exit命令:
exit
4.實現數據傳輸
通過SSH在本地主機只需調用相關指令,便可方便的實現與遠程主機的數據上傳或下載,指令格式如下所示:
上傳文件指令格式如下:
scp 本地文件路径 账号@ip:路径
上傳文件夾指令格式如下:
scp -r 本地文件夹路径 账号@ip:路径
下載文件指令格式如下:
scp 账号@ip:路径 本地文件夹路径
下載文件夾指令格式如下:
scp -r 账号@ip:路径 本地文件夹路径
優化
每次遠程登錄時,都需要輸入密碼,使用不方便,可以藉助密鑰簡化登錄過程,實現免密登錄,提高操作效率。實現思想是:生成一對公鑰私鑰,私鑰存儲在本地,公鑰上傳至服務器,每次登錄時,本地直接上傳私鑰到服務器,服務器有匹配的公鑰就認為是合法用戶,直接創建SSH連接即可。具體實現步驟只有兩步:
- 本地生成密鑰對;
- 將公鑰上傳至遠程主機。
1.生成密鑰對
本地客戶端生成公私鑰:(一路回車默認即可)
ssh-keygen
上面這個命令會在用戶目錄.ssh文件夾下創建公私鑰:
- id_rsa (私鑰);
- id_rsa.pub (公鑰)。
2.公鑰上傳
上傳指令如下:
ssh-copy-id -i ~/.ssh/id_rsa.pub 账号@ip
上面這條指令是將本地公鑰上傳到遠程主機的ssh目錄下,該目錄下有文件authorized_keys保存了公鑰內容。
以後再遠程登錄就無需錄入密碼了。
使用VScode優化
上一節,我們介紹了ssh遠程連接的使用,但是如果只是純粹使用ssh也存在一些不足,比如:編輯文件內容時,需要使用vi編輯器,且在一個終端內,無法同時編輯多個文件。本節將介紹一更為實用的功能——VSCode結合插件實現遠程開發,這使我們可以以圖形化的方式實現遠程開發,比ssh的使用更方便快捷,可以大大的提高程序開發效率。
1.準備工作
VScode遠程開發依賴於ssh,請首先按照上一節內容配置ssh遠程連接。
2.為VScode安裝遠程開發插件
啟動VScode,首先點擊側邊欄的擴展按鈕,然後在扩展:商店的搜索欄輸入Remote Development並點擊同名插件,最後在右側顯示區中點擊安装。

3.配置遠程連接
步驟1:使用快捷鍵ctrl + shift + p打開命令輸入窗口,並輸入Remote-SSH:Connect to Host...,彈出列表中選擇與之同名的選項。

步驟2:步驟1完成將彈出一個新的命令窗口如下,選擇下拉列表中的 Add New SSH Host。

步驟3:步驟2完成又將彈出一個新的命令窗口,在其中輸入:ssh -X ubuntu@192.168.43.164,其中,ubuntu需要替換為你的登錄用戶名,192.18.43.164 則替換為被遠程連接主機的ip地址。

步驟4:選擇步驟3完成後的彈窗列表中的第一個選項(或直接回車),即可完成配置,配置成功後會有提示信息。


4.使用
步驟1:繼續使用快捷鍵ctrl + shift + p打開命令輸入窗口,並輸入Remote-SSH:Connect to Host...,此時列表中將顯示步驟3中配置的ip地址,直接選擇,選擇後,VScode將打開一個新的窗口。

或者,也可以點擊側邊欄的远程资源管理器,在彈出的服務器列表中選擇要連接的服務器,並右擊,選擇在本窗口或新窗口中實現遠程連接。

步驟2:選擇菜單欄的文件下的打开文件夹,在彈窗列表中選擇需要打開的文件夾並點擊確定即可。

最終,我們就可以像操作本地文件一樣實現遠程開發了。
遠程桌面
因為用X11轉發效率太低太低,所以還是要選用遠程訪問桌面的形式來看Rviz2和Gazebo等等(如果有需求的話)
我們選擇使用VNC來看。
- 安裝VNC服務器:
這裡以TigerVNC為例進行安裝:
sudo apt install tigervnc-standalone-server tigervnc-common
- 設置VNC密碼:
為VNC用戶設置密碼,運行以下命令:
vncpasswd
- 配置VNC啟動腳本:
創建VNC配置文件,在用戶家目錄內的.vnc文件夾中創建啟動文件:
mkdir -p ~/.vnc
nano ~/.vnc/xstartup
在打開的編輯器裡面輸入以下內容(以GNOME為例):
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
gnome-session
保存並退出(在nano中按Ctrl + O保存,然後按Ctrl + X退出)。
- 給予執行權限:
為xstartup文件設置執行權限:
chmod +x ~/.vnc/xstartup
- 啟動VNC服務器:
vncserver -geometry 1920x1080 -localhost=0
geometry 選項指定窗口大小,localhost 選項設為 0 以開放連接。(設為1是隻允許本地連接)
你將看到類似於:1的輸出,這表示VNC會話的顯示編號。例如,如果輸出為:1,則VNC監聽的端口為5901(5900 + 顯示編號)。
- 查看已開啟的VNC服務器:
vncserver -list

- 連接到VNC服務器:
使用VNC客戶端(如vncviewer)連接到VNC服務器,輸入你的服務器IP和端口。例如,如果服務器IP為192.168.31.10,且顯示編號為1,你應該連接到192.168.31.10:1,或者直接輸入192.168.31.10:5901。
- 停止VNC服務器:
如果需要停止VNC服務器,可以使用以下命令:
vncserver -kill :1
將:1替換為你實際使用的顯示編號。


USB端口設置
首先先配置好權限
# 将用户权限提高
sudo usermod -aG dialout $USER
newgrp dialout
# 查看下面命令是否输出dialout(若输出才正常)
groups
因為我們插拔USB設備,他的端口號可能會一直變,所以我們要給他的tty起一個固定的別名。
根據USB設備綁定端口(多個不同設備)
需求: Ubuntu系統中現接入雷達和智能小車,請為二者綁定端口。
實現原理: 可以通過USB設備本身的“標識”實現端口綁定。
流程如下:
(1).查找設備idVendor和idProduct
接入兩個USB設備,在終端調用指令lsusb查看顯示系統中以及連接到系統的USB設備信息。

如上圖所示,紅色方框內數據為USB設備,ID後面的1a86:7523分別為USB的idVendor和idProduct(兩個參數之間使用”:“分隔)。
另外:可以通過重新插拔比較的方式確定哪些數據對應接入的USB設備。
(2).編寫映射規則
在/etc/udev/rules.d目錄下新建文件xxx.rules(文件名自定義)
sudo vim /etc/udev/rules.d/xxx.rules
輸入如下內容:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="mylidar"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="mycar"
代碼解釋:
- KERNEL是內核固定名稱,這裡統一是“ttyUSB*”;
- MODE是節點權限,通常改為“0777”,表示可讀寫可運行;
- SYMLINK是符號連接,即綁定的別名;
- ATTRS是設備廠商的唯一標識,idVendor和idProduct正好組成上面通過lsusb查找到的設備ID。
***小提示:***一般的USB設備供應商都會提供類似的腳本文件,對於調用者而言,直接複製該文件到/etc/udev/rule.d目錄即可。
| 設備類型 | 內核名稱示例 | 說明 |
|---|---|---|
| USB 串口設備 | ttyUSB* | USB 轉串口設備,如 /dev/ttyUSB0 |
| 串口設備 | ttyS* | 物理串口設備,如 /dev/ttyS0 |
| 存儲設備 | sd* | SCSI 磁盤設備,如 /dev/sda |
| 網絡設備 | eth* | 以太網設備,如 /dev/eth0 |
| 輸入設備 | event* | 輸入事件設備,如 /dev/input/event0 |
| 藍牙設備 | rfcomm* | 藍牙串口設備,如 /dev/rfcomm0 |
(3).使規則生效
在終端下輸入如下指令:
# Ubuntu用下方命令
sudo service udev reload
sudo service udev restart
#Fedora用下方命令
sudo udevadm control --reload
sudo udevadm trigger
再重新插拔設備即可。
(4).測試
終端下輸入如下指令
ll /dev | grep ttyUSB
運行結果如下:


也可以多次插拔USB設備,會發現設備端口ttyUSBn中的n編號會變動,但是別名是始終可以指向對應的USB設備的。至此,就可以使用別名來關聯所需使用的USB設備了。
缺點:
上述實現也存在一定的侷限性,當Ubuntu接入兩臺或多臺相同型號的USB設備時,由於設備ID是一樣的,該種實現方式只會對其中的一臺設備生效,這種情況下,就需要通過第二種策略來實現端口的綁定了。
根據主機硬件綁定端口(多個相同設備)
需求: 無人車中現接入一前一後兩臺相同型號的雷達,請為二者綁定端口。
實現原理: USB設備所連接主機的USB接口也是有其“標識”的,可以通過這個標識實現端口綁定。
流程如下:
(1).查看所連接的主機USB接口的KERNELS
調用如下指令查看第一臺雷達的USB信息:
udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep KERNELS
udevadm info --attribute-walk --name=/dev/ttyACM0 | grep KERNELS

調用如下指令查看第二臺雷達的USB信息:
udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep KERNELS
運行結果相比較不同的KERNELS,第一臺雷達端口地址為KERNELS==1-1.3:1.0,第二個雷達端口地址為KERNELS==1-1.4:1.0。可以使用此數據作為不同端口的“唯一性標識”。
(2).編寫映射規則
在/etc/udev/rules.d目錄下新建文件xxx.rules(文件名自定義),輸入如下內容:
sudo vim /etc/udev/rules.d/xxx.rules
KERNEL=="ttyUSB*", KERNELS=="1-1.3:1.0", MODE:="0777", SYMLINK+="rplidar_front"
KERNEL=="ttyUSB*", KERNELS=="1-1.4:1.0", MODE:="0777", SYMLINK+="rplidar_back"
(3).使規則生效
在終端下輸入如下指令:
# Ubuntu用下方命令
sudo service udev reload
sudo service udev restart
#Fedora用下方命令
sudo udevadm control --reload
sudo udevadm trigger
再重新插拔設備即可。
(4).測試
終端下輸入如下指令,運行結果如下:
ll /dev | grep ttyUSB

至此,就可以使用別名來關聯所需使用的USB設備了。
缺點: USB設備必須連接在主機的指定端口上,否則,會導致端口綁定失敗,或產生邏輯錯誤。(而且增加新設備可能會導致端口改變)
根據其他屬性綁定端口
(1).查看所連接的主機USB接口的信息
udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)

這些數據都是不會變的,所以可以拿這些數據來做標識
(2).編寫映射規則
在/etc/udev/rules.d目錄下新建文件xxx.rules(文件名自定義),輸入如下內容:
sudo vim /etc/udev/rules.d/xxx.rules
KERNEL=="ttyACM*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ATTRS{serial}=="0001", MODE:="0777", SYMLINK+="ttyACM_Lidar"
KERNEL=="ttyACM*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ATTRS{serial}=="0002", MODE:="0777", SYMLINK+="ttyACM_MCU"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="ttyUSB_IMU"
(3).使規則生效
在終端下輸入如下指令:
# Ubuntu用下方命令
sudo service udev reload
sudo service udev restart
#Fedora用下方命令
sudo udevadm control --reload
sudo udevadm trigger
再重新插拔設備即可,或者 直接重啟系統。
(4).測試
終端下輸入如下指令ll /dev | grep ttyUSB,運行結果如下:

至此,就可以使用別名來關聯所需使用的USB設備了。
缺點: 一些設備可能沒有串口號等。
其他注意事項
並非所有的USB設備端口號都是ttyUSBn的格式,比如Arduino的端口號可能是ttyACMn,而對於USB攝像頭而言,一臺設備則對應兩個端口號,分別是videon和video(n+1),並且啟用攝像頭設備一般使用的是videon端口,綁定時需要關聯的也是該接口。
但是無論是外接何種USB設備,也不管採用上述兩種方案的哪一種進行端口綁定,其原理都是類似的,只是實現細節不同而已。如果是外接的Arduino設備,那麼需要在rules文件中的將KERNEL=="ttyUSB*"修改為KERNEL=="ttyACM*",如果外接的是USB攝像頭,那麼則需要在rules文件中的將KERNEL=="ttyUSB*"修改為類似於KERNEL=="video[0,2,4,6]"的格式,其中video[0,2,4,6]表示可以綁定的端口為video0或video2或video4或video6。
Linux分區Gui工具
sudo apt install gparted
sudo dnf install gparted
DDNS
掛載內網網頁
可以把本地的網頁掛載到路由器端,或者同內網段其他設備上,甚至可以掛載在本地。
下面以安卓設備為例子,由於安卓設備暫時不能直接打開html,所以我們可以把html掛載到本地服務器,再通過瀏覽器查看。
由於安卓系統基於Linux內核,所以我們可以下載一個叫termux的app來敲一些Linux命令:
https://github.com/termux/termux-app
首先打開app後,先更新軟件緩存:
pkg update
然後換源
nano $PREFIX/etc/apt/sources.list
將該文件內容替換為下面:
deb https://mirrors.bfsu.edu.cn/termux/termux-packages-24 stable main
- 如果你使用的是
nano編輯器:- 按
Ctrl+O保存文件。 - 按
Enter確認文件名。 - 按
Ctrl+X退出編輯器。
- 按
- 如果你使用的是
vim編輯器:- 按
Esc退出編輯模式。 - 輸入
:wq保存並退出。
- 按
接下來重新更新軟件源:
pkg update && pkg upgrade
安裝python:
pkg install python3
通過Termux訪問設備存儲 :
如果文件在安卓設備上,可以使用Termux的文件管理器訪問設備的存儲:
termux-setup-storage
- 進入HTML文件所在的目錄 :
- 使用
cd命令進入HTML文件所在的目錄:
- 使用
cd ~/your_html_folder
- 啟動Python HTTP服務器 :
- 運行以下命令啟動一個簡單的HTTP服務器:
python3 -m http.server 8000- 這會在端口
8000上啟動一個Web服務器。
- 啟動服務器後,Termux會顯示日誌信息,例如:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
- 這表示服務器已成功啟動。
在瀏覽器中訪問HTML文件
- 在同一設備上訪問 :
- 打開安卓設備上的瀏覽器(如Chrome),輸入以下地址:
http://localhost:8000- 如果HTML文件中有
index.html,它會自動加載;否則,你需要手動點擊文件鏈接。
RustDesk
RustDesk無人值守遠程控制
目前rustdesk還沒辦法進行無人值守在wayland下,所以我們需要把登陸密碼,鎖屏和休眠待機全部關掉.
設置 KDE6 自動登錄
- 可以先查自己的sddm類型
ls /usr/share/xsessions/
ls /usr/share/wayland-sessions/
看哪個會輸出東西,輸出東西的文件夾就是你擁有的sddm,比如xsessions輸出內容的話,那就是x11的sddm,如果wayland-sessions輸出內容的話你就是wayland的sddm.
- 編輯 SDDM 配置:
sudo nano /etc/sddm.conf
在文件最上面有個Autologin,在這個底下加入下面的內容:
[Autologin]
User=你的用户名
Session=plasma.desktop # 或 plasma.desktop(X11),方案一可用 Wayland
- 保存退出後重啟 SDDM:
sudo systemctl restart sddm
✅ 開機後自動進入桌面,無需輸入密碼
關閉鎖屏在 KDE6 系統設置裡:
打開 系統設置 → 屏幕鎖定(Screen Locking) 關閉自動鎖定 關閉屏幕關閉 / 屏幕保護鎖定 這樣 RustDesk 可以開機後直接控制桌面,不會被鎖屏阻擋
關閉休眠系統設置 → 電源管理(Power Managerment)
禁用“休眠”或“自動掛起” 保證電腦開機一直在線,RustDesk 可隨時遠控 如果必須休眠,可在 BIOS 設置裡禁用休眠,保證開機即聯網
RustDesk自建服務器
在服務器端安裝
命令行方式

- 用ssh訪問你需要安裝RustDesk的服務器
ssh tungchiahui@10.0.0.4

- 使用方法二的命令

wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
chmod +x install.sh
./install.sh
./install.sh的設置看下一節
- 配置與查看KEY
這裡如果你是想直接用公網ip則選擇1)IP,如果你是DDNS等用域名綁定了IP地址,則選擇2).

這個選2)No

這個是KEY,要複製下來,等後面軟件配置的時候要用.

- 配置防火牆
- 如果你是Debian系 安裝防火牆
sudo apt install ufw
配置防火牆sudo ufw allow 22 ufw allow 21114:21119/tcp ufw allow 21116/udp sudo ufw enable- 如果你是RHEL系 安裝防火牆
# 如果你是RHEL系 sudo dnf install firewalld sudo systemctl enable --now firewalld
配置防火牆sudo firewall-cmd --add-port=22/tcp --permanent sudo firewall-cmd --reload sudo firewall-cmd --add-port=21114-21119/tcp --permanent sudo firewall-cmd --reload sudo firewall-cmd --add-port=21116/udp --permanent sudo firewall-cmd --reload sudo systemctl enable --now firewalld
1Panel方式
- 在面板裡搜RustDesk並安裝

- 配置防火牆

添加幾個端口



- 查看KEY

複製KEY

自建服務器後配置RustDesk軟件
- PC端


出現就緒就是配置成功了

- 移動端


注意的問題
如果你是家庭的內網服務器,則需要讓路由器也放行對應端口
找到openwrt防火牆設置,點擊添加



這樣才可以讓你的服務器端口被真正成功放行.
WireGuard
簡介
WireGuard是用於在室外通過VPN來訪問內網設備的一種工具.
這裡我的教程將會教你如何在室外訪問你家裡的內網設備.
我的環境
內網
家庭內網網段:10.0.0.0/24

外部設備
如果你是在辦公室等地方鏈接辦公室的wifi,那麼你需要知道室外内网网段,如果你直接用手機數據流量的話,那麼什麼都不需要知道.
室外內網網段:192.168.31.0/24
室外數據流量運營商:中國聯通
安裝
服務端-軟路由端
SSH登錄OpenWrt,或者用LuCI界面:
opkg update
opkg install wireguard-tools luci-proto-wireguard kmod-wireguard qrencode
裝完刷新一下瀏覽器LuCI頁面.
客戶端-手機,電腦端
https://www.wireguard.com/install/
- Android
https://play.google.com/store/apps/details?id=com.wireguard.android&hl=zh&pli=1
- iOS
美區:https://apps.apple.com/us/app/wireguard/id1441195209 日區:https://apps.apple.com/jp/app/wireguard/id1441195209 臺區:https://apps.apple.com/tw/app/wireguard/id1441195209
- Linux
- Fedora
sudo dnf install wireguard-tools- Ubuntu/Debian
sudo apt install wireguard
配置
服務端-初始化配置
在luci界面中,點擊网络 → 接口 → 添加新接口
- 協議選 WireGuard VPN
- 名稱填 wg0
- 點下一步,進到詳情頁

按照上圖的步驟,依次配置.
這裡解釋一下.
監聽端口:51820(可自定義,使用一個未被佔用的端口即可,記住這個端口,不懂的話就照我的設置)
IP地址:10.10.10.1/24(VPN內網網段,跟你軟路由的局域網段不能衝突,不懂的話就照我的設置)
你必須確保你的家庭内网网段和你的室外内网网段以及剛才填的那個IP地址不能屬於同一網段.
比如我的家庭内网网段是10.0.0.0/24,而室外内网网段是192.168.31.0/24,VPN的網段10.10.10.0/24.
然後點擊防火牆設置,選擇WireGuard.

服務端-對端配置
這裡配置的就是你的手機/筆記本作為客戶端連進來的信息:
這個界面很方便,LuCI可以直接幫你生成客戶端的密鑰對並直接導出配置文件/二維碼,不需要你手動在手機上先生成公鑰再倒騰過來,效率高很多。按下面順序填:
- 描述 phone (或者你自己好記的名字,比如"iPhone17")
- 公鑰 + 私鑰 —— 直接點"生成新的密鑰對" 點這個按鈕,系統會自動幫你同時生成一對新的公鑰+私鑰,並自動填到"公鑰"和"私鑰"兩個框裡。 這個做法比你自己在手機App裡生成再抄公鑰過來省事得多,因為最後可以直接導出完整配置文件甚至二維碼給手機掃碼導入,私鑰也是配置好的,不用手動輸入。
- 預共享密鑰(PSK) —— 建議點"生成預共享密鑰" 這是可選的額外加密層,加上更安全(抗未來量子計算破解),點一下"生成預共享密鑰"按鈕自動填好即可,不需要手動操作。
- 允許的IP 點綠色+號,填: 10.10.10.2/32 這是分配給這臺手機的隧道內網IP(如果以後要加第二臺設備,比如筆記本,就用10.10.10.3/32,以此類推)。
- 為允許的IP創建路由 —— 勾選 這個決定了服務端要不要給這個IP自動建路由,勾上,否則服務端不知道怎麼把去往10.10.10.2的包轉發給這個peer。
- 對端地址 (Image 2) 這個字段填的是客戶端的地址,但因為你的手機是移動設備、IP會變,服務端這邊留空即可,不用填。(這個字段一般是給"兩個固定IP的服務器互聯"場景用的,你這種手機/筆記本客戶端場景不需要)
- 對端端口 同理,留空或者保持默認51820佔位符不用管,服務端這邊這個字段對客戶端場景沒意義,跳過。
- 持續保持連接(Persistent Keepalive) 填: 25 因為手機大概率處在NAT環境下(無論是WiFi還是4G/5G),這個值能防止連接因為長時間無流量被NAT設備判定斷開。
- 保存後 —— 點"生成配置..." 這一步是重點:全部填完先點右下角"保存",保存完之後再進來點 配置導出 那個"生成配置..."按鈕,系統會:
自動生成一份完整的客戶端配置文件(包含私鑰、服務端公鑰、Endpoint地址等全部信息) 通常還會顯示一個二維碼
手機WireGuard App直接掃這個二維碼就能一鍵導入配置,完全不用你手動輸入任何字段,最省事。
- 填完這些保存之後,點"生成配置"

- 連接端點 —— 改成DDNS域名
沒有ddns域名的請看ddns教程.
現在顯示的是
112.233.39.5這個具體的公網IPv4,這是系統自動探測到的當前公網IP,但建議改成:ddns.xxxxxx.cn原因很簡單:家庭寬帶的公網IP大概率是動態的(如果你是中國移動,你完全不需要擔心這件事情,你沒有公網ipv4,你只有公網ipv6),過一陣子運營商重新分配IP後,這個寫死的IP就失效了,配置文件也就廢了。用DDNS域名的話,只要你路由器上的DDNS客戶端正常更新,域名自動跟著IP變化解析,配置文件永久有效,不用來回改。 直接把這個下拉框裡的值改成ddns.tungchiahui.cn即可,如果下拉框裡沒有這個選項,看能不能手動輸入替換。 - 允許的IP —— 這個要看你的使用需求,建議改 現在是 0.0.0.0/0 + ::/0,意思是全局代理模式:連上VPN後,手機/電腦的所有上網流量(刷網頁、看視頻、聊天全部)都會先繞道回你家裡,再從家裡的網絡出去上網。 這跟最初的需求("在外面訪問家裡NAS")不太一致,全局模式的影響:
✅ 優點:所有流量都通過加密隧道,公共WiFi環境下更安全 ❌ 缺點:手機所有網絡流量的速度都取決於你家寬帶的上傳帶寬,如果你家是常見的百兆寬帶(上傳可能才幾十M甚至更低),刷視頻、下載會明顯變慢;而且家裡NAT要承擔所有流量的轉發壓力
如果你只是想訪問家裡內網的NAS/PVE/Debian,建議改成分離隧道模式,把這兩行改成: 10.10.10.0/24 10.0.0.0/24 刪掉 0.0.0.0/0 和 ::/0 這兩行(點它們右邊的紅色×號),只保留上面這兩個網段。這樣只有"訪問家裡內網"這一類流量才走VPN隧道,其他正常上網流量不受影響,速度不受影響。 如果你確實希望VPN也當"全局代理"用(比如出門用境外的WiFi想用家裡的網絡環境訪問某些內容),那就保留 0.0.0.0/0 不用改。- DNS服務器:10.0.0.1 —— 這是你家庭內網的軟路由的LAN地址,連VPN後用它解析域名沒問題,能順帶解析你家內網可能配置的一些本地域名
- 地址:10.10.10.2/32 —— 這個就是你想給你的這個手機分配一個VPN網段
- 連接端點 —— 改成DDNS域名
沒有ddns域名的請看ddns教程.
現在顯示的是

然後掏出手機的客戶端,使用QRcode導入配置即可.

服務端-防火牆設置
需要加的規則 去 網絡 → 防火牆 → 通信規則(Traffic Rules),點"添加":

名稱:WireGuard(隨便起) 協議:UDP 或者 TCP/UDP 源區域:wan 目標區域:設備(輸入) —— 因為WireGuard監聽的是軟路由本機端口,不是轉發給內網其他設備 目標端口:51820(跟你wg0接口"監聽端口"那裡填的一致) 操作:接受(Accept)

保存,應用。
客戶端
拿iOS舉例子
我這裡使用數據流量來測試,使用的是中國聯通4G.
像使用普通的VPN一樣打開你導入的這個配置即可.

測試
然後可以嘗試訪問你的內網設備, 比如我的 openwrt是10.0.0.1, pve是10.0.0.2, nas是10.0.0.5都可以被正常訪問了.



將WireGuard交由Clash Meta管理(可選)
將純WireGuard配置放入Clash Meta
如果手機或電腦上已經長期運行支持Mihomo / Clash Meta內核的客戶端,再單獨啟動WireGuard客戶端會比較麻煩,而且同一臺移動設備通常不能同時啟用兩個VPN隧道。
因此,可以將WireGuard節點直接寫入Clash Meta配置,讓Clash Meta統一負責:
- 普通互聯網流量直連;
- 家庭內網流量通過WireGuard訪問;
- 根據規則自動判斷流量應該走哪個出口。
本節只介紹不包含機場或其他代理節點的純WireGuard配置。
配置完成後,不再需要打開獨立的WireGuard客戶端。使用該配置時,應關閉WireGuard App中的隧道,只打開Clash Meta。
查看WireGuard客戶端參數
先打開已經能夠正常使用的WireGuard客戶端配置,需要記錄以下信息:
| Clash Meta字段 | WireGuard客戶端中的對應字段 |
|---|---|
server | Peer中的Endpoint域名或公網IP |
port | Peer中的Endpoint端口 |
ip | Interface中的Addresses,只填寫IPv4地址,不寫/32 |
private-key | Interface中的Private key |
public-key | Peer中的Public key,也就是WireGuard服務器公鑰 |
pre-shared-key | Peer中的Preshared key |
persistent-keepalive | Peer中的Persistent keepalive |
這裡最容易弄錯的是兩個公鑰:
- Interface中的Public key是當前客戶端的公鑰,不能填入Clash Meta的
public-key; - Peer中的Public key才是WireGuard服務器公鑰,需要填入Clash Meta的
public-key。
這一張圖同時包含Interface和Peer兩部分,已經足夠說明各個字段應該從哪裡獲取,不需要再增加其他截圖。
創建YAML配置
新建一個擴展名為.yaml的文件,例如:
home-wireguard.yaml
寫入下面的模板:
# 仅让家庭内网流量通过WireGuard
# 普通互联网流量保持直连
# 启用本配置时,不要同时开启独立的WireGuard客户端
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: true
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
proxies:
- name: 家庭-WG
type: wireguard
# WireGuard客户端Peer中的Endpoint
server: ddns.example.com
port: 51820
# WireGuard客户端Interface中的Addresses
# 例如原配置为10.10.10.2/32,这里只填写10.10.10.2
ip: 10.10.10.2
# WireGuard客户端Interface中的Private key
private-key: "gBzeTbZH..."
# WireGuard客户端Peer中的Public key,即服务器公钥
# 不要填写Interface中的客户端公钥
public-key: "UUS0nrKE..."
# WireGuard客户端Peer中的Preshared key
pre-shared-key: "NGYvFsCle..."
allowed-ips:
- 0.0.0.0/0
udp: true
persistent-keepalive: 25
mtu: 1380
rules:
# 家庭局域网网段
- IP-CIDR,10.0.0.0/24,家庭-WG,no-resolve
# WireGuard隧道网段
- IP-CIDR,10.10.10.0/24,家庭-WG,no-resolve
# 其他网络流量保持直连
- MATCH,DIRECT
修改模板中的參數
需要按照自己的WireGuard配置修改以下內容。
1. server
將:
server: ddns.example.com
改成WireGuard客戶端Peer中Endpoint冒號前面的域名或公網IP。
例如Endpoint為:
ddns.example.com:51820
那麼填寫:
server: ddns.example.com
2. port
填寫Endpoint冒號後面的端口,例如:
port: 51820
3. ip
填寫WireGuard客戶端Interface中的Addresses,但不要填寫CIDR後綴。
例如原配置是:
10.10.10.2/32
Clash Meta中填寫:
ip: 10.10.10.2
4. private-key
填寫WireGuard客戶端Interface中的Private key:
private-key: "客户端私钥"
5. public-key
填寫WireGuard客戶端Peer中的Public key,也就是服務器公鑰:
public-key: "服务器公钥"
不要誤填Interface中的Public key。Interface中的Public key屬於當前客戶端,Peer中的Public key才屬於服務器。
6. pre-shared-key
填寫WireGuard客戶端Peer中的Preshared key:
pre-shared-key: "预共享密钥"
WireGuard密鑰是Base64字符串,複製時不要漏掉末尾可能存在的=。
7. rules
將規則中的家庭局域網網段和WireGuard隧道網段改成自己的實際網段。
例如:
rules:
- IP-CIDR,10.0.0.0/24,家庭-WG,no-resolve
- IP-CIDR,10.10.10.0/24,家庭-WG,no-resolve
- MATCH,DIRECT
表示:
- 訪問
10.0.0.0/24家庭局域網時走WireGuard; - 訪問
10.10.10.0/24WireGuard隧道網段時走WireGuard; - 其他流量全部直連,不經過家庭寬帶。
關於allowed-ips
模板中的:
allowed-ips:
- 0.0.0.0/0
可以保持不變。
它表示這個WireGuard代理節點能夠承載全部IPv4流量,但實際哪些流量交給WireGuard,仍然由最下面的rules決定。
例如:
rules:
- IP-CIDR,10.0.0.0/24,家庭-WG,no-resolve
- IP-CIDR,10.10.10.0/24,家庭-WG,no-resolve
- MATCH,DIRECT
在這套規則下,只有家庭內網和WireGuard隧道網段走WireGuard,其他互聯網流量繼續直連。
需要注意,WireGuard服務端Peer中的Allowed IPs仍然應該是分配給該客戶端的地址,例如:
10.10.10.2/32
不要把WireGuard服務端Peer中的Allowed IPs改成0.0.0.0/0。
導入並測試
將YAML文件導入支持Mihomo / Clash Meta內核的客戶端,然後:
- 關閉獨立的WireGuard客戶端隧道;
- 在Clash Meta中選擇剛才導入的配置;
- 使用“規則”模式;
- 打開Clash Meta連接開關;
- 訪問家庭內網設備進行測試。
例如訪問軟路由:
http://10.0.0.1
或者在iOS文件App中連接NAS:
smb://10.0.0.5
同時可以進入WireGuard服務端,查看對應Peer的Latest Handshake。
如果開啟Clash Meta後握手時間刷新,並且能夠訪問家庭內網設備,就說明配置成功。
常見問題
如果YAML能夠啟動,但無法產生WireGuard握手,優先檢查:
public-key是否誤填成客戶端公鑰;private-key是否為當前客戶端私鑰;pre-shared-key是否完整,末尾的=是否遺漏;ip是否與服務端分配給該Peer的地址一致;- Endpoint域名和端口是否正確;
- 軟路由防火牆是否已經放行WireGuard端口;
- 獨立WireGuard客戶端是否仍然處於開啟狀態。
如果報錯類似:
decode pre shared key: illegal base64 data
通常說明pre-shared-key複製不完整,常見原因是末尾的=被遺漏。