0.接觸Linux恐怕對SSH再熟悉不過了,還有scp,sftp各類方便的功能,通常的使用都須要ip:port(若是不是默認22的話),但有些狀況比較特殊,就是想鏈接一臺內網主機(好比公司內網,固然你確定作不了Port Forwarding,除非你想在公司防火牆上拆個洞)。稍懂一點網絡的童鞋會明白,Internet上去主動鏈接一臺內網是不可能的,通常的解決方案分兩種,一種是端口映射(Port Forwarding),將內網主機的某個端口Open出防火牆,至關於兩個外網主機通訊;另外一種是內網主機主動鏈接到外網主機,又被稱做反向鏈接(Reverse Connection),這樣NAT路由/防火牆就會在內網主機和外網主機之間創建映射,天然能夠相互通訊了。可是,這種映射是NAT路由自動維持的,不會持續下去,若是鏈接斷開或者網絡不穩定都會致使通訊失敗,這時內網主機須要再次主動鏈接到外網主機,創建鏈接。網絡
A要控制Bssh
A主機:外網,ip:123.123.123.123,sshd端口:2221code
B主機:內網,sshd端口:2223blog
不管是外網主機A,仍是內網主機B都須要跑ssh daemonip
$ ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221
這句話的意思是將A主機的1234端口和B主機的2223端口綁定,至關於遠程端口映射(Remote Port Forwarding)。路由
這裏每次須要輸入A主機user1的登錄密碼,後面會講到解決辦法。it
$ ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:1234 *:*
$ ssh localhost -p1234
在此以前還要解決以前的一個問題,那就是每次內網主機B鏈接外網主機A時都須要輸入密碼,這個問題ssh自己是提供另一種驗證方式——經過密鑰驗證用戶身份,實現自動登陸。io
$ ssh-keygen ...(一直按Enter,最後在~/.ssh/下生成密鑰) $ ls ~/.ssh/ id_rsa id_rsa.pub known_hosts
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
試下,內網B主機鏈接外網A主機,就再也不輸入密碼驗證了class
補充:今天瞭解到ssh-copy-id這個命令,上面這個操做就變的簡單了登錄
$ ssh-copy-id user1@123.123.123.123
$ autossh -M 5678 -NR 1234:localhost:2223 user1@123.123.123.123 -p2221
比以前的命令添加的一個-M 5678參數,負責經過5678端口監視鏈接狀態,鏈接有問題時就會自動重連,去掉了一個-f參數,由於autossh自己就會在background運行。
以daemon方式執行,至關於root去執行autossh, ssh,這時剛纔普通用戶目錄下的.ssh/authorized_keys文件會不起效。有兩種辦法解決,一種是用autossh的參數指定.ssh路徑;另一種是以普通用戶身份執行daemon,下面是第二種方式。
/bin/su -c '/usr/bin/autossh -M 5678 -NR 1234:localhost:2223 user1@123.123.123.123 -p2221' - user1
autossh還有不少參數,用來設置重連間隔等等。
將上面命令放入下面各啓動方式中,根據本身系統本身配置:
SysV:/etc/inid.d/autossh
Upstart: /etc/init/autossh.conf
systemd: /usr/lib/systemd/system/autossh.service
1.家裏是ADSL的話,用DDNS,解決ip問題
2.外網有路由的可設下端口映射
3.雖然有密鑰和密碼保護,但還請當心使用