我使用基于 Linux 的路由器,该路由器具有 dnsmasq 和 iptables。在 LAN 机器上,我有 squid 代理。我想知道是否可以将某些 URL 的请求转发到代理,而其他 URL 则允许直接转发到 WAN。例如,路由器应将 www.onedomian.com 的请求转发到代理。
答案1
您可以iptables
使用字符串匹配模块根据目标 IP(Web 服务器的 IP)和/或 URL(某些字符串)重定向 HTTP 请求。
例如,您可以使用规则将请求转发到代理:
$ sudo iptables -t nat -A PREROUTING -s your_client_ip -d your_url_ip -p tcp --dport 80 -j DNAT --to-destination PROXY_IP:PROXY_PORT
另一个使用字符串匹配的示例:
$ sudo iptables -t nat -A PREROUTING -s your_client_ip -p tcp --dport 80 -m string --string "your_url" --algo bm -j DNAT --to-destination PROXY_IP:PROXY_PORT
正常情况下会直接转发请求(假设您的浏览器中没有代理设置)。您只需设置默认网关并指定所需的FORWARD
规则。上述规则假设使用透明代理。
如果您想在浏览器中指定代理设置,您可以使用浏览器中的例外列表来指定不传递给代理服务器的 URL/IP。
答案2
是的,使用 proxy.pac 文件,您可以将其保存在磁盘或 http 服务器上,然后将其设置为浏览器的代理配置。
这是在互联网上找到的一个例子,如果您有特殊需求请告诉我们。
function FindProxyForURL(url, host)
{
if ((isPlainHostName(host) ||
dnsDomainIs(host, ".noa.com") ||
isInNet(host, "10.0.0.0", "255.0.0.0") ||
isInNet(host, "150.0.0.0", "255.255.0.0") ||
isInNet(host, "192.168.1.0", "255.255.255.0") ||
isInNet(host, "155.16.0.0", "255.255.0.0") ||
isInNet(host, "222.123.76.43", "255.255.255.255") ||
isInNet(host, "222.123.76.24", "255.255.255.255") ||
isInNet(host, "222.223.120.0", "255.255.255.0")) && (
!localHostOrDomainIs(host, "aproxy.noa.com") &&
!localHostOrDomainIs(host, "10.1.80.10") &&
!localHostOrDomainIs(host, "newproxy.noa.com") &&
!localHostOrDomainIs(host, "10.1.1.74") &&
!localHostOrDomainIs(host, "cproxy.proxy.com") &&
!localHostOrDomainIs(host, "10.1.80.11"))) {
return "DIRECT";
}
else if (url.substring(0,16)=="http://localhost")
{
return "DIRECT";
}
else {
return "PROXY your.proxy.com:8080";
}
}