iptables 将 tcp 从 localhost 重定向到 checkip.dyndns.org 到 127.0.0.1:8118

iptables 将 tcp 从 localhost 重定向到 checkip.dyndns.org 到 127.0.0.1:8118

我尝试了几种不同的规则组合,但似乎都不起作用。我知道您不能对来自本地主机的请求使用预路由表,因此我使用了输出表,但在使用 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 而不是名称。

相关内容