![Wireguard - LAN 컴퓨터는 ping할 수 없지만(대상 호스트에 연결할 수 없음) DNS 트래픽은 LAN PiHole/Unbound에 도달합니다.](https://linux55.com/image/227643/Wireguard%20-%20LAN%20%EC%BB%B4%ED%93%A8%ED%84%B0%EB%8A%94%20ping%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%A7%80%EB%A7%8C(%EB%8C%80%EC%83%81%20%ED%98%B8%EC%8A%A4%ED%8A%B8%EC%97%90%20%EC%97%B0%EA%B2%B0%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%9D%8C)%20DNS%20%ED%8A%B8%EB%9E%98%ED%94%BD%EC%9D%80%20LAN%20PiHole%2FUnbound%EC%97%90%20%EB%8F%84%EB%8B%AC%ED%95%A9%EB%8B%88%EB%8B%A4..png)
요약:
LAN 주소 확인은 일부 Wireguard 클라이언트(내 Android 휴대폰)에서는 작동하지만 다른 클라이언트(내 Linux 노트북)에서는 작동하지 않습니다.
세부 사항:
저는 홈 네트워크에 있는 두 개의 다른 Pi(기본 Raspberry Pi와 장애 조치 - 다른 포트에서 실행)에서 wireguard를 실행하고 있습니다.
PiVPN을 사용하여 두 개의 클라이언트를 설정했습니다. PiVPN의 옵션을 사용하면 휴대폰 연결이 거의 자동으로 이루어졌습니다 -qr
(DNS를 PiHole로 변경하기만 하면 되었습니다). 표면적으로는 제가 .conf
파일에서 몇 가지 기본적인 실수를 저지른 것이 아니라 단지 눈이 먼 것 같습니다.
각 Wireguard 서버에는 두 개의 클라이언트가 있습니다.
- 내 안드로이드 전화
- 내 Microsoft Surface 노트북/태블릿(Surface-Linux 커널 프로젝트에 대한 고개를 끄덕이는 Pop-OS 22.04를 실행 중입니다).
Pi 중 하나가 DNS용 PiHole/Unbound 콤보도 실행하고 있기 때문에 저는 모든 Android 휴대폰의 트래픽을 Wireguard 24/7을 통해 퍼널링합니다. 나 외에 다른 사람에게 기술 지원을 제공하지 않으려면 내 컴퓨터를 ISP 라우터에 설정하는 대신 로컬 DNS 서버에 연결하기만 하면 됩니다.
내 LAN:
ISP 라우터
- Pi의 고정 IP는 예약되어 있습니다.
- 51820 및 51821의 포트 전달
소년가족연구소
- Wireguard(포트 51821)
구스하우스 연구실
- 피호르
- 구속되지 않음
- Wireguard(포트 51820)
wg0.conf - 표면:
[Interface]
PrivateKey = (redacted)
Address = 10.140.235.3/24,fd11:5ee:bad:c0de::3/64
DNS = 192.168.1.92 # My LAN PiHole's IP
[Peer]
PublicKey = <public key>
PresharedKey = (redacted)
Endpoint = my.personal.ddns.net:51820
AllowedIPs = 0.0.0.0/0, ::0/0
해설자: 변경을 시도했지만
AllowedIPs = 0.0.0.0/0, ::0/0
소용AllowedIPs = 192.168.1.0/24
이 없었습니다.
wg0.conf - 서버:
안타깝게도 제가 집에 없고 다양한 컴퓨터의 SSH 키가 내 휴대폰(터치 스크린에서 터미널 작업을 수행하는 방법이기도 함)이 아닌 내 Surface에 있기 때문에 현재로서는 이것은 자리 표시자일 뿐입니다. .
내 Surface를 전화에 테더링하고 SSH 연결을 얻기 위해 LAN으로 트래픽을 전달하려고 시도했지만 어떤 이유에서인지 연결된 트래픽이 Wireguard 인터페이스로 전달되지 않는 것 같습니다.
질문
내 휴대폰은 LAN에 있는 컴퓨터의 IP를 확인할 수 있지만 내 Surface 태블릿은 확인할 수 없습니다.
하지만tcpdump
내 Surface는 LAN IP를 통해 설정한 와이어가드를 통해 DNS 트래픽을 파이홀로 전달할 수 있습니다 (PiHole 관리 콘솔 및 dnsleaktest.org에서 확인). wg0.conf
DNS 트래픽이 내 LAN의 PiHole을 통과하지만 장치에 ping을 보낼 수 없다는 사실은 매우 혼란스럽습니다.
다음과 같이 LAN에 있는 모든 컴퓨터에 표면적으로 ping을 실행해 보세요.
stenolepis@pop-os:~$ ping 192.168.1.92
PING 192.168.1.92 (192.168.1.92) 56(84) bytes of data.
From 192.168.1.89 icmp_seq=1 Destination Host Unreachable
From 192.168.1.89 icmp_seq=2 Destination Host Unreachable
From 192.168.1.89 icmp_seq=3 Destination Host Unreachable
브라우저를 통해 LAN에서 실행되는 서비스에 연결하려고 하면 다음과 같은 메시지가 나타납니다. browser_unable_to_connect
이것은 다음과 매우 유사해 보입니다.Ubuntu Wireguard 문제 해결 문서에 언급된 "대상 주소 필요"나는 단지 이해하지 못한다는 것뿐이다 ping: sendmsg: Destination address required
.
내가 실행하면 라우팅 문제라고 생각합니다.
stenolepis@pop-os:~$ sudo ip route get 192.168.1.92
192.168.1.92 dev wlp1s0 src 192.168.1.89 uid 0
cache
Wireguard 인터페이스로 라우팅되지 않는 것 같은데 이유를 모르겠습니다.
분명히 내가 사용 중인 네트워크와 내 홈 LAN(둘 다 192.168.1.x 사용) 사이에 서브넷 충돌이 있지만, 내 모든 트래픽을 수신하도록 wireguard가 설정된 경우 이것이 왜 문제가 될지 모르겠습니다. 물론 내 휴대폰에도 영향을 미치지 않습니다.
아니면 내 네트워크 디버깅 기술이 제한되어 있기 때문에 농담하는 것입니다.
추가 문제 해결:
ip a
wg0의 결과:
stenolepis@pop-os:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:a2:c4:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 28:16:a8:51:52:82 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.70/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp1s0
valid_lft 84617sec preferred_lft 84617sec
inet6 2001:569:70d6:d700:568c:4fcf:4983:1bd5/64 scope global temporary dynamic
valid_lft 14682sec preferred_lft 14382sec
inet6 2001:569:70d6:d700:ecfe:8f0d:350f:414e/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 14682sec preferred_lft 14382sec
inet6 fe80::6bd3:60c3:353b:c5d0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
14: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.140.235.3/24 scope global wg0
valid_lft forever preferred_lft forever
inet6 fd11:5ee:bad:c0de::3/64 scope global
valid_lft forever preferred_lft forever
답변1
핵심 질문은 다음과 같습니다.
현재 사용 중인 네트워크와 홈 LAN(둘 다 192.168.1.x 사용) 사이에 서브넷 충돌이 있습니다.
Android와 같은 일부 플랫폼에서 WireGuard 클라이언트는 모든 호스트의 경로를 자동으로 재정의하여 모든 것(자체 암호화된 패킷 제외)을 WireGuard 인터페이스로 라우팅합니다 및/또는AllowedIPs
(예:0.0.0.0/0
::/0
하지만 Linux에서는 WireGuard 클라이언트 스크립트가빠른 작업 그룹AllowedIPs
Everything으로 설정하면 호스트의 기본 경로를 제외한 모든 경로를 재정의하지 않도록 최선을 다합니다.
ip route show table main
WireGuard 인터페이스가 켜져 있는 가정용 LAN이 아닌 Pop!_OS 태블릿에서 실행 중인 경우 다음과 같은 내용이 표시됩니다.
$ ip route show table main
default via 192.168.1.1 dev wlp1s0 proto dhcp src 192.168.1.70 metric 100
10.140.235.3/24 dev wg0 scope link
169.254.0.0/16 dev wlp1s0 scope link metric 1000
192.168.1.0/24 dev wlp1s0 proto kernel scope link src 192.168.1.70 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
기본 라우팅 테이블에 나열된 모든 경로(기본 경로 제외)는 wg-quick 스크립트에 의해 설정된 기본 경로보다 우선적으로 사용됩니다. 따라서 192.168.1.0/24
네트워크의 호스트(예: Pi) 에 연결하려고 하면 연결은 WireGuard 인터페이스가 아닌 인터페이스에서 현재 사용 중인 LAN의 게이트웨이로 192.168.1.92
라우팅됩니다 .wlp1s0
wg-quick 스크립트는 사용자 정의 경로 테이블에 새로운 기본 경로를 설정합니다 51820
.
$ ip route show table 51820
default dev wg0 scope link
wg-quick 스크립트는 이 사용자 정의 라우팅 테이블이 사용되는 시기를 정의하기 위해 몇 가지 정책 라우팅 규칙을 설정합니다 51820
. 이를 사용하여 기본 테이블의 기본 라우팅을 재정의합니다.
$ ip rule list
0: from all lookup local
32764: from all lookup main suppress_prefixlength 0
32765: not from all fwmark 0xca6c lookup 51820
32766: from all lookup main
32767: from all lookup default
기본 경로뿐만 아니라 기본 라우팅 테이블의 모든 경로를 포괄하려면 wg0
인터페이스가 표시될 때 다른 정책 라우팅 규칙을 추가해야 합니다.
$ sudo ip rule add not fwmark 51820 table 51820 priority 123
51820
이 규칙은 패킷 태그가 51820
( 0xca6c
16진수) 로 설정되지 않은 한 모든 것에 대해 사용자 정의 테이블을 사용하도록 시스템에 지시합니다 . WireGuard는 전송하는 모든 암호화된 패킷에 이 패킷 표시를 설정합니다. 이러한 패킷은 LAN 게이트웨이로 전송되어 인터넷으로 전달되기 위해 기본 라우팅 테이블을 사용해야 합니다.
wg0
다음 PreUp/PostDown 스크립트를 파일 섹션에 추가하면 [Interface]
인터페이스를 시작하고 닫을 때 wg-quick 스크립트가 이 규칙을 자동으로 추가하고 제거하도록 할 수 있습니다.wg0.conf
PreUp = ip rule add not fwmark 51820 table 51820 priority 123
PostDown = ip rule del not fwmark 51820 table 51820 priority 123