DNS 요청을 원격 시스템 해결로 리디렉션하는 방법은 무엇입니까?

DNS 요청을 원격 시스템 해결로 리디렉션하는 방법은 무엇입니까?

원격 DNS 캐싱 서버로 시스템 확인을 시도 중이었습니다(그렇게 할 의도가 없다는 것을 알고 있습니다). 변경된 net.ipv4.conf.br0.route_localnet을 1로 추가하고 다음 nftable 규칙을 추가했습니다.

table ip nat {
    chain prerouting {
        type nat hook prerouting priority 100; policy accept;
        iif "br0" udp dport 53 counter packets 6 bytes 366 dnat to 127.0.0.53
    }

    chain postrouting {
        type nat hook postrouting priority -100; policy accept;
        ip saddr 127.0.0.53 oif "br0" counter packets 0 bytes 0 snat to 192.168.1.2
    }
}

규칙과 일치하는 패킷이 있으므로 사전 라우팅 규칙이 작동하는 것 같습니다. 그런데 호스트에서 패킷이 나오지 않는데 무엇이 문제일까요?

192.168.1.0/24의 DNS 요청을 IP 127.0.0.53을 사용하는 192.168.1.2의 lo 장치에서 호스팅되는 systemd-resolved로 어떻게 리디렉션할 수 있나요?

답변1

systemd-resolved인터페이스 에 바인딩합니다 lo.

# ss -aunp src == 127.0.0.53 sport == 53
State  Recv-Q Send-Q Local Address:Port  Peer Address:Port 
UNCONN 0      0      127.0.0.53%lo:53         0.0.0.0:*     users:(("systemd-resolve",pid=44157,fd=17))

이는 인터페이스에 설정된 경로에 한 번이라도 net.ipv4.conf.br0.route_localnet=1적용 가능한 경로를 제한합니다 lo.

$ ip -4 route show table all dev lo
broadcast 127.0.0.0 table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 table local proto kernel scope link src 127.0.0.1 

일치하는 항목이 없습니다.

원본 주소를 변경해야 합니다. 거의 사용되지 않는 type nat hook input체인 유형을 사용하면 애플리케이션이 소스 주소를 수신하기 전에 소스 주소를 변경할 수 있지만 이미 너무 늦었습니다. 이는 라우팅이 완료되고 패킷이 이미 삭제된 후에 발생합니다. 따라서 상태 저장 NAT는 이 경우를 처리할 수 없습니다.


대신 이를 위해 프록시를 사용할 수 있습니다(모든 특정 NAT 설정을 제거한 후). 다음은 사용 예입니다.socat. socat전용 애플리케이션이 아니기 때문에 특히 UDP에 대한 주의 사항이 있습니다.

  • TCP 처리(OP는 DNS도 TCP를 사용한다는 사실을 잊어버렸습니다)

    socat TCP4-LISTEN:53,bind=192.168.1.2,reuseaddr,fork TCP4:127.0.0.53:53
    

    127.0.0.53:53이 이미 바인딩되어 있으므로 바인딩할 수 없으므로 IN_ADDR_ANYOP가 제공한 주소(잘못된 이유로) 192.168.1.2에 바인딩합니다. 이 외에도 아주 간단합니다.

  • UDP 처리

    socat -T 20 UDP4-LISTEN:53,bind=192.168.1.2,reuseaddr,fork UDP4:127.0.0.53:53
    

    20초 시간 제한이 있는 이유는 socat단일 UDP 패킷 응답을 받은 직후에 중지하라고 말할 수 없고 socat시간이 지남에 따라 분기된 모든 명령이 계속 누적되기 때문입니다.

    이 경우 UDP는 주소에 바인딩할 필요가 없지만 UDP를 사용하여 주소에 바인딩하면 멀티 호밍과 관련된 주의 사항 및IP_PKTINFO소켓 옵션.

관련 정보