iptables는 DNS 조회를 위장하고 파괴합니다.

iptables는 DNS 조회를 위장하고 파괴합니다.

로컬에서 생성된 트래픽에 대해 IP 위장을 사용하여 테스트하고 있는데 DNS 조회가 중단되는 것 같습니다. 다른 모든 것은 잘 작동합니다. DNS 쿼리가 없는 모든 IP 트래픽이 작동합니다.

$ iptables -t mangle -A OUTPUT -j MARK --set-mark 2
$ iptables -t nat -A POSTROUTING -m mark --mark 0x2 -j MASQUERADE

이것이 DNS 쿼리를 제외한 모든 IP 트래픽에 적용되는 이유는 무엇입니까?

요청한 명령의 결과는 다음과 같습니다.

# ip address

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: enp2s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 54:21:c6:28:99:1f brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether c1:b2:a1:55:34:d2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.108/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 242078sec preferred_lft 242078sec
    inet6 fe80::1dd6:f094:be8d:ef51/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# ip route

default via 192.168.1.1 dev wlp3s0 proto dhcp metric 600 
169.254.0.0/16 dev wlp3s0 scope link metric 1000 
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.108 metric 600

놀랍게도 systemd는 127.0.0.53에서 DNS 서버 역할을 합니다.


systemctl status systemd-resolved두 명령을 모두 활성화한 후 "systemd-resolved[3315]: 예상치 못한 IP 범위에서 패킷이 수신되었습니다."라고 보고됩니다.


나는 이 질문이 관련이 있을 것이라고 생각합니다.

이 두 링크의 관련 부분은 다음과 같습니다.

127.0.0.53:53에 대한 모든 쿼리는 127.0.0.0/8에서 발생하는 것이 아니라 매스커레이딩으로 인해 기본 경로가 있는 인터페이스에서 발생하며 systemd-resolved는 이러한 모든 요청을 거부합니다.

systemd-resolved[21366]: 예상치 못한 IP 범위에서 패킷이 수신되어 거부되었습니다.

systemd-resolved스텁 확인자 소스/대상 주소를 확인하려면 추가 노력이 필요하므로 MASQUERADE 규칙은 다음 가정을 깨뜨립니다.

if (in_addr_is_localhost(p->family, &p->sender) <= 0 ||
            in_addr_is_localhost(p->family, &p->destination) <= 0) {
                log_error("Got packet on unexpected IP range, refusing.");
                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
                goto fail;
        }

답변1

이것은 나에게 잘 작동합니다. 로컬 인터페이스를 제외하면 nslookup이 제대로 작동합니다.

sudo iptables ! -o lo -t nat -A POSTROUTING -j MASQUERADE

답변2

나에게 있어 systemd의 구문 분석 동작을 기반으로 한 솔루션은 다음과 같은 규칙을 구현하는 것입니다.

$ iptables -t mangle -A OUTPUT ! -s 127.0.0.1 -j MARK --set-mark 2
$ iptables -t nat -A POSTROUTING -m mark --mark 0x2 -j MASQUERADE

답변3

systemd-resolved를 껐지만 여전히 DNS 확인자 문제가 있어서 귀하의 맹글 솔루션을 사용하여 해결했습니다.

아마도 우리는 방화벽으로 systemd-resolved가 아닌 iptables만 원하기 때문에 대체 답변을 생각해 보겠습니다.

hostname/etc/systemd/resolved.conf.d/00-.conf의 StubListener가 없습니다.

불편한 점은 우리가 방금 systemd를 해결했는데 실행을 중지할 수 없고 iptables에서 방화벽 도메인을 제거할 수 없다는 것입니다.

잠시 동안 우리는 Google 파서를 따르거나 opennic 파서를 사용하여 이를 방지할 수 있는 옵션을 가졌습니다. 가장 빠른 현지 옵션을 알아보려면 이름 은행을 확인하세요.

또는 dnsmasq 또는 오래된 djbdns dnscache를 사용할 수 있습니다. dnsmasq, dnscache 또는 조합을 사용하여 google 및/또는 opennic 또는 기타 모든 기능을 개선할 수 있습니다. 저는 dnsmasq와 namebench-ed opennic plus 127.0.0.53 dnscache를 사용하고 있으므로 www.bigtube.com SERVFAIL에는 3분도 걸리지 않습니다! /etc/resolvconf 및 NetworkManager에 dnsmasq 127.0.0.1이 있습니다. Erwin Hoffmann의 djbns dnscache에는 ipv6이 있는데 개인적으로 신경쓰지 않습니다.

관련 정보