Ssh
通過 ssh 隧道進行 IP 轉發
情況涉及3台機器:
- A某台筆記型電腦通過任何方式連接到網際網路
- B通過標準 ISP 連接到 Internet 的伺服器(dyndns 提供的靜態 IP:myserver.dyndns.com)
- C另一台伺服器通過 4G 加密狗連接到網際網路
A <— ISP1 — ISP 2 —> B <— ISP 2 — 4G —> C
由於 4G 加密狗拒絕新的傳入連接,我設置了一個
autossh
通道以通過 B 從 A 連接到 C:autossh -M 0 -N user@myserver.dyndns.com -R 10022:127.0.0.1:22 -R 10000:127.0.0.1:10000
這很好用。
現在,我想通過鍵入來訪問 4G 加密狗的 Web 界面
myserver.dyndns.com:80
所以我嘗試了 NATing 的東西:
- 在B上:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:10000
和
iptables -t nat -A POSTROUTING -d 127.0.0.1 --dport 10000 -j MASQUERADE`
- 在C上:
iptables -t nat -A PREROUTING -p tcp --dport 10000 -j DNAT --to-destination 192.168.8.1:80
和
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
注:
eth1
是4G dongle的介面,C在該介面的IP是192.168.8.100,dongle的IP是192.168.8.1。不幸的是,這不起作用。我還啟動了 IP 轉發:
echo 1 > /proc/sys/net/ipv4/ip_forward
打字的時候
iptables -t nat -L -v -n
在B和C上,只有B的 PREROUTING 行在每次嘗試後看到其數據包計數增加。
這可能是由於對如何
netfilter
工作的理解不完整。我會很感激你能提供的任何幫助!
iptables -t filter -nvL
請問,你能在伺服器 B 和 C 上提供輸出嗎?我猜該
autossh
頻道在伺服器 C 上執行。對嗎?如果是這樣,我建議採用不同的方法。在 B 上,您需要一個 REDIRECT 規則,因為核心不允許非特權使用者打開埠 80。iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 10000 iptables -t filter -A INPUT -p tcp --dport 10000 -j ACCEPT
(編輯):在伺服器 B 上,
GatewayPorts
必須在以下位置啟用/etc/ssh/sshd_config
:# /etc/ssh/sshd_config GatewayPorts clientspecified
autossh
在伺服器 C 上,通過修改參數將連接直接轉發到加密狗:autossh -M 0 -N user@myserver.dyndns.com -R 10022:127.0.0.1:22 \ -R :10000:192.168.8.1:80
我在您的設置中看到的唯一錯誤在於
PREROUTING
伺服器 C 的鍊式規則。在這種情況下,它不會被評估,因為它只影響通過網路介面進入的數據包。by 創建的連接ssh
是本地生成的,因此它們會受到OUTPUT
鏈中規則的影響。