这两天由于遇到公司的vpn不能拨,只有一台对外的windows服务器。于是就想到了利用这个服务器进行端口映射。
windows下就使用portmap这个端口映射工具就可以很方便的实现这个功能。而且容易理解。没两下就搞定了。然后想到了如果这台是unix类的服务器,那该如何实现这个端口的映射呢?
记得以前使用过haproxy这个工具来实现。采用配置文件的方式,执行该命令,然后转发端口即可。如果没记错的话当时是只支持udp的,而不支持tcp。
以前也碰到过这个问题,也看到了ssh的这种实现方式,但是那时的技术基础还理解不了这个概念。
ssh端口映射命令格式:
ssh -p [port] -f -N -g -L dst_port:tunnel_host:src_host user@src_host
参数:
-p: 指定连接到src_host主机的端口(ssh端口);
-f: 后台运行该映射命令;
-N: 不执行远端命令,在只是转发端口时很有用(如果不指定该参数,则将会登录到远端主机);
-g: 允许远程主机连接本地转发端口;
-L: 将本地端口映射到远程主机端口;
-C: 执行数据压缩;
-R: 将远程主机端口映射到本级端口。
假设,有主机A和B(均为unix系统,且ssh端口都为22),想要用A来映射B的1521端口,则有(假设当前在A上):
ssh -p 22 -f -N -g -L 15210:host_A:1521 test@host_B
这样就实现了端口的转发,即我从主机A上访问15210端口就是访问了B上的1521端口。也就是说主机A承担了转发的中间管道(第15210号管道)的作用。通过这个管道我们就直接访问到了B。
与-L并行的还有-R和-D参数。
另外ssh在映射的之前,有个参数对是否可以开通映射做了限制:
AllowTcpForwarding yes/no
如果是yes就可以进行端口映射,反之则不行。
该参数在/etc/ssh/sshd_config这个文件中设置。
这个参数我在solaris 10里面发现了,在8里面却连/etc/ssh这个目录都没有,有的系统有这个配置文件,但是没有这个参数。不知道是不是ssh版本引起的。
两个参考链接:
http://www.diybl.com/course/6_system/linux/Linuxjs/20090309/160179.html
http://floss.zoomquiet.org/data/20070104103806/