SSH反向連線及Autossh

2021-07-08 11:56:37 字數 2404 閱讀 3059

0.接觸linux恐怕對ssh再熟悉不過了,還有scp,sftp各種方便的功能,一般的使用都需要ip:port(如果不是預設22的話),但有些情況比較特殊,就是想連線一台內網主機(比如公司內網,當然你肯定做不了port forwarding,除非你想在公司防火牆上拆個洞)。稍懂一點網路的童鞋會明白,internet上去主動連線一台內網是不可能的,一般的解決方案分兩種,一種是埠對映(port forwarding),將內網主機的某個埠open出防火牆,相當於兩個外網主機通訊;另一種是內網主機主動連線到外網主機,又被稱作反向連線(reverse connection),這樣nat路由/防火牆就會在內網主機和外網主機之間建立對映,自然可以相互通訊了。但是,這種對映是nat路由自動維持的,不會持續下去,如果連線斷開或者網路不穩定都會導致通訊失敗,這時內網主機需要再次主動連線到外網主機,建立連線。

1.理論的介紹完了,下面實際操作:

a要控制b

a主機:外網,ip:123.123.123.123,sshd埠:2221

b主機:內網,sshd埠:2223

無論是外網主機a,還是內網主機b都需要跑ssh daemon

1.1.首先在b上執行

$ ssh -nfr 1234:localhost:2223 [email protected] -p2221
這句話的意思是將a主機的1234埠和b主機的2223埠繫結,相當於遠端埠對映(remote port forwarding)。

這裡每次需要輸入a主機user1的登陸密碼,後面會講到解決辦法。

1.2.這時在a主機上sshd會listen本地1234埠

$ ss -ant

state recv-q send-q local address:port peer address:port

listen 0 128 127.0.0.1:1234 *:*

1.3.像平時一樣連線到a主機的1234埠就可以控制內網b主機了
$ ssh localhost -p1234
2.一開始提到,這種反向連線(reverse connection)不穩定,可能隨時斷開,需要內網主機b再次向外網a發起連線,這時需要個「朋友」幫你在內網b主機執行這條命令。它就是autossh。

在此之前還要解決之前的乙個問題,那就是每次內網主機b連線外網主機a時都需要輸入密碼,這個問題ssh本身是提供另外一種驗證方式——通過金鑰驗證使用者身份,實現自動登入。

2.1.在內網b主機上生產公鑰和私鑰

$ ssh-keygen

...(一直按enter,最後在~/.ssh/下生成金鑰)

$ ls ~/.ssh/

id_rsa id_rsa.pub known_hosts

2.2.複製b主機上生成的id_rsa.pub公鑰到外網a主機上,並將內容加入到~/.ssh/authorized_keys中
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
試下,內網b主機連線外網a主機,就不再輸入密碼驗證了

補充:今天了解到ssh-copy-id這個命令,上面這個操作就變的簡單了

$ ssh-copy-id [email protected]
2.3.再來看看autossh的用法
$ autossh -m 5678 -nr 1234:localhost:2223 [email protected] -p2221
比之前的命令新增的乙個-m 5678引數,負責通過5678埠監視連線狀態,連線有問題時就會自動重連,去掉了乙個-f引數,因為autossh本身就會在background執行。

3.終極方案:當重啟內網b主機,誰來自動autossh呢,加入daemon吧

以daemon方式執行,相當於root去執行autossh, ssh,這時剛才普通使用者目錄下的.ssh/authorized_keys檔案會不起效。有兩種辦法解決,一種是用autossh的引數指定.ssh路徑;另外一種是以普通使用者身份執行daemon,下面是第二種方式。

/bin/su -c '/usr/bin/autossh -m 5678 -nr 1234:localhost:2223 [email protected] -p2221' - user1
autossh還有很多引數,用來設定重連間隔等等。

將上面命令放入下面各啟動方式中,根據自己系統自己配置:

sysv:/etc/inid.d/autossh

upstart: /etc/init/autossh.conf

systemd: /usr/lib/systemd/system/autossh.service

p.s.

1.家裡是adsl的話,用ddns,解決ip問題

2.外網有路由的可設下埠對映

3.雖然有金鑰和密碼保護,但還請小心使用

SSH反向連線及Autossh

0.接觸linux恐怕對ssh再熟悉不過了,還有scp,sftp各種方便的功能,一般的使用都需要ip port 如果不是預設22的話 但有些情況比較特殊,就是想連線一台內網主機 比如公司內網,當然你肯定做不了port forwarding,除非你想在公司防火牆上拆個洞 稍懂一點網路的童鞋會明白,in...

SSH反向連線及Autossh

0.接觸linux恐怕對ssh再熟悉不過了,還有scp,sftp各種方便的功能,一般的使用都需要ip port 如果不是預設22的話 但有些情況比較特殊,就是想連線一台內網主機 比如公司內網,當然你肯定做不了port forwarding,除非你想在公司防火牆上拆個洞 稍懂一點網路的童鞋會明白,in...

SSH反向連線及Autossh

0.接觸linux恐怕對ssh再熟悉不過了,還有scp,sftp各種方便的功能,一般的使用都需要ip port 如果不是預設22的話 但有些情況比較特殊,就是想連線一台內網主機 比如公司內網,當然你肯定做不了port forwarding,除非你想在公司防火牆上拆個洞 稍懂一點網路的童鞋會明白,in...