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.虽然有密钥和密码保护,但还请当心使用