我有一台 Oculus Quest,我希望只有 Oculus 能够看到我的 miniDLNA 服务器。因此,在服务器本身上,我有以下配置:
我给出的 Mac 地址 100% 正确,并且禁用 nft 后一切正常。
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
# Allow established and related connections
ct state established,related accept
# Allow loopback interface
iif lo accept
# Allow SSH connections on port 22222
tcp dport 22222 accept
# Allow ICMP (ping) from LAN IP range (192.168.1.x)
ip protocol icmp icmp type echo-request ip saddr 192.168.1.0/24 counter accept
# Allow HTTP (port 80) from LAN IP range (192.168.1.x)
tcp dport 80 ip saddr 192.168.1.0/24 accept
#tcp dport 80 accept
# Allow HTTPS (port 443) from LAN IP range (192.168.1.x)
tcp dport 443 accept
# Allow incoming connections on port 64293 from LAN (192.168.1.0/24)
tcp dport 64293 ip saddr 192.168.1.0/24 accept
iifname eno1 udp dport 53 accept
iifname eno1 tcp dport 53 accept
# Allow incoming Samba traffic from LAN IP range
tcp dport 445 ip saddr 192.168.1.0/24 accept
# Allow MiniDLNA only from a specific MAC address
ether saddr YX:XY:XY:XY:XY:XY ether daddr YX:XY:XY:XY:XY:XY tcp dport 8200 accept
# Drop all other incoming connections
drop
}
}
答案1
据我所知,table inet
+hook input
只会处理第3层及更高层的流量,即以太网信息在此时已被丢弃。
由于您显然没有进行任何桥接,也许您应该将 MAC 地址规则放入以下ingress
钩子中table netdev
:
table netdev l2filter {
chain l2input-eno1 {
type filter hook ingress device eno1 priority 0;
# ingress hooks are specific to ^^^^ a particular network interface
# Allow MiniDLNA from specific source MAC address only
ether saddr YX:XY:XY:XY:XY:XY tcp dport 8200 accept
# MiniDLNA requests from any other source will be dropped
tcp dport 8200 drop
}
}
笔记:我没有测试过这个。如果有人更了解,请随时编辑此内容或写出更好的答案。
l2filter
并且l2input-eno1
只是人类可读的名称,您可以根据需要选择。
如果您没有桥接或以其他方式使网络接口处于混杂模式,则 NIC 硬件应该已经按目标 MAC 地址过滤传入的单播流量,因此该ether daddr
规则应该是不必要的。
另请注意,DLNA 服务器也可能/应该通过 UPnP 发现协议(SSDP = UDP 端口 1900)来声明自己,并且该协议通过多播工作,因此您可能无法完全隐藏网段中 DLNA 服务器的存在,除非您愿意阻止所有传出的 SSDP 公告,这可能会使 Oculus Quest 更难找到 DLNA 服务器。
上述规则肯定会阻止任何其他主机实际访问访问MiniDLNA 服务器,尽管 SSDP 公告将揭示其存在。