我尝试了几种不同的规则组合,但似乎都不起作用。我知道您不能对来自本地主机的请求使用预路由表,因此我使用了输出表,但在使用 wget 时只会返回错误。
我已将 wget 配置为使用代理 127.0.0.1:8118。当我使用下面的命令时,我会获取我的公共 IP。如果我更改命令以删除 --no-proxy,我会从我的代理获取 IP。
我想使用 iptables 强制通过代理发送对此站点的任何请求,而不管请求它的程序是什么。我本质上是尝试创建一个透明代理,但只针对一个站点的请求。
系统 = Debian Squeeze
wget 命令:
wget --no-proxy -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
我已在 /etc/sysctl.conf 中启用了 net.ipv4.ip_forwarding=1。
尝试的规则:
iptables -t nat -I OUTPUT --source 0/0 --destination checkip.dyndns.org -p tcp -j REDIRECT --to-ports 8118
iptables -t nat -I OUTPUT -p tcp -d checkip.dyndns.org -j REDIRECT --to-ports 8118
iptables -t nat -I PREROUTING -p tcp -s localhost -j DNAT --to 127.0.0.1:8118
iptables -t nat -I OUTPUT --source localhost --destination checkip.dyndns.org -p tcp -j REDIRECT --to-ports 8118
以及其他各种类似的。
答案1
您确实提到了正确的术语(透明代理)。首先,您需要有一个支持透明代理的代理服务器。其次,您需要使用 iptables 将 HTTP 请求重定向到它,如下所示:
iptables -A OUTPUT -d checkip.dyndns.org -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8118
使用这样的规则会告诉你的机器将端口 80 上的所有传出 http 请求重定向到端口 8118 上的本地代理。此外,编写依赖于 DNS 名称的规则并不是一个好主意,尤其是当 DNS 名称到 IP 的映射发生变化时。iptables 只会将名称转换为 IP 并使用该 IP 而不是名称。