Iptables

埠轉發 eth0 到 ppp0

  • November 25, 2020

我有一個 RaspberryPi,它連接到具有靜態 IP 的 eth0 上的網際網路,我安裝了 Squid,並且我還在我的 Mikrotik 路由器上啟用了 1694 埠轉發到我的樹莓上的 3128 埠,所以我可以使用我的樹莓作為代理伺服器。例如,當我從另一個網際網路上的另一個設備上測試它時,它可以工作:

$ curl -x MY.STAT.IC.IP:1694 https://wtfismyip.com/text

MY.STAT.IC.IP

現在我已經為我的樹莓添加了一個 3g 屏蔽,我能夠連接到 3g 網路,現在我在 ppp0 介面上有了網際網路,它有一個動態 IP。現在我想將所有傳入的請求轉發到 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.檢查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:

  1. 讓 Mikrotik 看起來像數據包的來源

因此,您必須在 DSTNAT 規則中添加一個類似的 SRCNAT 規則,該規則已action設置為 MASQUERADE 選項。

如果操作正確,這將使 Mikrotik 轉發給 squid 的任何數據包看起來都像是來自 Mikrotik 本身。這是一個本地設備。這將您的問題減少到上面第2點已經解決的問題。

引用自:https://serverfault.com/questions/1043862