szgislle

szgislle

生命不息,折腾不止!

【NanoPi R2S旁路網關系列】(一)基礎配置、Wireguard

前言#

自己現在家中有一台自己組的 All in One 伺服器,系統是 PVE,在上面跑了個虛擬機 OpenWRT 承擔家裡旁路網關的功能,起初用的國內不知道誰編譯的版本,後面自己編譯了官方 22.05 版本,加上自己想要的功能一直穩定運行了 2 年,但是 All in One 最大的问题就是宿主機重啟,因為最近折騰顯卡直通需要不斷重啟 PVE,這時要是家裡領導在打王者掉線了就有的好受了,所以趁著 618(沒錯 618 到現在才開始切換)下手了一台 R2S,徹底杜絕家裡領導找茬的機會。

需求#

基本是目前虛擬機上 OpenWRT 功能的移植:

  1. Wireguard

能通過 Wireguard 結合家裡的公網 ip 從公司訪問家裡網絡

  1. 自定義域名

通過自定義域名和 Nginx 實現域名訪問自部署的服務,不用記 ip 和端口,不用維護 dashboard 服務

  1. DDNS 服務

自動更新公網 ip,防止每次撥號之後 Wireguard 失聯

  1. KMS 服務

windows 激活

  1. 懂的都懂需求

如題,不做展開

R2S 系統安裝#

下面我們就一步步實現上面的需求,首先是系統的選用,依照官網介紹選擇官方自己維護編譯的 OpenWRT 發行版,對於 Docker 目前是沒有需求的,但為了防止以後有需要的時候還得自己安裝,所以我們直接一步到位,選擇官方基於 OpenWrt 22.03 構建的帶 Docker 的FriendlyWrt 固件

image.png

接下來就是燒錄固件到 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

以上命令生成公私鑰文件分別存儲到privatekeypublickey
配置 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 端

image.png

公網訪問#

目前我的家庭網絡拓撲如下:

image.png

坐標上海,電信光貓撥號,有公網 ip,可以看到虛擬機 openwrt 位於 2 級路由之下,這是要將 openwrt 的端口轉發出去需要二級路由AC-68U轉發一次,再經過光貓轉發一次,較為麻煩,所以在安全的前提下我在電信 app 上面將二級路由 DMZ 出去,開啟二級路由防火牆,再使用二級路由的端口轉發功能將 wireguard 端口轉發出去即可,這樣公網接管了二級路由的所有端口,以後也方便配置各種端口
轉發。

注意千萬別將 openwrt 的 web 端口 80 和 ssh 端口 22 轉發到公網,這樣黑客掃到開盒是早晚的事。

windows 客戶端配置#

windows 使用官方的wireguard 客戶端,新建空隧道:

image.png

會自動生成公私鑰對,然後填寫配置:

[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 客戶端點擊連接:

image.png

流量收發正常即表示連接成功,ping 一下網關測試一下:

image.png

對端連接成功,但是訪問內網192.168.5.0/24網段顯然是不行的,這是因為防火牆將來自 wireguard 的網絡訪問轉發給 lan 接口,下面我們就開始配置防火牆。

防火牆配置#

通過 openwrt Web 端,“網絡” -> “防火牆” -> “NAT 規則”,配置一個地址的 nat,轉發來自192.168.7.0/24網段的流量到 lan 接口,這樣即可實現內網網段的訪問,當然如果需要 wireguard 具備訪問所有網段的能力,將目標地址設為任意即可。

image.png

小結#

本章我們實現了 openwrt 的第一個功能,外網訪問內網即 VPN 的功能,讓我們可以不用擔心各種端口轉發暴露內網風險,實現方便安全的訪問家庭內網的能力,接下來我們繼續實現第二個需求,自定義內網域名。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。