我想要的是
我必须使用 squid、dansguardian 和 nginx 实现非常具体的设置。我故意在这里说得非常具体,因为类似的问题通常需要更多信息才能给出准确的答案。另外,我通常不做网络方面的工作,我目前的解决方案是从其他 Stack Exchange 问题和答案中收集拼图碎片的结果,所以请原谅/纠正我迄今为止犯下的任何错误/误解。
本质上,我想阻止任何通过端口 80 和 443 访问互联网的尝试,除非通过端口 3128 上的代理访问上述端口。这样做的原因是代理和 Dansguardian 可以过滤/阻止不需要的网页。我们决定使用非透明代理,以便我们可以使用非侵入式 SSL 阻止。这部分已经起作用了。
然而,如果客户端尝试直接访问网络,Magic Box 不会放弃尝试,而是会将客户端重定向到有关如何设置代理的分步指南。
我们确实设置了 wpad,这样就无需手动配置客户端设备。但是 OSX 和 Linux,更重要的是 iOS 和 Android 默认情况下不启用 wpad 支持(或不完全支持)。我们的第一个想法是让客户在纸上说明如何设置他们的设备。但是,我的老板希望我设置重定向变体,因为这样客户可以立即看到互联网无法正常工作的原因。
这是所需设置的视觉辅助。图中未显示的事实是enp1s0
和enp2s0
是桥梁的一部分br0
。
网络图显示了所有相关的物理设备。标记为红色的是我们不能接触或配置的设备。标记为绿色的是我们的装置。
“魔盒内部”图表展示了所需的路由决策
目前的情况
我们最初的 ebtables/iptables 规则(我们会在纸上留下分步配置指南)如下所示
ebtables -A FORWARD -p ipv4 -i lo -o enp1s0 --ip-proto tcp --ip-destination-port 80 -j ACCEPT
ebtables -A FORWARD -p ipv4 -o enp1s0 --ip-proto tcp --ip-destination-port 80 -j DROP
ebtables -A FORWARD -p ipv4 -i lo -o enp1s0 --ip-proto tcp --ip-destination-port 443 -j ACCEPT
ebtables -A FORWARD -p ipv4 -o enp1s0 --ip-proto tcp --ip-destination-port 443 -j DROP
为了允许在不使用代理访问互联网时将客户端重定向到浏览器中的分步指南,我们将规则更改为以下内容
ebtables -t broute -A BROUTING -i lo -j ACCEPT
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-destination-port 80 --ip-destination ! 192.168.2.75 -j redirect --redirect-target DROP
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.2.75:80
有了这些规则,每当我尝试使用浏览器直接访问互联网时,我都会看到这些数据包出现在 iptablePREROUTING
链中。同时,nginx httpd 仍然可以访问,通过代理访问互联网也可以正常工作。
不起作用的部分是重定向到 nginx httpd。浏览器只是告诉我无法访问服务器,并且 nginx 访问日志也没有显示任何活动。
我也尝试了以下方法,但都没有解决问题
* 设置链中的规则SNAT
* 设置为 * 设置为MASQUERADE
POSTROUTING
net.ipv4.ip_forward
1
net.ipv4.conf.all.route_localnet
1
此时,我开始认为我犯了一个非常微小的错误,我对 ebtables/iptables 的细节无知,导致我没有发现它,或者我想要做的事情根本无法通过 iptables/ebtables 来实现。
答案1
您所要做的就是将端口 80 上的所有流量指向特定的 IP 地址和端口。对吗?如果是这样:
iptables -A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.75:3128
其中 --to-destination 是您的 squid 服务器的 ip。