如何直接通过跳板机ssh到服务器

公司线上服务器都无法直接访问,必须通过一台跳板机来访问。比如要访问机器dev,则必须先ssh到跳板机gateway,然后再ssh到dev机器。

这样做自然可以减少攻击面,但是每次去dev机器执行命令,或者上传文件的时候,都要两次ssh,确实比较麻烦。

故Google之,可以使用ssh config中的ProxyCommand选项,比如我们先定义主机gateway的连接参数:

1
2
3
Host gateway
HostName gw.example.com
User XXX

然后我们需要定义主机dev的连接参数:

1
2
3
4
Host dev
HostName dev.ip.example.com
User XXX
ProxyCommand ssh -q -W %h:%p gateway

这样,ssh dev 命令就会先和gateway建立ssh连接,并把这个中间连接当作一个代理使用。不过需要注意的是,你的公钥除了必须在gateway上有之外,还必须在dev上有,这是和之前不一样的地方。

PS:之前考虑过 ProxyCommand ssh gateway nc %h %p ,但是考虑到机器上可能没有nc命令。后来发现ssh有-W参数,果断用之。

PPS:ProxyCommand参数中的-q是为了防止和跳板机的ssh连接产生多余的输出,比如不加 -q 就会导致每次断开连接的时候会多一句 Killed by signal 1.

如果这样做了,我们就可以玩一些高级的用法了,比如:

1
2
ssh dev "sudo tcpdump -s 0 -U -n -i eth0 not port 22 -w -" \
| wireshark -k -i -

这条命令在远端调用tcpdump抓包,通过管道传回本地,然后让wireshark抓包,就达到了实时抓包的效果了。这比原来的抓包存储到pcap文件中,然后两次scp传回来要好很多啊。

作者

Robert Lu

发布于

2015-09-08

许可协议

评论