2009年11月28日星期六

SSH反向连接

由于实验室的网络是学院组建的局域网,那当我在宿舍的时候就不能直接远程回实验室的电脑。但实验室的电脑上有很多东西我需要用到,我必须远程回去。但怎么连呢?答案就是SSH Port Forwarding。
方案一:
由于我们是想在宿舍远程回实验室,所以要将实验室的电脑的22端口给forward到宿舍电脑上的某个端口(设为2222吧),也就是需要用到ssh的Reomte Port Foward。
假定实验室的电脑为A,宿舍的电脑为B。具体步骤如下:
1.在A上面输入:
ssh -f -N -R 2222:localhost:22 userB@hostB //hostB为B的hostname,userB为hostB上的用户
这里会提示输入ssh到hostB的userB的密码。
2.在B上面输入:
ssh userA@localhost -p 2222 //hostA为A的hostname,userA为hostA上的用户
这里会提示输入ssh到hostA的userA的密码。

到这里,基本上完成连接的目的,唯一的问题是,如果我在宿舍使用期间,A到B的连接断了,那我不可能跑回实验室输入一系列的命令和密码的。为了解决这个问题,我们可以写一个脚本(当然也可以用cron建立一个计划任务),让A在发现到B的连接断了的时候自己重连,而需要输入密码的问题可以使用SSH Public Key来解决。
脚本代码:
#!/bin/bash
while true;
do
Connection=`ps ax | grep "ssh -f -N -R 2222" | grep -v "grep"`
if [ "$Connection" = "" ]; then
echo "restart ssh server"
ssh -f -N -R 2222:localhost:22 userB@hostB
fi
sleep 10
done
关于SSH Public Key,可以参看前面的文章。

方案二:
假设我们除了A、B之外,还有一台每天基本都会在线电脑C,而A和B都可以ssh到C的。于是我们就想,将A的22端口forward到C的2222端口,然后B再ssh到C的2222端口。
步骤如下:
1.在A上面输入:
ssh -f -N -R 2222:localhost:22 userC@hostC //hostC为C的hostname,userC为hostC上的用户
这里会提示输入ssh到hostC的userC的密码。
2.在B上面输入:
ssh userA@hostC -p 2222 //hostC为C的hostname,userA为A上的用户
这里会提示输入ssh到A的userA的密码。
这里要注意的地方是,C的sshd配置中,要起用了GatewayPorts选项(/etc/sshd/sshd_config中有GatewayPorts yes),不然B是无法ssh到C的2222端口的。
断掉重连和免密码连接的方法要上面都一样。

没有评论: