一、ssh端口转发连接数据库

  今天发现了一个好玩的功能,让ssh服务监听2个端口,并且使用ssh端口转发用这两个端口登录远程的rac数据库。以前都是让ssh服务监听一个端口并且开一个端口转发,没想到可以监听多个端口。

  为什么要这样呢?集团的***登录一直都限制1521端口、限制外网的22端口,所以如果在家用这个接入平台的话,就只能将服务器的ssh端口换一个,这个规则很讨厌,每次我都是登录到vcenter上修改服务器的ssh端口,例如改成222。但公司内部不限制22端口,每次到公司,我再把这个端口改回来。其实不改也行,在xmanager上设置222端口也是可以的,但你也许不明白强迫症人的心理......

  今天在家里发现还是无法连接公司数据库的1521端口,都TM这么多年了,还者鸟样,还是用ssh端口转发试一下吧.

  我先说一下目的吧:因为公司禁止1521端口,禁止22端口,所以无法直接ssh到两台rac服务器(当然也可以修改rac服务器的ssh端口来登录上去),也无法通过sqldeveloper连接到实例。有一台跳转机开了222端口,可以ssh。所以我需要先ssh到跳转机的222端口(这个是允许的,估计也是个漏洞吧),之后在这台跳转机上建立个ssh加密通道,转发流量到2个目的地的1521端口。从跳转机到目的地是没有任何端口限制的。

 

拓扑如下:

wKioL1c5jFaBXgzXAAEd5bxL0G0288.jpg

 

在跳转机上操作如下

ssh -L0.0.0.0:65530:rac-1:1521 -N 10.0.0.1 -p 222 -f

 

sqldeveloper上配置如下:

wKiom1c5i7ihB9DKAAEE6HNJn8w644.jpg

之后测试连接,OK,能够通。

之后连接racdb2实例,但222端口只能建立一个ssh通道,怎么办呢?让sshd服务再监听另外一个端口可以吗?试一下:

Vim/etc/ssh/sshd_config

在添加一行Port 223,最终结果如下:

[root@scd ~]# grep-i port /etc/ssh/sshd_config

Port 222

Port 223

 

之后重启sshd服务

Yesnetstat-ntplu|grep 22发现真的是OK

[root@scd ~]#netstat -ntplu|grep 22

tcp        0     0 0.0.0.0:222    0.0.0.0:*                   LISTEN      8802/sshd          

tcp        0     0 0.0.0.0:223    0.0.0.0:*                   LISTEN      8802/sshd          

tcp        0     0 :::222        :::*                        LISTEN      8802/sshd          

tcp        0     0 :::223        :::*                        LISTEN      8802/sshd

 

之后就可以打开第二个转发通道了

ssh -L0.0.0.0:65531:rac-2:1521 -N 10.0.0.1 -p 223 -f

 

Sqldeveloper配置如下:

wKioL1c5jL7zO4huAAEE6HNJn8w501.jpg

wKioL1c5jNWx5yufAAEPWD1sAkY002.jpg

最终的命令如下:

[root@scd ~]# moressh_port_forward.txt

ssh -L0.0.0.0:65530:rac-1:1521 -N 10.0.0.1 -p 222 -f

ssh -L0.0.0.0:65531:rac-2:1521 -N 10.0.0.1 -p 223 -f

 

[root@scd ~]# grep-i port /etc/ssh/sshd_config

Port 222

Port 223

# Disable legacy(protocol version 1) support in the server for new

#GatewayPorts no

二、ssh端口转发原理与举例

1、ssh端口转发原理

原理讲起来有些麻烦,还是引用一篇IBM developerworks上的一篇文章吧,

https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/

我这里就不细说了。

我想说的是在我这里用的是local类型,也就是本地转发,我把两条命令的数据流向画了一下。

两条命令的数据流向图如下

wKiom1c5jBThJTcOAAIqxATLsww591.jpg

以第一个为例,第二个相同:

  客户端发起到10.0.0.165530端口的连接,10.0.0.1接收到数据后转到本地的222端口,实际上就是跳转机的65530端口和222端口建立了一条加密通道,之后10.0.0.1解密数据,在转发到rac-1这台服务器的1521端口。

  实际上这里涉及到了3台服务器:

1、跳转机(65530端口的服务器)

2、和跳转机建立通道的另一端的服务器(222端口的服务器),没想好该叫什么,暂时就这么叫吧

3、目的地服务器(rac-1)

只是我这里3台服务器都合并成一台设备了,所以显得我这里的命令有些奇怪,但只要掌握了数据流向就可以熟练应用了。

2、Ssh端口转发配置举例

以这次的测试为例,拓扑图如下:

wKiom1c5jEfiFGogAAFvV3l_VGA353.jpg

Step0:在客户的上ssh10.0.0.1 222ssh 10.0.0.1 223测试客户端到跳转机的连通性,必须能够连通,之后的配置才有意义。

 

Step1:在跳转机上添加如下两条命令

ssh -L0.0.0.0:65530:rac-1:1521 -N 10.0.0.1 -p 222 -f

ssh -L0.0.0.0:65531:rac-2:1521 -N 10.0.0.1 -p 223 -f

-L/-N/-f选项的意义,自己man吧,应该都能读懂

 

Step2:在跳转机上修改sshd_config,添加2个允许ssh的端口,并重启sshd

Port 222

Port 223

 

Step3:在跳转机上将rac-1rac-2对应的ip写到/etc/hosts(不写的话你在ssh命令中就不能写rac-1这个name了,你需要写rac-1ip)

 

Step4:在客户的上用sqldevelop测试,或者用telnet测试:telnet10.0.0.1 65530。应该是可以连通的

 

3、注意事项

  需要注意的一点是,我的跳转机是redhat6.4的系统,默认是打开sshAllowTcpForwarding功能的。如果你配置ssh端口转发不成功的话,不妨检查一下该项配置,man sshd_config,然后搜索allowtcpforwarding,就像我这里,默认是打开的。要记得打开该配置呀。

wKiom1c5jHXR3Xd8AAFrsypFuFo981.jpg

防火墙和selinux什么的我就不说了,关闭就行了。另外,有人可能会问ip_forward是不是必须要打开呀?你觉得呢?我这里就一块网卡,转发个球啊,默认的net.ipv4.ip_forward = 0

就行了。