我正在尝试阻止来自 iptables 的所有传出流量,用于 docker 的接口 docker0。但我想开放一些域的访问权限:
我怎样才能做到这一点?
我尝试过:
iptables -I OUTPUT -o docker0 -j DROP
iptables -I DOCKER -i docker0 -p udp --dport 53 -j ACCEPT
iptables -I DOCKER -i docker0 -p tcp -d mydomain.com --dport 80 -j ACCEPT
iptables -I DOCKER -i docker0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
答案1
这是不可能的。iptables
控制 Netfilter,它是一个作用于 OSI 级别 3 和 4 的 IP 数据包过滤器(防火墙)。DNS 域名是比这更高级别(并且有点正交)的东西。
您可以控制某些内容的访问IP 地址(L3)和TCP/UDP 端口(L4)使用 Netfilter。
如果您想控制对网站的访问,您有以下选择:
- 提前解析 DNS 名称,获取 IP 地址并将其放入防火墙。据我所知,
iptables
当您为其提供域名时,它会自行执行此操作;它在 Netfilter 内部配置的是该名称的解析 IP 地址。当该域的所有者决定更改 IP 地址时,您的规则将不再适用。如果该服务器上托管了多个具有此 IP 地址的网站(即有一个虚拟主机托管了多个名称),您可以完全允许它们或完全禁用它们。这似乎是你现在正在做的事情; - HTTP(s) 代理,用于检查请求的域名并禁止访问某些域名。ECH (eSNI) 等现代发明将降低您的权限,仅控制对 IP 范围的访问,就像使用普通防火墙一样,因为它使您无法知道请求了哪个主机名;
- DNS 过滤,配置递归解析器将为客户端解析哪些域以及哪些域不会解析。同样,像 DNS-over-HTTP(由 Cloudflare 提供)这样的现代发明将推断出您这样做的权力,因为您的 DNS 服务器将不再负责解析名称,而且您不可能知道请求的是哪个主机名;
- 深度数据包检测 (DPI)。而且,现代互联网显然正在朝着禁用第三方检查流量的可能性的方向发展。