前言#
自己現在家中有一台自己組的 All in One 伺服器,系統是 PVE,在上面跑了個虛擬機 OpenWRT 承擔家裡旁路網關的功能,起初用的國內不知道誰編譯的版本,後面自己編譯了官方 22.05 版本,加上自己想要的功能一直穩定運行了 2 年,但是 All in One 最大的问题就是宿主機重啟,因為最近折騰顯卡直通需要不斷重啟 PVE,這時要是家裡領導在打王者掉線了就有的好受了,所以趁著 618(沒錯 618 到現在才開始切換)下手了一台 R2S,徹底杜絕家裡領導找茬的機會。
需求#
基本是目前虛擬機上 OpenWRT 功能的移植:
- Wireguard
能通過 Wireguard 結合家裡的公網 ip 從公司訪問家裡網絡
- 自定義域名
通過自定義域名和 Nginx 實現域名訪問自部署的服務,不用記 ip 和端口,不用維護 dashboard 服務
- DDNS 服務
自動更新公網 ip,防止每次撥號之後 Wireguard 失聯
- KMS 服務
windows 激活
- 懂的都懂需求
如題,不做展開
R2S 系統安裝#
下面我們就一步步實現上面的需求,首先是系統的選用,依照官網介紹選擇官方自己維護編譯的 OpenWRT 發行版,對於 Docker 目前是沒有需求的,但為了防止以後有需要的時候還得自己安裝,所以我們直接一步到位,選擇官方基於 OpenWrt 22.03 構建的帶 Docker 的FriendlyWrt 固件
接下來就是燒錄固件到 TF 卡,插電開機。
系統配置#
插上網線,更改電腦 ip 為192.168.2.100
,系統默認 ip 為192.168.2.1
,配置的客戶機 ip 也要在192.168.2.0/16
網段才能互訪,現在使用 ssh 訪問 openwrt 後台:
ssh root@192.168.2.1
默認密碼為password
首先改個安全密碼
passwd root
修改 ip 地址#
首先修改 ip 使其具有互聯網訪問能力
vi /etc/config/network
找到config interface 'lan'
處,修改如下:
config interface 'lan'
option device 'br-lan'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.5.99'
option gateway '192.168.5.1'
上面掩碼和網關需要依據家裡的網絡環境修改,我的虛擬機 openwrt 目前具有良好的網絡訪問能力,所以網關設置為虛擬機 openwrt 的 ip,還要注意的就是 ip 不能衝突了。
修改 DNS#
vi /etc/config/dhcp
dnsmasq 配置選項下新增list server '192.168.5.1'
dncp 'lan' 配置選項下 option ignore 要改為 1,對應 web 界面的忽略此接口
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
option nonwildcard '1'
option localservice '1'
option ednspacket_max '1232'
option confdir '/tmp/dnsmasq.d'
list server '192.168.5.1'
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv4 'server'
option dhcpv6 'server'
option ra 'server'
list ra_flags 'managed-config'
list ra_flags 'other-config'
option ignore '1'
config dhcp 'wan'
option interface 'wan'
option ignore '1'
config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'
option loglevel '4'
執行命令檢測互聯網訪問能力
curl https://baidu.com
證書報錯
root@FriendlyWrt:~# curl https://baidu.com
curl: (60) Cert verify failed: BADCERT_FUTURE
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.
網絡是聯通了互聯網的,其他機器也能正常上網,查了一下是機器時間有問題:
root@FriendlyWrt:~# date
Fri Jan 22 17:07:48 CST 2016
查看 ntp 服務
root@FriendlyWrt:~# ps | grep ntp
3942 root 2592 S {ntpd} /sbin/ujail -t 5 -n ntpd -U ntp -G ntp -C /etc/capabilities/ntpd.json -c -u -r /bin/ubus -r /usr/bin/env -r /usr/bin/jshn -r /usr/sbin/ntpd-hotplug -r /usr/share/libubox/jshn.s
3954 ntp 1320 S /usr/sbin/ntpd -n -N -S /usr/sbin/ntpd-hotplug -p 0.openwrt.pool.ntp.org -p 1.openwrt.pool.ntp.org -p 2.openwrt.pool.ntp.org -p 3.openwrt.pool.ntp.org
5678 root 1572 S grep ntp
修改 ntp 為阿里 ntp
vi /etc/config/system
config system
option log_size '64'
option urandom_seed '0'
option hostname 'FriendlyWrt'
option ttylogin '1'
option timezone 'CST-8'
option zonename 'Asia/Shanghai'
config timeserver 'ntp'
option enabled '1'
option enable_server '0'
list server 'ntp.aliyun.com'
list server 'ntp1.aliyun.com'
list server 'ntp2.aliyun.com'
list server 'ntp3.aliyun.com'
config led 'led_wan'
option name 'WAN'
option sysfs 'wan_led'
option trigger 'netdev'
option mode 'link tx rx'
option dev 'eth0'
config led 'led_lan'
option name 'LAN'
option sysfs 'lan_led'
option trigger 'netdev'
option mode 'link tx rx'
option dev 'eth1'
重啟服務
/etc/init.d/sysntpd restart
查看時間
root@FriendlyWrt:~# date
Mon Aug 7 14:56:10 CST 2023
查看證書問題是否報錯
root@FriendlyWrt:~# curl https://baidu.com
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>bfe/1.0.8.18</center>
</body>
</html>
正常的 302 重定向
修改源(可選)#
FriendlyWrt 固件使用的是騰訊源,由於虛擬機 openwrt 使用的是清華源,所以保持一致以免軟件包版本衝突:
sed -i -e 's/mirrors.cloud.tencent.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/opkg/distfeeds.conf
更新索引
opkg update
Wireguard#
安裝#
系統配置好之後添加 Wireguard 內核模塊和工具包
opkg install kmod-wireguard wireguard-tools
檢查內核是否加載了 wireguard 模塊
lsmod | grep wireguard
出現如下字樣說明成功加載 wireguard 模塊
root@FriendlyWrt:~# lsmod | grep wireguard
wireguard 77824 0
libchacha20poly1305 16384 1 wireguard
libcurve25519_generic 40960 1 wireguard
udp_tunnel 24576 3 l2tp_core,wireguard,vxlan
ip6_udp_tunnel 16384 3 l2tp_core,wireguard,vxlan
生成公私鑰對
wg genkey | tee privatekey | wg pubkey > publickey
以上命令生成公私鑰文件分別存儲到privatekey
和publickey
中
配置 wireguard 接口
vi /etc/config/network
末尾添加以下內容,大括號裡的內容記得替換
config interface 'wg0'
option proto 'wireguard'
option private_key '{private_key}'
option listen_port '25378'
list addresses '192.168.7.1'
重啟 network 服務
/etc/init.d/network restart
查看 wireguard 狀態
root@FriendlyWrt:~# wg
interface: wg0
public key: fTaGpi1YIlS6RTsWSjsHoWMHY1drWe/CTTOK/EUFTUE=
private key: (hidden)
listening port: 25378
以上步驟也可以在 web 端進行,web 端需要安裝 luci 支持:
opkg install luci-i18n-wireguard-zh-cn
Web 端
公網訪問#
目前我的家庭網絡拓撲如下:
坐標上海,電信光貓撥號,有公網 ip,可以看到虛擬機 openwrt 位於 2 級路由之下,這是要將 openwrt 的端口轉發出去需要二級路由AC-68U
轉發一次,再經過光貓轉發一次,較為麻煩,所以在安全的前提下我在電信 app 上面將二級路由 DMZ 出去,開啟二級路由防火牆,再使用二級路由的端口轉發功能將 wireguard 端口轉發出去即可,這樣公網接管了二級路由的所有端口,以後也方便配置各種端口
轉發。
注意千萬別將 openwrt 的 web 端口 80 和 ssh 端口 22 轉發到公網,這樣黑客掃到開盒是早晚的事。
windows 客戶端配置#
windows 使用官方的wireguard 客戶端,新建空隧道:
會自動生成公私鑰對,然後填寫配置:
[Interface]
PrivateKey = {privatekey}
Address = 192.168.7.2/32
DNS = 192.168.7.1
MTU = 1300
[Peer]
PublicKey = {openwrt_publickey}
AllowedIPs = 192.168.7.0/24,192.168.5.0/24
Endpoint = {公網ip}:{轉發端口}
PersistentKeepalive = 25
- Interface 配置
- PrivateKey: 自動生成的私鑰,不需要修改
- Address: 當前節點的 ip 地址,需要和後面配置的對端地址相同
- DNS: 使用 openwrt 提供的 dns 服務,用到自定義域名的時候有用,在公司也能訪問內網的域名
- MTU: 默認 1500,影響發包的性能,這個需要自己去試,小一點可以提升一點網絡性能,不是太在意的話默認 1500 即可。
- Peer 配置
- PublicKey: 填寫 openwrt 的公鑰
- AllowedIPs: 允許訪問的網段,這裡填寫家裡內網網段即可,如果需要 wireguard 作為所有網段隧道填寫 0.0.0.0/0,需要 openwrt 防火牆配置正確才能訪問互聯網。
- Endpoint: 公網轉發出來的 wireguard 地址和端口
- PersistentKeepalive: 保活時間,設置為 25s
配置對端#
windows 配置完之後還沒完,openwrt 上還要進行相應配置:
vi /etc/config/network
添加如下配置:
config wireguard_wg0
option route_allowed_ips '1'
option persistent_keepalive '25'
option public_key 'VM3DZLzhtpkE0w1VgUmeRSuoX/6mgVMlJWtnynomUXg='
option description 'Worklaptop'
list allowed_ips '192.168.7.2'
重啟網絡服務
/etc/init.d/network restart
windows 客戶端點擊連接:
流量收發正常即表示連接成功,ping 一下網關測試一下:
對端連接成功,但是訪問內網192.168.5.0/24
網段顯然是不行的,這是因為防火牆將來自 wireguard 的網絡訪問轉發給 lan 接口,下面我們就開始配置防火牆。
防火牆配置#
通過 openwrt Web 端,“網絡” -> “防火牆” -> “NAT 規則”,配置一個地址的 nat,轉發來自192.168.7.0/24
網段的流量到 lan 接口,這樣即可實現內網網段的訪問,當然如果需要 wireguard 具備訪問所有網段的能力,將目標地址設為任意即可。
小結#
本章我們實現了 openwrt 的第一個功能,外網訪問內網即 VPN 的功能,讓我們可以不用擔心各種端口轉發暴露內網風險,實現方便安全的訪問家庭內網的能力,接下來我們繼續實現第二個需求,自定義內網域名。