2013-10-09 100 views
11

我想生成機器中的路由器後面的SSH服務器。如何繞過防火牆和NAT與反向SSH隧道

首先,我試圖將SSH綁定到我的公網IP地址:

ssh -R 10002:localhost:22 <ip_address> 

然後我提示一個密碼請求,但是我的用戶名密碼似乎並沒有工作。

顯然我知道我的用戶名密碼,所以在我看來,它試圖在同一網絡下的另一臺計算機上進行身份驗證。

任何建議如何解決這個問題?

這也將幫助我如何創建一個路由器後面的SSH服務器的任何替代方案,當你沒有訪問到路由器。

iptables中的端口都開放。

UPDATE

至於建議的Thomas Oster答案我已經試過以下。

在路由器後面,我執行以下命令機:

$ ssh -R10002:localhost:22 <remote_public_ip_address> -l <my_remote_server_username>

<remote_ip_address>是一個服務器的公網IP和我有充分的控制SSH服務器的remote_ip_address。

<my_remote_server_username>作爲遠程服務器的用戶名。

在那之後,我試圖從遠程服務器連接到服務器的路由器這樣的背後:

$ ssh -p 10002 <remote_public_ip_address>

但是這個命令會顯示以下輸出:

ssh: connect to host <remote_public_ip_address> port 10002: Connection refused 

因此,我使用以下命令在iptables防火牆中打開了10002端口:

sudo iptables -A INPUT -p tcp --dport 10002 -j ACCEPT 

在那之後,我再次執行命令,但它顯示了同樣的錯誤消息。

在我的機器後面的路由器我有所有端口在iptables中打開。

更新2

你必須允許在/ etc/SSH /的 remove_public_ip_address服務器的sshd_config portforwarding

我試圖讓在sshd_config portforwarding添加此命令的文件:

LocalForward 10002 <my_remote_public_server_ip>:22 

但它給了我這個e RROR消息:

Bad configuration option: LocalForward 

「SSH -R ....」 後要離開的窗口中打開?

執行該命令後,它連接到遠程公共機器,是的,我離開了窗口打開。

在創建隧道 後,您可以在公共服務器上使用ssh -p 10002 localhost嗎?

是的,如果我在公共服務器中執行該命令,它在詢問我的憑據後連接。

請在路由器後面的機器上嘗試「ssh localhost」,檢查sshd是否正在運行並正常運行。

這也適用。

更新3

我已經終於能夠使它(再次感謝Thomas Oster)工作

我們將三本用機的工作:

目標計算機:那我們想要連接到。

中東機:一臺服務器充當連接(在我的情況下的Linode)

家用電腦中介:我們在哪裏將訪問到目標計算機。

這些都是我跟着

步驟1中的步驟:

[destination computer]$ vi /etc/ssh/sshd_config 

添加GatewayPorts選項:

GatewayPorts是

重新啓動SSH。

第2步:

[destination computer]$ ssh -R 4040:localhost:22 [email protected] 

這將通過端口4040

你的公共機器與目標計算機連接後會連接到中間的機器,並提示終端,則必須將此選項卡打開。

第3步:

ssh [email protected] -p4040 

或者從中間機器連接:

從家裏連接

[home computer]$ ssh [email protected] 

[middle computer]$ ssh [email protected] -p4040 

Source

+0

您必須允許remove_public_ip_address服務器的/ etc/ssh/sshd_config中的端口轉發 –

+0

在「ssh -R ....」之後,您是否打開窗口?只要連接處於打開狀態,隧道就會處於活動狀態。它顯示了任何錯誤消息,如「無法綁定到10002」?創建隧道後,您可以在公共服務器上使用ssh -p 10002 localhost嗎? –

+0

請在路由器後面的機器上嘗試「ssh localhost」,檢查sshd是否正在運行並正常運行。 –

回答

5

是否有一個SSH服務器運行在公衆面前「ip _地址」?你要做的是「打開ssh連接到」ip_address「,然後將端口10002上的任何傳入請求隧道到localhost:22」。

如果「ip-address」是dsl路由器的公共IP地址,則必須在路由器的配置中爲您的主機創建端口轉發:22。

如果您無法訪問路由器,唯一可能的情況是您可以訪問另一臺在互聯網上運行ssh的服務器,您可以從中通過它隧道。

# open a session to the public available machine and create a tunnel from port 10002 back to your local sshd (22) 
ssh -R 10002:localhost:22 ip_of_public_server 
# as long as this session is open, all calls to the public available machine on port 10002 will be tunneled to your local machine (make sure sshd is running on port 22) 
ssh -p 10002 ip_of_public_server 
+0

我不知道公共IP地址上運行着哪個SSH服務器。但我確實有另一臺服務器運行帶有公共IP的SSH服務器,並在另一個網絡中完全控制它。但是我不知道如何在那裏創建一個與路由器後面的計算機相連的隧道。這意味着我可以從路由器後面的計算機連接到另一臺SSH服務器,但我不知道如何以其他方式進行操作。 – rfc1484

+0

好的。假設您的公用計算機具有IP地址public_ip。然後到路由器後面的機器上執行「ssh -R10002:localhost:22 public_ip」。如果這樣做,你可以使用「ssh -p 10002 public_ip」 –

+0

從任何地方連接到路由器後面的機器,如果它適合你,請接受答案或者描述你的問題在哪裏。 –

5

正如你所說,我們有「目標計算機」(我們wanto連接到使用SSH),「中間機」(公共服務器工作作爲代理),「其他計算機」(任何其它計算機上的網絡)

正如@托馬斯 - 奧斯特說,你必須使用

[destination computer] $ ssh -R 2222:localhost:22 ip_of_public_server 

然而,爲了使隧道綁定到0.0.0.0,而不是本地主機,你必須使用GatewayPorts的/ etc/SSH/「中間機器」(公共服務器)上的sshd_config:

GatewayPorts yes 

當然,您必須在添加此選項後重新啓動sshd。

http://www.snailbook.com/faq/gatewayports.auto.html一個解釋: 「默認SSH只監聽環回地址連接到轉發端口」

這將讓你在網絡上使用任何計算機連接到目標計算機中間機器(公共服務器)的ip:

[any computer on the net] $ ssh -p 2222 ip_of_public_server 

確保公用服務器上的防火牆允許連接到端口2222/tcp。

1

我最近偶然發現了同樣的問題,但沒有SSH服務器的root權限。

如上所述GatewayPorts yes是必要的,因此網絡中的客戶端也可以連接到SSH服務器上的遠程轉發端口。默認情況下,它被設置爲no。因此,如果您沒有root權限,則無法更改SSHD設置以將GatewayPorts選項設置爲true。其中SSHD監聽

ssh -R 4041:localhost:22 myserver.com 'socat TCP-LISTEN:4040,fork TCP:127.0.0.1:4041' 

socat是一個偉大的網絡工具,它結合在接口0.0.0.0一個TCP端口4040所以它是從網絡中是可見的所有流量重定向到127.0.0.1:4041:但在這種情況下,你可以使用以下解決方法並將其重定向到您的客戶的端口22

因此,如果有人想爲你描述(客戶端)到您的本地SSH連接端口22,他的作用:

ssh -p 4040 myserver.com 

和它的工作原理是這樣的:

SSH client --> myserver.com:4040 (socat) --> 127.0.0.1:4041 (myserver.com, SSHD) --> SSH client port 22

socat可以從源代碼構建,也可以在系統上安裝。它存在於RHEL/CentOS的RPMForge存儲庫中(但是,如果您沒有root權限,則無法安裝它)。