我正在使用来自的伟大技术如何在 shell 脚本中获取我的外部 IP 地址?查找我的公共 IP 地址:
dig +short myip.opendns.com @resolver1.opendns.com
我还使用 sshuttle 作为 ssh 隧道的代理。使用以下命令启动转发所有端口和 IP 上的流量(包括 DNS 请求):
sshuttle --dns -vr usr@sshserver 0/0
代理启动后我访问https://canihazip.com/s验证我的外部 IP 是否已更改。它有,但是当我再次运行 dig 命令时,它报告的外部 IP 与代理启动之前报告的相同。
从详细输出来看,sshuttle 似乎正在转发其他 dig 命令,并检查https://dnsleaktest.com正如预期的那样,仅显示我的代理另一端的 IP。据我所知 sshuttle 似乎正在工作。
谁能解释为什么 dig 命令在代理之前报告我的外部 IP?我的目标是让 opendns 服务器认为该请求源自我的 ssh 服务器。
这有点超出我的想象,但我快速浏览了 Wireshark,当过滤 DNS 流量时,除了上述 DIG 命令之外,Wireshark 没有看到任何 DNS 请求。该命令正在绕过代理。
我很高兴使用任何其他(不太优雅)的方法来查找我的外部 IP,但这让我问一个问题:还有什么可以绕过 sshuttle?
答案1
现在您已经使用了-v
运行shuttle命令时显示调试消息的选项,您可以发现shuttle创建了一些iptables规则。其中一项规则如下:
iptables -t nat -A sshuttle-12300 -j REDIRECT --dest <nameserver>/32 -p udp --dport 53 --to-ports 12299
上述规则将发送到<nameserver>
Shuttle 代理端口的 DNS 请求重定向。 Shuttle<nameserver>
在/etc/resolv.conf
文件中找到这些,并根据它们自动创建 iptables 规则。
因此,当 dig 命令使用/etc/resolv.conf
文件中定义的名称服务器进行 DNS 查询时,它将被 sshuttle 代理,但如果没有,则不会被代理。
resolver1.opendns.com
在您的情况下,其地址208.67.222.222
未在您的中定义/etc/resolv.conf
,因此它不会被 sshuttle 代理。
答案2
网关有两个外部 IP 地址。网关上运行的 NAT 采用某种负载平衡。它可以基于目标 IP 或协议类型。如果是这种情况,DNS 查询和 HTTP 数据包的源 IP 地址将不同。