Freebsd

對 localhost 的 DNS 查找會導致網路錯誤

  • February 7, 2016

我在 FreeBSD 的監獄中以 pf 作為防火牆在 Unbound 上執行遞歸 DNS 伺服器。在我的本地機器上執行drill @xxx.xxx.xxx.xxx example.com(其中 xxx.xxx.xxx.xxx 是伺服器 IP)可以讓我成功查找。

但是,如果我在伺服器本身上嘗試相同的操作,無論是在監獄還是主機中……

# drill @localhost example.com
Error: error sending query: Could not send or receive, because of network error
# drill @xxx.xxx.xxx.xxx example.com
Error: error sending query: Could not send or receive, because of network error
# drill @127.0.0.1 example.com
Error: error sending query: Could not send or receive, because of network error
# drill @10.0.0.1 example.com
Error: error sending query: Could not send or receive, because of network error

pass quick on lo0 all在我的 pf.conf

這是我的相關ifconfig:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
   options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
   inet6 ::1 prefixlen 128
   inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
   inet 127.0.0.1 netmask 0xff000000
   nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
   options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
   inet 10.0.0.1 netmask 0xffffff00
   nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

DNS 監獄在 10.0.0.1 下執行

我的一些想法: Unbound 的配置肯定是正確的。介面已經是 0.0.0.0 並且我有 10.0.0.0/16 和 127.0.0.0/8 的訪問控制規則(當然還有我本地機器的 IP)。此外,如果有任何問題,嘗試鑽孔會產生簡單的“拒絕”。所以我認為這與pf有關?我可能遺漏了一些小而明顯的東西,但我不知道是什麼。

我想要實現的是# drill @localhost example.com在伺服器上成功,所以我可以用 127.0.0.1 替換我的 resolv.conf 名稱伺服器

**編輯:**我已經用 netcat 做了一些測試,這樣做# nc -4 -vv localhost 53給了我一個超時。然而,使用 udp 作為協議# nc -4 -w 10 -vv -u localhost 53卻沒有。執行# pfctl -vnf /etc/pf.conf,這是到監獄的兩個重定向:

rdr pass on vtnet0 inet proto udp from any to any port = domain -> 10.0.0.1 port 53
rdr pass on vtnet0 inet proto tcp from any to any port = domain -> 10.0.0.1 port 53

在對 pf 規則進行了更多測試後,我短暫地讓所有流量通過並意識到錯誤是當我pass quick on lo0 all在 pf.conf 中時,監獄在 lo1 下執行。

我添加了pass quick on lo1 all,它現在可以工作了。

另請注意,在監獄中,您應該查詢監獄 IP 而不是 localhost。所以,在監獄 resolv.conf 中:

nameserver 10.0.0.1

引用自:https://serverfault.com/questions/754547