所以我做了如图所示的拓扑。
路由器有 3 个接口,如下所示:
eth0 到互联网端(带有 ip192.168.1.10/24网关192.168.1.254/24)。
eth1到服务器PC端(带有ip192.168.20.1/28)
eth2 到客户端(带有 ip172.16.20.1/29)
服务器和客户端连接并从路由器电脑获取互联网。 Server-pc 使用静态 IP (192.168.20.2),而客户端从 router-pc 上的 DHCP 获取自动 IP
我想在我的路由器 PC 上配置 iptables,以将客户端的互联网重定向到我的服务器 PC 上的代理服务器。因此客户端必须使用凭据来访问互联网(我已经在我的鱿鱼上配置了身份验证代理,并且已经在客户端手动配置了代理)。
我运行的防火墙是:
iptables -t nat -A PREROUTING -p tcp -s 172.16.20.0/29 -j DNAT --to 192.168.20.2
192.168.20.2是我的服务器的IP地址。那么,你能帮我修复我所做的配置,以便根据我的需要吗?
对不起,我的英语不好。谢谢。
答案1
首先:请注意,Debian 6“挤压”自 2013 年以来已不再支持主线,并且自 2016 年以来已不再提供长期支持。使用 Debian 6 以这种方式阻止互联网访问很可能是无效的,因为存在安全漏洞允许绕过限制、缺少使您无法实现所请求的规则集的功能,或两者兼而有之。我强烈地建议您将系统升级到受支持的 Debian 版本,最好是 Debian 9“stretch”。
其次,将经过身份验证的代理与透明代理模式相结合并不能很好地工作。问题是最终主机可能还需要身份验证(例如,因为您正在登录到需要 HTTP 级别身份验证的 DAV 服务器),然后您的透明代理要么会吃掉这些凭据,要么会对它们感到困惑。
相反,我的建议如下:
阻止所有不通过代理的流量:
iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 443 -j REJECT iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 80 -j REJECT
这将禁止所有不通过代理的互联网流量。
配置您的 DHCP 服务器,以便它向客户端发送域名:
subnet 172.16.20.1/29 { (...) option domain-name "example.com"; };
(使用您本地的域名,而不是
example.com
这里)- 配置您的 DNS 服务器,使其知道主机名
wpad.example.com
,该主机名应指向您的路由器(再次替换example.com
您的域名)。 创建文件 wpad.dat,并为其添加以下内容:
function FindProxyForURL(url, host) { return "PROXY 172.16.20.1:3128"; }
请注意,这是简单的 Javascript;如果您想根据目标 URL 使用不同的代理,只需修改该函数即可。
然后通过 HTTP 在路由器上提供该文件,名称为“/wpad.dat”。确保该文件的 MIME 类型是
application/x-ns-proxy-autoconfig
或application/x-javascript-config
。
这样,您网络上的浏览器将自动配置为使用代理(前提是您已打开“自动检测设置”选项(如果相关)),并且不会在身份验证方面使您的用户感到困惑。