前言#
自己の家には自作の All in One サーバーがあり、システムは PVE で、上で仮想マシン OpenWRT を動かして家庭のバイパスゲートウェイの機能を担っています。最初は国内で誰かがコンパイルしたバージョンを使用していましたが、その後公式の 22.05 バージョンを自分でコンパイルし、自分が必要とする機能を追加して、2 年間安定して運用してきました。しかし、All in One の最大の問題はホストマシンの再起動です。最近、グラフィックカードのパススルーを試みるために PVE を頻繁に再起動する必要があり、もし家のリーダーが王者をプレイ中に切断されたら大変なことになります。そこで 618(そう、618 で今やっと切り替えました)を利用して R2S を購入し、家のリーダーが文句を言う機会を完全に排除しました。
需求#
基本的には現在の仮想マシン上の OpenWRT 機能の移植です:
- Wireguard
Wireguard を使用して、会社から家庭のネットワークにアクセスできるようにする。
- 自定义域名
カスタムドメインと Nginx を使用して、自分でデプロイしたサービスにドメインアクセスを実現し、IP やポートを覚える必要がなく、ダッシュボードサービスを維持する必要がない。
- 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 ファームウェアは Tencent のミラーを使用していますが、仮想マシン openwrt は Tsinghua のミラーを使用しているため、一貫性を保つために以下のように変更します:
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'
ネットワークサービスを再起動します。
/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 のポートを外に転送するために、2 次ルーターAC-68U
で一度転送し、光モデムで再度転送する必要があり、少し面倒です。そこで、安全を考慮して、電信アプリで 2 次ルーターを DMZ にし、2 次ルーターのファイアウォールを有効にし、2 次ルーターのポート転送機能を使用して wireguard のポートを転送すれば良いのです。これにより、パブリックネットワークが 2 次ルーターのすべてのポートを管理し、今後さまざまなポート転送の設定が容易になります。
注意: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: 保持時間を 25 秒に設定します。
配置对端#
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 ルール」で、192.168.7.0/24
ネットワークセグメントからのトラフィックを lan インターフェースに転送する NAT を設定します。これにより、内網セグメントへのアクセスが実現されます。もちろん、wireguard がすべてのネットワークセグメントにアクセスできるようにする場合は、ターゲットアドレスを任意に設定すれば良いです。
小结#
本章では、openwrt の最初の機能、外部から内部ネットワークへのアクセス、つまり VPN 機能を実現しました。これにより、さまざまなポート転送による内部ネットワークのリスクを心配することなく、家庭内ネットワークへの便利で安全なアクセスが可能になります。次に、2 つ目の要求であるカスタム内部ドメイン名の実現を続けます。