參考:崔大神
準備
一臺內網機器 A
- IP:192.168.10.128
- SSH端口: 22
- 用戶名:a
- 密碼:passworda
- 內網配置端口:22(即配置 SSH 端口的反向隧道)
帶有公網ip的機器 B
- IP:111.123.123.123
- SSH端口: 22
- 用戶名:b
- 密碼:passwordb
- 公網端口:22001(即用 B 的 22001 端口連到 A 的 SSH 22 端口)
配置SSH密鑰
注意分清A、B,A是內網,B是公網。在 A 主機上生成 SSH 祕鑰,和 B 用 SSH 建立認證。
###A的配置(內網主機)
ssh-keygen -t rsa -C "[email protected]"
郵箱要換成你自己的,直接用下面這個也行,都是默認的
ssh-keygen
直接連按3次enter就可以了,什麼都不用輸入,密鑰自動保存在默認的地方,方便下一步操作。
你會獲得一長串SHA256:......
注意不要清屏了,這個等下有用
然後利用如下命令將 A 的 SSH 祕鑰即SHA256:......
裏面的字符串,添加到 B 的 authorized_keys 裏面:
ssh-copy-id [email protected]
注意換成你自己的ip,執行後會提示輸入主機 B 的密碼,執行完畢之後,我們登錄到 B,就發現 authorized_keys 裏面就多了 A 的 SSH 公鑰了,成功建立 SSH 認證。
這個步驟主要是完成了從機子A到Bssh
的免密登錄,具體可以看~/.ssh/
下面的一些密鑰更改情況
###B的配置(公網主機)
只需要微微改一下配置
sudo vi /etc/ssh/sshd_config
添加
GatewayPorts yes
這句話的意思是監聽端口可以綁定到任意其他ip,不然只有本機127.0.0.1可以訪問
重啓一下ssdh
服務
sudo service sshd restart
###A的配置(內網主機)
弄好了上面的,再回到A,安裝一個autossh
,注意,這個東西ubuntu
安裝比較方便,我在centos
試了一下,似乎不能直接用命令安裝了,要去網上下,比較麻煩。
以ubuntu
爲例,執行下面命令完成安裝
sudo apt-get install autossh
開啓autossh
autossh -M 22002 -NfR 0.0.0.0:22001:localhost:22 [email protected]
注意最後一個ip,是公網ip
這裏 -M 後面任意填寫一個可用端口即可,-N 代表只建立連接,不打開shell ,-f 代表建立成功後在後臺運行,-R 代表指定端口映射。
這裏是將 A 主機的 22 端口映射到 B 主機的 22001 端口,這樣就完成了配置。
主要我們再訪問 B 主機的 22001 端口,就會自動轉發到 A 主機的 22 端口了,即可以公網訪問了。
另外再提醒一下,如果是一些供應商的雲主機,記得要去安全策略組那裏開放22002、22001兩個端口,不然怎麼樣都是訪問不了的。
連接測試
ssh [email protected] -p 22001
輸入內網主機a的密碼,這時候你就會驚奇地發現已經打開了內網主機。
另外,爲了方便,可以考慮將autossh
設置爲開機啓動後
以ubuntu
爲例,因爲不同機器的開機啓動文件稍有差異,具體哪個請自查
sudo vi /etc/rc.local
添加下面這行代碼
autossh -M 22002 -NfR 0.0.0.0:22001:localhost:22 [email protected]
ok,這次實驗到此爲止,來源請翻到頭頂。
更換內網主機
這個內網主機a2
的設置首先按上面重複一遍
然後回到公網主機b
,關掉前面的監聽端口
sudo netstat -tunlp|grep 22001
看到的記錄中有 23630/sshd: b
kill -9 23630
然後回到a2
,開啓
autossh -M 22002 -NfR 0.0.0.0:22001:localhost:22 [email protected]
反正要kill掉,不然不管怎麼弄,ssh到的都是原來的a主機。
或者換個端口號也可以。
問題
機器重啓後,autossh會以root身份運行,如果一開始不是用root帳號弄的,會有問題。