我必须用squid,dansguardian和nginx来实现一个非常具体的设置。 在这里我非常具体,因为类似的问题经常要求更多的信息来给出准确的答案。 此外,我通常不会做networking的东西,我目前的解决scheme是从其他Stack Exchange的问题和答案中挑选拼图的结果,所以请原谅/纠正我迄今为止所犯的任何错误/误解。
本质上,我想阻止通过端口80和443访问互联网的任何尝试,除非通过端口3128上的代理访问所述端口。原因是这样,代理和Dansguardian可以过滤/阻止不受欢迎的网页。 我们决定使用非透明的代理,以便我们可以使用非阻塞SSL阻塞。 这部分已经在工作了。
但是,如果客户端尝试直接访问Web,而不是放弃尝试,Magic Box应该将客户端redirect到关于如何设置代理的分步指南。
我们设置了wpad来消除手动configuration客户端设备的需要。 不过,OSX和Linux,更重要的是iOS和Android没有默认启用的wpad支持(或者完全不支持)。 我们的第一个想法是留下客户的指示,如何设置在纸上的设备。 然而,我的老板要我设置redirect的变体,因为客户立即明白为什么互联网不能马上工作。
这是对所需设置的视觉帮助。 没有描绘的事实是, enp1s0和enp2s0是桥br0一部分。
networking图显示了所有相关的物理设备。 标有红色的是我们无法触摸或configuration的设备。 标记为绿色是我们的设备。
“魔盒内”图表显示了所需的路由决策
我们原来的ebtables / iptables规则,我们将在纸上留下一步一步的configuration指南,看起来像这样
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
有了这些规则,每当我尝试直接用浏览器访问互联网时,我看到这些包在iptable的PREROUTING链中出现。 同时,nginx的httpd仍然可以访问,通过代理的互联网也在工作。
不工作的部分是redirect到nginx httpd。 浏览器只是告诉我,服务器无法到达,nginx的访问日志也不显示任何活动。
我也试过以下的东西,但没有一个解决了这个问题
*在POSTROUTING链中设置SNAT和MASQUERADE规则
*将net.ipv4.ip_forward设置为1
*将net.ipv4.conf.all.route_localnet设置为1
在这一点上,我开始认为我犯了这么一个错误,以至于我对ebtables / iptables的细节不了解,或者我想做的事情根本就不可能用iptables / ebtables 。
您只需将端口80上的所有stream量指向特定的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
目的地址是你的鱿鱼服务器的IP地址。