我有一台 RaspberryPi,它通过具有静态 IP 的 eth0 连接到互联网,我安装了 Squid,还启用了 Mikrotik 路由器上的 1694 端口以转发到 Raspberry 上的 3128 端口,这样我就可以使用 Raspberry 作为代理服务器。例如,当我从另一个互联网上的另一台设备进行这样的测试时,它可以正常工作:
$ curl -x MY.STAT.IC.IP:1694 https://wtfismyip.com/text
MY.STAT.IC.IP
现在我已经为我的 Raspberry 添加了 3g 屏蔽,并且能够连接到 3g 网络,现在我可以通过具有动态 IP 的 ppp0 接口上网。现在我想将所有传入请求转发到 eth0 以通过 ppp0 进行路由,因此当我执行上述 curl 时,我会获得我的 3g 网络 IP。
我不想tcp_outgoing_address
在 squid 上使用,因为它有很多问题,我想进行端口转发,并且我已经完成了以下操作,但它仍然返回我的静态 IP。
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i ppp0 -o eth0 -j ACCEPT
我尝试过很多其他 iptables 转发,但都不起作用。我试过这个 bash 脚本(当然编辑了)但它也没有用,我也尝试了 ipt.sh此链接我确信它会起作用,但仍然没有成功,那么,我错过了什么?
答案1
1.检查PI是否使用3g
首先,您必须确保 PI 使用 3g ppp0 连接来发送数据包。
ip route
应该输出类似这样的内容:
default via XXXXXX dev ppp0
另外,在 pi 上执行您提到的 curl(将代理 ip 设置为 localhost)应该会为您提供 3g 地址。
2. 检查本地代理是否有效
之后:尝试本地代理是否有效。因此,使用网络中的计算机,将 PI 设置为代理并运行 curl ip 检查。它还应该返回 3g IP。
如果这可行,您将必须在 Mikrotik 中放入一条规则,将数据包伪装成来自 Mikrotik 的数据包:
3. 让 Mikrotik 看起来像数据包来源
因此,您必须在 DSTNAT 规则中添加一个类似的 SRCNAT 规则,该规则已action
设置为 MASQUERADE 选项。
如果操作正确,这将使 Mikrotik 转发给 Squid 的任何数据包看起来都像是来自 Mikrotik 本身。这是一个本地设备。这将把你的问题简化为上面已经解决的问题2。