
有些網站/服務我只能從我的伺服器所在的子網路存取(想想典型的 Intranet 場景)。有沒有辦法透明地路由通過 SSH 隧道到達這些位址的流量?
考慮以下設定:
我的筆記型電腦已連接到家庭網路。它無法直接存取 ips X 和 Y 上的服務。我有一個通往伺服器的 SSH 隧道,位於可以實際存取這些服務的子網路上。
我能否以某種方式自動將所有流量封裝到 X 和 Y 的子網路以通過此隧道,而無需運行透過伺服器發送所有流量的整個 VPN 解決方案?換句話說:前往任何其他子網路的所有流量仍應直接從筆記型電腦發出,而不通過伺服器(使用隧道)。
答案1
您可以指定在路由表中路由流量的介面:
sudo route add <host.com> -interface <ppp0>
其中,host.com 是您要透過介面存取的主機名稱或 IP,ppp0 是命令中顯示的 VPN 的連結識別碼ifconfig
。
答案2
最新版本的 OpenSSH 支援 tun/tap 網路設備以實現真正的 VPN 支援。看https://help.ubuntu.com/community/SSH_VPN一些基本文件(顯然是針對 Ubuntu 的,但基本原理也適用於其他地方。)
答案3
免責聲明:我沒有真正測試過我要描述的內容,實際上它可能是完全錯誤的,但你的問題是如此有趣,我無法抗拒起草答案的誘惑。 :-) 另外,此處的設定取決於某些iptables
可能僅存在於 Linux 上的功能。
假設您想要從筆記型電腦連接到伺服器 X1 上的特定連接埠 P1、伺服器 X2 上的連接埠 P2 等 - 我將描述如何透過 SSH 隧道將 TCP 流量路由到這些特定伺服器+連接埠對。 筆記:IP 位址 X1、X2 等是從網關主機(您透過 SSH 連接到的主機)看到的伺服器的 IP 位址。
選擇一些未使用的本機連接埠L1(例如10000),L2(例如10001)等。數量端口對。
用於
iptables
將定向到 Xn:Pn 的封包重定向到 localhost:Lniptables -t nat -A 輸出-p tcp -d X1 --dport P1 -j DNAT --到目的地本地主機:L1 iptables -t nat -A 輸出-p tcp -d X2 --dport P2 -j DNAT - -目的地本地主機:L2
現在透過 SSH 連接到網關,使用
-L
將流量從 localhost:Ln 隧道傳送到 (Xn, Pn) 的選項:ssh gateway.server -L 本機:L1:X1:P1 -L 本機:L2:X2:P2 ...
例子:
# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80
注意事項:
它只適用於 TCP,如果它有效的話...
如果您想存取多個伺服器,設定 VPN 可能會更省力
使用 SSH
-D
選項來模擬 SOCKS 代理並透過該代理程式傳輸所有流量可能仍然更容易。
答案4
我能否以某種方式自動將所有流量封裝到 X 和 Y 的子網路以通過此隧道,而無需運行透過伺服器發送所有流量的整個 VPN 解決方案?
乍一看這有點奇怪,因為這就是 VPN 將為您做的事情。 SSH 往往是點對點的事情,其想法是將本機電腦上的一個連接埠連接到其他地方的遠端電腦的連接埠;它確實不是為您想像的流量類型而設計的。
換句話說:前往任何其他子網路的所有流量仍應直接從筆記型電腦發出,而不通過伺服器(使用隧道)。
同樣,VPN 可以解決這個問題。
如果您擔心獲得安全 VPN 流量的「重量級」解決方案(即您不想使用它,因為它太複雜),您真的應該看看開放VPN,這將完全按照您所描述的進行。它不僅會封裝所有流量,而且可以透過只有發送到這些子網路的流量才會透過 VPN 管道進行傳輸的方式來完成。我會警告您,您仍然需要在本地和遠端電腦上編輯文字文件,但運行起來相當容易。
出於您的目的,由於您不希望中間方(伺服器)看到您的流量,因此您可以將 VPN 設定為直接從您的電腦連接到遠端電腦。所有路由資料包在離開您的筆記型電腦之前都會被加密,因此您將獲得 100% 的端對端覆蓋。