一、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端口。從跳轉機到目的地是沒有任何端口限制的。
拓撲如下:
在跳轉機上操作如下
ssh -L0.0.0.0:65530:rac-1:1521 -N 10.0.0.1 -p 222 -f
在sqldeveloper上配置如下:
之後測試連接,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服務
Yes,netstat-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配置如下:
最終的命令如下:
[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類型,也就是本地轉發,我把兩條命令的數據流向畫了一下。
兩條命令的數據流向圖如下
以第一個爲例,第二個相同:
客戶端發起到10.0.0.1的65530端口的連接,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端口轉發配置舉例
以這次的測試爲例,拓撲圖如下:
Step0:在客戶的上ssh10.0.0.1 222和ssh 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-1和rac-2對應的ip寫到/etc/hosts中(不寫的話你在ssh命令中就不能寫rac-1這個name了,你需要寫rac-1的ip)
Step4:在客戶的上用sqldevelop測試,或者用telnet測試:telnet10.0.0.1 65530。應該是可以連通的
3、注意事項
需要注意的一點是,我的跳轉機是redhat6.4的系統,默認是打開ssh的AllowTcpForwarding功能的。如果你配置ssh端口轉發不成功的話,不妨檢查一下該項配置,man sshd_config,然後搜索allowtcpforwarding,就像我這裏,默認是打開的。要記得打開該配置呀。
防火牆和selinux什麼的我就不說了,關閉就行了。另外,有人可能會問ip_forward是不是必須要打開呀?你覺得呢?我這裏就一塊網卡,轉發個球啊,默認的net.ipv4.ip_forward = 0
就行了。