2つのLAN間のWireguard接続とルータの背後にあるWireguardボックス

2つのLAN間のWireguard接続とルータの背後にあるWireguardボックス

2つのホームLAN(100 km間隔)がインターネットプロバイダールーターを介してインターネットに接続され、2つのシングルボードコンピュータ(NanoPi R2S)を介してWireguard VPNに接続したいと思います。 NanoPi R2Sボードにはarmbianとwireguardがすでにインストールされています。

インターネット接続の1つに、固定およびその他の動的インターネットIPがあります。どちらもダイナミック DNS に入力され、ルータのクライアントが正常に動作しないため、nanopis にダイナミック DNS クライアントをインストールできるようになりました。両方のインターネットルーターでNAT仮想サーバー機能を使用してWireguardコンピュータを公開できます。

サイトA:

  • 固定パブリックIP AAAAと名前サイトa
  • LAN 192.168.0.0/24、デフォルトゲートウェイ 192.168.0.1
  • DHCP が予約された NanoPi eth0 192.168.0.250

サイトB:

  • 動的パブリックIP BBBBと名前サイトb
  • LAN 192.168.1.0/24、デフォルトゲートウェイ 192.168.1.1
  • DHCP が予約された NanoPi eth0 192.168.1.250

サイト B が動的 IP サイトからサイト B が公開しているサーバー ポートへの接続を確立すると仮定します。

その後、サイトA(192.168.0.0/24)のすべてのコンピュータに、192.168.0.250を介してサイトB(192.168.1.0/24)にトラフィックを転送する追加のルートが必要です。同様に、サイトB(192.168.1.0/24)のすべてのコンピュータには、サイトA(192.168.0.0/24)トラフィックを192.168.1.250を介して転送するパスが必要です。それはうまくいくでしょうか?

wg0インターフェイスにどのIPを割り当てるべきですか? 10.0.0.0/24?では、パスはどうなりますか?それでは、10.0.0.0/24トラフィックをルーティングする方法は?パスを指定する必要がありますか? Wireguardの設定方法は? Wireguardへの正確なコマンドは必要ないようです。トラフィック(IP、ルーティング)を設定する方法についてのガイドが必要です。

eth0とwg0を使用するNanoPi R2Sでは、双方向トラフィックにはeth0が必要です。 NanoPi(lan0)の他のイーサネットポートを簡単に使用してスループットを上げるか、1つのポートをワイヤガード専用に、もう一方のポートをLAN専用として使用できますか?どのように?

デバイス(携帯電話、ラップトップ)をあるサイトから別のサイトに移動してWiFi / DHCPに接続するとどうなりますか?サイトAのルートは他のサイトBを台無しにすることができ、その逆も同様ですので、毎回ルートを入力する必要があるかもしれません。ルータの1つがいくつかの静的ルートを入力できることを知っていますが、そのルートが何であるかを知る必要があります。

答え1

解決策は非常に簡単ですが、サイト間VPNを作成する方法の説明をインターネットで見つけることができませんでした。だから私は私に役立つ解決策をここに投稿することにしました。

婦人声明:このソリューションはIPv4でのみ機能します。私のISPの1つはIPv6を提供していないので、IPv6を設定していません。これは今後も改善すべき部分です。

IP転送

IP転送を最初に有効にする必要があるため、nanopiはあるインターフェイスから別のインターフェイスにトラフィックを転送します。一行

net.ipv4.ip_forward=1

/etc/sysctl.confまたはの.conf一部のファイルに存在する必要があります/etc/sysctl.d/。変更を適用するには、sysctl -pまたは(Linuxディストリビューションに従って)を実行または再起動します。service procps reload

ワイヤーガード

Wireguardの設定方法については詳しく説明しません。インターネットにはこんな言葉がたくさんあります。私の場合、使用されたネットワークに関するいくつかの詳細を作成し、質問で述べたように、/etc/wireguard/wg0.conf2つのWebサイトがあることを指摘します。

  1. 192.168.0.0/2410.0.0.1nanopiは、インターフェースにwireguardアドレスを持つwireguardサーバーとして機能しますwg0
  2. 192.168.1.0/2410.0.0.2nanopiは、インターフェイスにwireguardアドレスを持つwireguardクライアントとして機能しますwg0

変更は次/etc/wireguard/wg0.confのとおりです。

最初、wg-quickがIPルールとルーティングを設定するのを防ぐディレクティブを追加しました。セクションTable = offに行を追加します。[Interface]

Table = off

第二、VPN接続を介してトラフィックを転送するためのルートを追加します。もう一度[Interface]セクションで:

PostUp = ip route add 192.168.1.0/24 via 10.0.0.2 dev wg0
PreDown = ip route del 192.168.1.0/24 via 10.0.0.2 dev wg0

上記の行は最初のサイトから来て、デバイスを介して他のネットワーク()からのすべてのトラフィックを192.168.1.0/24VPN()の反対側に接続されたIPにルーティングするようにカーネルに指示します。他のサイトでは、構成のIP番号が異なります(、、、および)。10.0.0.2wg0192.168.0.0/2410.0.0.1

第三、Wireguardクライアントとして機能する2番目のWireguardコンピュータはEndpointこのセクションで定義されていますが、[Peer]サーバーとして機能する最初のWireguardコンピュータはそうではありません。エンドポイントは、nanopiサーバーにアクセスできる正規のIPとポートです。ルーターからの着信接続を許可するには、サーバーnanopiをインターネットに公開する必要があります。サーバーWireguardコンピュータを搭載したサイトでは、インターネットルーターにNAT同様Port forwardingのものが必要です。 Wireguardが接続するポートにはUDPが必要です。WireguardサーバーのIPとポートに転送されます。各ルーターごとに設定用の異なるGUIがあるので、ここでは表示しません。

ルーティングとDHCP

wireguard接続が機能すると、VPNを介して他のサイトのnano piにアクセスできるようになります。ログインしている間192.168.0.25010.0.0.1on)wg0ping(またはログイン)が可能でなければならず、10.0.0.2その逆も同様です。しかし、両方のネットワーク上の他のクライアントは、VPNを介してその場所に到達する方法を知りません。ローカルネットワークに属していないすべてのトラフィックを転送するデフォルトゲートウェイがあります。他のサイトのアドレスはローカルアドレスではないため、VPNを通過する必要があるすべてのトラフィックはISPルーターを介してインターネットに移動します。

1つのアプローチは、ネットワーク内のすべてのデバイスにカスタム静的パスを追加することです。一部の人はこれを許可しますが、多くの人はそうではありません。 WindowsまたはLinuxコンピュータはオプションでパスを追加できます。これはAndroidデバイスではすでに問題です。したがって、各デバイスに固定パスを設定する必要がない他のソリューションを見つける必要があります。

ISPルーターにそのルートを追加するオプションがある場合は、カスタムルートを追加できます。ここでは、これを達成する方法を正確に示すことはできません。通常、他のサイトから来るすべてのアドレス(たとえば、192.168.0.0ネットマスクがあるか、または24255.255.255.0リダイレクトする必要があります192.168.1.250)。

これが不可能な場合は、nanopiにDHCPサーバーを設定し、ISPルーターでDHCP機能を無効にすることをお勧めします。isc-dhcp-serverほぼすべてのLinuxディストリビューションにインストールでき、サーバーはDHCPを使用している限り、ネットワーク上のすべてのクライアントに正しいルーティング情報を送信できます。 DHCP サーバーの構成については詳しく説明しません。例は次のとおりです/etc/dhcp/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name "localdomain";
option domain-name-servers 192.168.0.250;

option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

option rfc3442-classless-static-routes 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1;
option ms-classless-static-routes 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1;

subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.150 192.168.0.229;

    default-lease-time 86400;
    max-lease-time 172800;
}

host staticip {
    default-lease-time 86400;
    max-lease-time 172800;

    hardware ethernet aa:bb:cc:dd:ee:ff;
    fixed-address 192.168.0.4;
}

dhcp設定のすべてはかなり標準的です。 DHCPは192.168.0.150からアドレスを割り当てています192.168.0.229。必要に応じて変更してください。

私はこの行を指摘する必要がありoption rfc3442...ますoption ms-classless...。 DHCP がルーティング情報を送信するオプションを定義します。 1つはRFC 3442に準拠したクライアント用、もう1つは別のオプションを使用するMicrosoftクライアント用です。この数字の意味24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1は次のとおりです。

  1. 最初の静的パス:
    • 24- ネットマスクサイズ
    • 192, 168, 1- 上記で定義されたネットマスクの接頭辞
    • 192, 168, 0, 250- 上記で定義したネットワークのゲートウェイ
  2. 2番目の静的パス:
    • 0- ネットマスクサイズ(デフォルトゲートウェイ)
    • 上記のマスクはネットワークがないため、ネットワークはありません。0
    • 192, 168, 0, 1- 上記で定義したネットワークのゲートウェイ

デフォルトパスもここに提供する必要があります。この情報がDHCPを介して受信されると、クライアントはデフォルトのパスを無視する必要があるためです。

固定 IP アドレスを持つクライアントに対して DHCP 予約を作成する方法の例は、dchp 構成ファイルの最後にあります。ハードウェアイーサネット(MAC)アドレスと目的のIPを入力してください。

ファイアウォール

あるネットワーク上のクライアントは、ファイアウォールがトラフィックを許可している場合、Wireguard VPNを介して別のネットワーク上のクライアントにアクセスできるようになりました。

VPNコンピュータ(nanopiなど)にファイアウォールがある場合、トラフィックは許可されない可能性があります。ご使用の環境の基本設定とセキュリティ要件に基づいてファイアウォールルールを開発します。通過する必要があるVPNコンピュータで各個々のポートを開くか、すべてのポートを開くことができます(信頼できる環境にある場合)。 1つの方法はコマンドを使用することですfirewall-cmd。例は次のとおりです。

# set "trusted" as a default zone
firewall-cmd --set-default-zone=trusted

# see in which zones the interfaces are
firewall-cmd --get-active-zones

# you may have to remove eth0 from the zone where it belongs to (public in this case)
firewall-cmd --permanent --zone=public --remove-interface=eth0
# add eth0 to trusted zone
firewall-cmd --permanent --zone=trusted --add-interface=eth0

# you may have to remove wg0 from the zone where it belongs to (public in this case)
firewall-cmd --permanent --zone=public --remove-interface=wg0
# add wg0 to trusted zone
firewall-cmd --permanent --zone=trusted --add-interface=wg0

# reload the new config
firewall-cmd --reload

その後、各デバイスには着信トラフィックをブロックするファイアウォールがあります。通常、Windowsファイアウォールは「ローカルネットワーク」の特定の接続のみを許可します。他のサイトはローカルネットワークにないため、サーバーはVPNを介して着信接続をブロックします。192.168.1.0/24特定の接続をブロックする各ルールに異なるネットワーク(たとえば)を追加する必要があります。たとえば、Windows共有の場合は、コンピュータ共有のポート135-139と445のすべてのリスニングルールを変更する必要があります。同様に、共有にアクセスするコンピュータから発信するルールを変更する必要があります。

ファイアウォールをオフにするよりも時間をかけてファイアウォールを微調整することをお勧めします。

ガイドラインがサイト間VPNを設定するのに十分明確で有用であるか、少なくとも設定方法に関するアイデアを提供したことを願っています。ネットワーキングと管理の知識が必要です。

答え2

長すぎます。作成を支援するスクリプトを作成しました。ラインバッカープラスsystemd構成。

Wireguard構成ジェネレータ

私のスクリプトを使用して、Wireguardサイトとクライアント構成を作成してみることができます。jtmoon79/wireguard-site-to-site.sh。これWireguardサイト間ジェネレータsystemctlLinuxシステムの調整やサービスコマンドなど、必要な設定とコマンドを正確に生成する必要があります。このsystemctlコマンドは、systemdWireguard インターフェイスとルーティングをサービスとして制御するようにデーモンを設定します。

使用法メッセージから:

Generate Wireguard IPv4 VPN site-to-site configuration files and commands.
The user is expected to selectively copy+paste+run the highlighted output.

Usage:

    wireguard-site-to-site.sh OFFSET FQDN_SITE1 SITE1_NET SITE1_DNS FQDN_SITE2 SITE2_NET

For example:

    wireguard-site-to-site.sh 34 "my-site1.this-domain.org" 192.168.1.0/24 192.168.1.1 "my-site2.that-domain.org" 192.168.2.0/24

あなたの場合は、次のコマンドを実行します。

./wireguard-site-to-site.sh 12 A.A.A.A 192.168.0.0/24 192.168.0.1 B.B.B.B 192.168.1.0/24

12任意、代替A.A.A.AB.B.B.B

/etc/wireguard/wg12.confこのスクリプトは、2つのWireguardエンドポイントの例を出力します。それは次のとおりです。

# /etc/wireguard/wg12.conf
#
# site-to-site tunnel for
# endpoint A.A.A.A:51012 (Wireguard server) (you are here)
# endpoint B.B.B.B:51012 (Wireguard client)
#
# Manually generated by wireguard-site-to-site.sh on Wed 02 Nov 2022 07:57:55 PM PDT

[Interface]
Address = 10.12.12.1/24
ListenPort = 51012
MTU = 1420
PrivateKey = iMHb+YRCT/3iCIeEIWoGsNje7oMzlBI3akApxm4r718=

PreUp = set -x; sysctl -w net.ipv4.ip_forward=1; ([[ -e /sys/kernel/debug/dynamic_debug/control ]] && (modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control)) || true

PostUp = set -x; iptables -v -t nat -I POSTROUTING 1 -o eth0 -j MASQUERADE -m comment --comment 'wireguard-a-wg12' && iptables -v -I INPUT 1 -i %i -j ACCEPT -m comment --comment 'wireguard-b-wg12' && iptables -v -I FORWARD 1 -i eth0 -o wg12 -j ACCEPT -m comment --comment 'wireguard-c-wg12' && iptables -v -I FORWARD 1 -i %i -o eth0 -j ACCEPT -m comment --comment 'wireguard-d-wg12' && iptables -v -I INPUT 1 -i eth0 -p udp --dport 51012 -j ACCEPT -m comment --comment 'wireguard-e-wg12'

PostDown = set -x; iptables -v -t nat -D POSTROUTING -o eth0 -j MASQUERADE -m comment --comment 'wireguard-a-wg12' && iptables -v -D INPUT -i %i -j ACCEPT -m comment --comment 'wireguard-b-wg12' && iptables -v -D FORWARD -i eth0 -o wg12 -j ACCEPT -m comment --comment 'wireguard-c-wg12' && iptables -v -D FORWARD -i %i -o eth0 -j ACCEPT -m comment --comment 'wireguard-d-wg12' && iptables -v -D INPUT -i eth0 -p udp --dport 51012 -j ACCEPT -m comment --comment 'wireguard-e-wg12'

# B (site 2 client)
[Peer]
PublicKey = yOkGU/rjUZgwViFbhlmEXdAvQvnoZvsCc77ZwZ/7fAo=
PresharedKey = vCHGe3nr2WkD/SVP0H5XhA64F4jzACZ+aJhZmv2QBkE=
AllowedIPs = 10.12.12.0/24
# this network is implied
#AllowedIPs = 192.168.0.0/24
AllowedIPs = 192.168.1.0/24
# unsetting Endpoint treats the peer as a client (and this host as a server)
#Endpoint = B.B.B.B:51012
PersistentKeepalive = 59

# test connection:
#     ping 10.12.12.2

# This WireGuard configuration should create 5 iptables rules.
# To list the rules by line number:
#    iptables --list --line-numbers
#    iptables --list --table nat --line-numbers
# In case of duplicate or bad rules, delete each rule individually. For example:
#    iptables --delete FORWARD 10
#    iptables --delete --table nat POSTROUTING 10
# Rules added by this configuration are denoted by the comment sequence "wireguard".

スクリプトはsystemctl次のコマンドも提供します。

systemctl enable [email protected]
systemctl daemon-reload
systemctl start wg-quick@wg12
systemctl status wg-quick@wg12

ルートはどうですか?

そのまま2つのWireguardホストはお互いを知ります。しかし、他のコンピュータは、アクセス可能な他のネットワークがあることを知らない。

したがって、サイトA(A2と呼ばれる)のコンピュータがサイトB(B2と呼ばれる)のコンピュータに接続するには、コンピュータA2にルーティングが必要です。

  • ネットワーク 192.168.1.0/24
  • ゲートウェイ 192.168.0.250

A2がB2にアクセスしようとすると(たとえば)、192.168.1.3A2はこれらのIPパケットを近くのWireguardサーバー(たとえば)に送信します192.168.0.250。サーバーはWireguardトンネルを介してパケットを送信します。これにより、ピアWireguardサーバーがB2に転送されます192.168.1.3

routeA2は適切なコマンドを使用して手動で設定できます。まず、これを行うことをお勧めします。コマンドを使用してA2を設定し、routeB2をpingします。 IIRCのroute場合、A2に応答パケットを送信する場所を知るようにB2でも設定する必要があります。

A2 手動設定が有効な場合は、集中設定を行ってください。ほとんどの場合、パス情報は中央サーバーからプッシュされます。この IP ルートを「プッシュ」する方法はいくつかあります。ほとんどの場合、ルーティング情報はネットワーク上のDHCPサーバーからプッシュされます。

DHCPサーバーisc-dhcp-server

ユーザーの回答@nobodyisc-dhcp-serverDHCPサーバーを最初から設定する方法を説明しました。

DHCPサーバーDNSMasq

DNSMasqDHCPサーバーを使用している場合は、この構成ステートメントを追加すると機能する可能性があります。サイトAの説明は次のとおりです。

# add route to Site B network 192.168.1.0/24 via Site A wireguard server gateway at 192.168.0.250
# due to odd DNSMasq DHCP behavior, must also distribute the default route 0.0.0.0 (presuming gateway 192.168.0.1) (https://ral-arturo.org/2018/09/12/dhcp-static-route.html)
dhcp-option=121,192.168.1.0/24,192.168.0.250,0.0.0.0/0,192.168.0.1

Bステーションの声明は次のとおりです。

# add route to Site A network 192.168.0.0/24 via Site B wireguard server gateway at 192.168.1.250
# due to odd DNSMasq DHCP behavior, must also distribute the default route 0.0.0.0 (presuming gateway 192.168.1.1) (https://ral-arturo.org/2018/09/12/dhcp-static-route.html)
dhcp-option=121,192.168.0.0/24,192.168.1.250,0.0.0.0/0,192.168.1.1

関連情報