특정 포트에 대한 인터페이스로 라우팅하는 호스트로의 경로가 없습니다.

특정 포트에 대한 인터페이스로 라우팅하는 호스트로의 경로가 없습니다.

다른 서버 B에 VPN이 구성된 서버 A가 있습니다. 현재 서버 A는 VPN 주소를 사용하여 서버 B를 핑할 수 있습니다 10.12.0.1.

모든 HTTPS 트래픽을 서버 B를 통해 라우팅하고 다른 트래픽이 기본 인터페이스를 사용하도록 하고 싶습니다.

그러기 위해 저는 다음에서 영감을 얻었습니다.이 유닉스 스택 교환 답변다음 명령을 실행했습니다.

# define route
echo "200 myroute" >> /etc/iproute2/rt_tables
# seems necessary
sysctl -w net.ipv4.conf.wg1.rp_filter=2
# actual routing
ip route add table 200 10.12.0.0/24 dev wg1 src 10.12.0.10
ip route add table 200 default via 10.12.0.1
# actual rule telling HTTPS traffic to use table 200
ip rule add iif lo ipproto tcp dport 443 lookup 200

curl https://1.1.1.1그런 다음 (또는 다른 호스트를) 실행하면 오류가 발생합니다 Failed to connect to 1.1.1.1 port 443: No route to host. 규칙을 제거하면 모든 것이 다시 작동합니다.

테이블 200에 대한 라우팅이 올바르지 않은 것 같지만 원래 답변의 라우팅과 기본 인터페이스의 라우팅이 일치하는 것 같습니다.

문제를 조사하고 디버깅할 수 있는 방법을 알고 계십니까?

감사합니다


추가 정보:

$ ip route show table 200
default via 10.12.0.1 dev wg1 
10.12.0.0/24 dev wg1 scope link src 10.12.0.10 
$ ip route show dev wg1
10.12.0.0/24 proto kernel scope link src 10.12.0.10
$ ip route get 1.1.1.1 ipproto tcp dport 443
1.1.1.1 via 10.12.0.1 dev wg1 table 200 src 10.12.0.10 uid 1001 
    cache 
$ ip route
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.51 metric 202
10.12.0.0/24 dev wg1 proto kernel scope link src 10.12.0.10 
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.51 metric 202 

VPN은 Wireguard VPN입니다. VPN을 통해 모든 트래픽을 라우팅하도록 구성하면 모든 것이 작동합니다.

답변1

1.1.1.1"호스트에 대한 경로 없음" 오류는 WireGuard 설정에 포함되지 않은 호스트( )에 연결을 시도했기 때문에 발생할 수 있습니다 AllowedIPs. wg-quick을 사용한다고 가정하면 다음을 수행하십시오.

처럼1 단계, 서버 A의 WireGuard 구성에서 연결하려는 IP 주소(또는 IP 주소 블록)를 포함하도록 서버 B에 대한 섹션 AllowedIPs의 설정을 조정합니다.[Peer]

대신에 1.1.1.1서버 A에서 블록의 모든 HTTPS 서버에 연결할 수 있기를 원한다고 가정해 보겠습니다 192.0.2.0/24(특히 192.0.2.123테스트 중인 서버가 있었습니다). 또한 블록을 AllowedIPs포함하도록 서버 B에 대한 서버 A의 설정을 처음에 설정했다고 가정해 보겠습니다 10.12.0.0/24. 이 설정을 다음으로 변경합니다.

AllowedIPs = 10.12.0.0/24, 192.0.2.0/24

서버 A의 테이블 200에 대해 이전에 설정한 경로와 규칙을 제거하고 WireGuard를 다시 시작한 후(예: sudo wg-quick down wg1; sudo wg-quick up wg1) 다음을 실행하여 이 변경 사항을 테스트합니다.

$ curl -k https://192.0.2.123

그러면 최소한 "호스트에 대한 경로 없음" 오류가 발생하지 않게 됩니다. 그래도 오류가 계속 발생한다면 서버 B의 방화벽/라우팅 규칙을 조정하여 서버 A에서 으로 패킷을 전달할 수 있도록 해야 할 것입니다 192.0.2.0/24.

처럼2 단계[Interface], 서버 A의 WireGuard 구성 섹션 에서 다음 설정을 추가합니다.

Table = 200

200이렇게 하면 wg-quick이 자동으로 생성한 경로를 기본 테이블 대신 사용자 지정 라우팅 테이블에 추가하도록 지시합니다 . WireGuard를 다시 시작하고 라우팅 테이블을 확인하세요.

$ ip route
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.51 metric 202
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.51 metric 202
$ ip route show table 200
10.12.0.0/24 dev wg1 scope link
192.0.2.0/24 dev wg1 scope link

이제 특별한 HTTPS 정책 규칙을 추가하세요.

$ sudo ip rule add iif lo ipproto tcp dport 443 lookup 200

그리고 테스트해보세요:

$ curl -k https://192.0.2.123

처럼3단계, HTTPS 이외의 서비스(예: SSH 등)에 대해 WireGuard를 통해 서버 A에서 서버 B로 직접 연결할 수 있다고 가정하고 블록에 대한 모든 연결에 대해 서버 A에 다른 정책 규칙을 추가합니다 10.12.0.0/24.

$ sudo ip rule add to 10.12.0.0/24 table 200 priority 201

이제 WireGuard를 사용하여 서버 A에서 서버 B로 다시 연결할 수 있습니다.

$ ssh 10.12.0.1

관련 정보