我的网络上有一个公有子网和一个私有子网,我正在通过公有子网上的 NAT 机器路由私有子网上的所有流量。在 NAT 机器上,我配置了 squid 代理服务器,以便仅允许与特定域(假设为 google.com)建立 https 连接。我的 squid 配置摘录如下:
acl allowed_https_sites ssl::server_name google.com
在我的 iptables 规则中,我根据我的 squid 配置添加了以下规则。规则如下:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130
sudo service iptables save
从私有子网机器内部,如果我尝试导航到google.com
它可以工作,但是如果我导航到任何其他 https 网站,我将无法访问它,这正是我想要的。
我想再进一步,除了google.com
来自我的 NAT 机器的可能连接外,我不希望有任何类型的出站连接。为了实现这一点,我正在尝试实施本文中讨论的解决方案解决方案但没有得到预期的结果。
如果我按照上述链接中提到的方式修改规则,我将无法实现最终结果。我试图实现的最终结果是,在私有子网中仅允许来自我的机器的一个 https 域,其余的域都应被阻止/拒绝。起初我以为,我可以对 iptables 规则进行简单的字符串匹配,但我错了。这似乎比我最初预期的更具挑战性。还有其他我可以尝试的想法吗?或者我可以以某种方式调整上述解决方案以适合我的用例?
答案1
主要挑战在于,您没有 google.com 的特定地址或范围,iptables 无法通过该地址或范围工作。因此,您应该在进程级别阻止流量。由于 squid 代理主要由“squid”作为有效用户运行,因此您可以禁止来自其他进程的传出(OUTPUT)流量。
iptables -A OUTPUT -m owner ! --uid-owner squid -j DROP
此外,您可以将任何传出(但 squid 除外)重定向到 squid 并享受您之前的配置,以便只访问单个域。