技术解析

请教下怎样控制 Linux 的出口访问,只允许 Linux 访问指定域名?
0
2021-06-17 16:00:41
idczone

iptables 可以控制出口流量,但是只能针对 IP 进行限制,无法针对域名。


需求是这样的,限制了整个公网出口,只允许服务器去请求特定的一些域名,比如只允许请求百度,百度全国 CDN,拥有很多节点 IP,并且这些 IP 可能还会变化,因此将百度的 IP 全部加入 iptables 也不太现实,这里我也无法去收集到这些域名的 IP 或 IP 段,请问还有其它办法控制 Linux 的出口域名白名单吗?

PS:这些域名可能启用了 CDN,CDN 的 IP 可能会不断的变化中。


可以自己建个 DNS

可以直接用 string 匹配域名吧

dnsmasq+ipset

iptables 的 string 匹配。

最高效的应该是 3 楼说,参考一下各种翻墙教程

v2ray + 透明网关 应该也可

应该可以通过 HTTP header 中的 host 、HTTPS TLS 中的 SNI 来匹配访问的网站吧……
v2ray 好像可以?然后用 iptables 的 redirect ?

通常的做法是全部流量都使用 HTTP Proxy,缺点就是只能支持 TCP 了。
这种用户层的方法可以通过劫持 libc 实现,proxychains 用了这个方法,不过只适用于动态链接 libc 的程序
dnsmasq+ipset 有些时候会有漏网之鱼,例如如果 a.com 和 b.com 都 host 在同一个 CDN 主机 h.cdn.com 上,如果程序查询完白名单站点 a.com 的 DNS 后向 h.cdn.com 的 IP 发送 Host 为 b.com 的 HTTP(S)请求就会被放行

3 楼+1

一种做法:
LAN 口针对 UDP dport=53 的报文做 redirect 到本地,本地的 DNS server 就可以对黑名单里的域名进行干预(例如返回 No such domain)
缺点是:
如果本地通过 hosts 文件提前解析,你无能为力

可以不设置 dns 服务器 然后通过 hosts 解析

DNS 污染??(小声 (逃

10+1
iptables + L7 补丁,也可以做到协议 filter

用 adguard home 里 DNS 封锁试一试

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服