두 LAN 간의 Wireguard 연결과 라우터 뒤의 Wireguard 상자

두 LAN 간의 Wireguard 연결과 라우터 뒤의 Wireguard 상자

두 개의 홈 LAN(100km 간격)이 인터넷 공급자 라우터를 통해 인터넷에 연결되어 있고 두 개의 단일 보드 컴퓨터(NanoPi R2S)를 통해 Wireguard VPN과 연결되기를 원합니다. NanoPi R2S 보드에는 armbian 및 wireguard가 이미 설치되어 있습니다.

인터넷 연결 중 하나에는 고정 및 기타 동적 인터넷 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)의 다른 이더넷 포트를 쉽게 사용하여 처리량을 늘리거나 한 포트를 와이어가드 전용으로, 다른 포트를 LAN 전용으로 사용할 수 있습니까? 어떻게?

장치(휴대폰, 노트북)를 한 사이트에서 다른 사이트로 이동하고 WiFi/DHCP에 연결하면 어떻게 되나요? 사이트 A의 경로가 다른 사이트 B를 망칠 수 있고 그 반대의 경우도 마찬가지이기 때문에 매번 경로를 입력해야 할 수도 있습니다. 라우터 중 하나가 일부 고정 경로를 입력할 수 있다는 것을 알고 있지만 그 경로가 무엇인지 알아내야 합니다.

답변1

해결책은 매우 간단하지만, 사이트 간 VPN을 만드는 방법에 대한 설명을 인터넷에서 찾지 못했습니다. 그래서 저는 저에게 도움이 되는 솔루션을 여기에 게시하기로 결정했습니다.

부인 성명:이 솔루션은 IPv4에서만 작동합니다. 내 ISP 중 하나가 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.conf질문에서 언급했듯이 두 개의 웹 사이트가 있음을 지적하겠습니다.

  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 클라이언트 역할을 하는 두 번째 Wireguard 컴퓨터는 Endpoint이 섹션에서 정의되지만 [Peer]서버 역할을 하는 첫 번째 Wireguard 컴퓨터는 그렇지 않습니다. 엔드포인트는 nanopi 서버에 접근할 수 있는 공인 IP와 포트입니다. 라우터에서 들어오는 연결을 허용하려면 서버 nanopi가 인터넷에 노출되어야 합니다. 서버 Wireguard 컴퓨터가 있는 사이트에서는 인터넷 라우터에 NAT이와 Port forwarding유사한 것이 있어야 합니다. Wireguard가 연결하는 포트에는 UDP가 있어야 하며, Wireguard 서버의 IP와 포트로 전달됩니다. 각 라우터마다 설정을 위한 다른 GUI가 있으므로 여기서는 표시하지 않겠습니다.

라우팅 및 DHCP

이제 wireguard 연결이 작동하면 VPN을 통해 다른 사이트의 nano pi에 액세스할 수 있습니다. 로그인되어 있는 동안 192.168.0.250( 10.0.0.1on ) wg0ping(또는 로그인)이 가능해야 하며 10.0.0.2그 반대의 경우도 마찬가지입니다. 그러나 두 네트워크의 다른 클라이언트는 VPN을 통해 해당 위치에 도달하는 방법을 모릅니다. 로컬 네트워크에 속하지 않는 모든 트래픽을 전달하는 기본 게이트웨이가 있습니다. 다른 사이트의 주소는 로컬 주소가 아니기 때문에 VPN을 거쳐야 하는 모든 트래픽은 ISP 라우터를 거쳐 인터넷으로 이동합니다.

한 가지 접근 방식은 네트워크의 모든 장치에 사용자 지정 정적 경로를 추가하는 것입니다. 어떤 사람들은 이것을 허용하지만 많은 사람들은 그렇지 않습니다. 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가 라우팅 정보를 보내는 옵션을 정의합니다. 하나는 RFC 3442를 따르는 클라이언트용이고 다른 하나는 다른 옵션을 사용하는 Microsoft 클라이언트용입니다. 이 숫자 의 의미 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1는 다음과 같습니다.

  1. 첫 번째 정적 경로:
    • 24- 넷마스크 크기
    • 192, 168, 1- 위에 정의된 넷마스크의 접두사
    • 192, 168, 0, 250- 위에서 정의한 네트워크의 게이트웨이
  2. 두 번째 정적 경로:
    • 0- 넷마스크 크기(기본 게이트웨이)
    • 위의 마스크는 네트워크가 없기 때문에 네트워크가 없습니다.0
    • 192, 168, 0, 1- 위에서 정의한 네트워크의 게이트웨이

기본 경로도 여기에 제공되어야 합니다. 이 정보가 DHCP를 통해 수신되면 클라이언트에서 기본 경로가 무시되어야 하기 때문입니다.

고정 IP 주소를 갖게 될 클라이언트에 대해 DHCP 예약을 만드는 방법에 대한 예제는 dchp 구성 파일 끝에 있습니다. 하드웨어 이더넷(MAC) 주소와 원하는 IP를 입력하세요.

방화벽

이제 한 네트워크의 클라이언트는 방화벽이 트래픽을 허용하는 경우 Wireguard VPN을 통해 다른 네트워크의 클라이언트에 액세스할 수 있습니다.

VPN 컴퓨터(예: nanopi)에 방화벽이 있는 경우 트래픽이 허용되지 않을 수 있습니다. 사용자 환경의 기본 설정과 보안 요구 사항을 기반으로 방화벽 규칙을 개발하세요. 통과해야 하는 VPN 컴퓨터에서 각 개별 포트를 열거나 모든 포트를 열 수 있습니다(신뢰할 수 있는 환경에 있는 경우). 한 가지 방법은 명령을 사용하는 것입니다 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.A, B.B.B.B)

/etc/wireguard/wg12.conf이 스크립트는 두 개의 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

경로는 어떻습니까?

그대로 두 개의 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를 구성 route하고 B2를 핑합니다. 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

관련 정보