有人建议我将其从 servervault 移至超级用户,希望这适合此处。
我是一名业余爱好者/修补匠,使用 bhyve(在物理机上运行的 pfSense 中)启动 Linux VM(尝试使用 NixOS 和 Ubuntu Server)。我按照此主题我想我可能遇到了与链接评论相同的问题——具体来说,VM 启动并运行,但我的本地 DNS 解析(未绑定,在 pfSense 主机上运行)不起作用。禁用 pfblockerng 似乎不会改变任何东西。防火墙已禁用,规则已刷新。
根据该线程,我已经设置了一个 TAP 接口、它与 LAN 之间的桥梁以及每个接口上的防火墙规则以允许所有流量(目前)。
从虚拟机中,我可以:
- 通过 DHCP 获取 IP 地址(在 LAN 子网中)
- 通过 IP 地址 ping 内部和外部主机,包括主机 pfSense 机器
192.168.0.2
- 使用 netcat 向内部和外部主机发送和接收 TCP 和 UDP 数据
- 使用解析 DNS外部的解析器(例如
host n8henrie.com 8.8.8.8
或1.1.1.1
或其他)
我在 pfSense 上运行了 unbound,它运行良好,已经运行了一年多,已设置为在所有接口上运行。使用 tcpdump,我可以看未绑定的虚拟机正在以正确的响应响应来自虚拟机的 DNS 请求,但由于某种原因,这些请求似乎没有到达。我录制了一个 pcap 文件(来自 ubuntu 客户机)来检查这些 DNS 响应,看看我是否能找出数据包到达但不起作用的原因。
我没有看到任何相关的被阻止的流量/var/log/filter.log
,所以我认为防火墙规则正在发挥作用。
我watch host -4 -W1 n8henrie.com 192.168.0.2
在虚拟机中运行,它只显示;; connection timed out; no servers could be reached
。同时,我tcpdump -i tap0 -v host 192.168.0.202 and udp
在 pfSense 上运行,我看到了域的适当解析(按预期随时间重复):
[root@pfSense ~]# tcpdump -i tap0 -v host 192.168.0.202 and udp
tcpdump: listening on tap0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:25:34.981350 IP (tos 0x0, ttl 64, id 1081, offset 0, flags [none], proto UDP (17), length 58)
192.168.0.202.45334 > pfSense.home.arpa.domain: 14697+ A? n8henrie.com. (30)
11:25:34.994974 IP (tos 0x0, ttl 64, id 27251, offset 0, flags [none], proto UDP (17), length 90)
pfSense.home.arpa.domain > 192.168.0.202.45334: 14697 2/0/0 n8henrie.com. A 104.21.37.209, n8henrie.com. A 172.67.213.115 (62)
11:25:35.814435 IP (tos 0x0, ttl 64, id 50026, offset 0, flags [none], proto UDP (17), length 58)
我甚至可以看到正在运行的 tcpdump客人显示响应已到达...
root@ubuntu-server:/# tcpdump -vv -i enp0s2 host 192.168.0.2 and udp
11:46:49.569313 IP (tos 0x0, ttl 64, id 34767, offset 0, flags [none], proto UDP (17), length 58)
192.168.0.202.44462 > 192.168.0.2.domain: [udp sum ok] 59526+ A? n8henrie.com. (30)
11:46:49.576273 IP (tos 0x0, ttl 64, id 30262, offset 0, flags [none], proto UDP (17), length 90)
192.168.0.2.domain > 192.168.0.202.44462: [bad udp cksum 0x8274 -> 0x871c!] 59526 q: A? n8henrie.com. 2/0/0 n8henrie.com. A 104.21.37.209, n8henrie.com. A 172.67.213.115 (62)
因此,如果可以看到 DNS 响应在客户端,为什么它们不工作?
这是resolv.conf
来自 NixOS 客户的信息,如果有帮助的话,我也可以发布 ubuntu:
# cat /etc/resolv.conf
domain home.arpa
nameserver 192.168.0.2
options edns0
来自主持人:
[root@pfSense /]# ifconfig tap0
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
description: OPT1
options=80000<LINKSTATE>
ether 58:9c:fc:10:88:32
groups: tap
media: Ethernet autoselect
status: active
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Opened by PID 76444
[root@pfSense /]# ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:33:2d:65:15:00
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 10 priority 128 path cost 2000000
member: igb1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 2 priority 128 path cost 2000000
groups: bridge
nd6 options=1<PERFORMNUD>
我尝试过的其他注意事项/事项:
- 如上所述,防火墙已禁用
- 设置
rp_filter
为 0 不会改变任何内容 ubuntu-22.04.1-live-server-amd64.iso
和上的行为相同nixos-minimal-22.11.1705.b83e7f5a04a-x86_64-linux.iso
- 在客户端的 tcpdump 末尾我看到例如
X packets captured, X packets received by filter, 0 packets dropped by kernel
,所以我猜它们没有被丢弃。
在此先感谢您的任何建议!
答案1
解决问题的关键是注意bad udp cksum
VM 客户机的 tcpdump 输出。搜索后,我找到了几篇指出该问题的帖子,该问题是由于启用了硬件校验和卸载:
- https://security.stackexchange.com/questions/227220/tcpdump-packets-have-bad-and-incorrect-checksums-on-localhost-how-to-investigat
- https://wiki.wireshark.org/CaptureSetup/Offloading#Checksum_Offload
- https://docs.netgate.com/pfsense/en/latest/virtualization/virtio.html
在 pfSense 网络界面中禁用此设置(System
-> Advanced
-> Networking
,选中以禁用Hardware Checksum Offloading
),然后重新启动,之后 pfSense 主机的 DNS 即可正常工作。
我在https://n8henrie.com/2023/03/running-nixos-and-ubuntu-vms-on-pfsense-via-bhyve/