首先2台主机都要安装ssh服务端:
1
| apt-get install openssh-server
|
如果有需要开启root远程登录,可以修改/etc/ssh/sshd_config 找到PermitRootLogin no一行,改为PermitRootLogin yes
A要控制B
A主机:外网,ip:123.123.123.123,sshd端口:2221 B主机:内网,sshd端口:2223 无论是外网主机A,还是内网主机B都需要跑ssh daemon
1.首先在B上执行
1
| ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221
|
这句话的意思是将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射(Remote Port Forwarding)。
2.这时在A主机上sshd会listen本地1234端口
自动登录
方法1.在内网B主机上生产公钥和私钥
…(一直按Enter,最后在~/.ssh/下生成密钥)
1 2
| $ ls ~/.ssh/ id_rsa id_rsa.pub known_hosts
|
复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中 方法2.直接在B主机上执行
1
| $ ssh-copy-id user1@123.123.123.123
|
SSH-keygen 根据私钥生成公钥
1
| $ ssh-keygen -y -f id_rsa
|
用Autossh保持ssh反向隧道一直连接
1
| autossh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221
|
注:默认autossh没有配置环境变量,需要自己设定
1 2 3 4 5
| export AUTOSSH_PIDFILE=/var/run/autossh.pid export AUTOSSH_POLL=60 export AUTOSSH_FIRST_POLL=30 export AUTOSSH_GATETIME=0 export AUTOSSH_DEBUG=1
|
为了保证开机时就启动,需要把以上环境变量写入/etc/profile中 然后在/etc/init/rc.local中添加:
1
| autossh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221
|
使用curl让反向隧道保持连接
在A主机上配置计划任务:
1
| */1 * * * * netstat -lnt4pgrep "sshd: root"awk '{print $4}'awk -F ':' '{print $2}'xargs -i curl localhost:{}
|
定时向本地的隧道端口请求数据
其他技巧
默认只能通过ssh localhost -p来连接,如果要实现远程登录内网B主机,可以在A主机上再开一个本地端口转发:
1
| ssh -g -L 80:localhost:1234 localhost
|
远程就可以通过A主机的80端口去连接B主机了。 我们甚至可以启动socket5隧道:
1
| ssh -N -f -D 0.0.0.0:8888 root@localhost -p1234
|
ssh 指定私钥文件:
1
| ssh -i /root/.ssh/idrsa root@malu.me -p 2111
|
ssh取消主机密钥检查
1.使用ssh连接远程主机时加上“-o StrictHostKeyChecking=no”的选项,如下:
1
| ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx
|
2.一个彻底去掉这个提示的方法是,修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置:
1 2
| StrictHostKeyChecking no UserKnownHostsFile /dev/null
|