common-tools(4)之端口映射和SSH tunnel方式鏈接數據庫

       若是你們用過一些數據庫客戶端軟件,會發現裏面有一項是SSH,可使用SSH通道來鏈接到遠程主機的數據庫,此時咱們就可使用內網IP來直連數據庫了。不知道你們有多少是這麼用數據庫的,我想這麼設定確定是爲了安全吧。
        好麼,如今問題來了,我想用程序連一下這個數據庫該怎麼辦?那庫只有內網IP,那隻能用程序來模擬一個SSH通道了。
        我在網上一直找相關的類庫,一直沒有找到,最後在神奇的stackoverflow上找到一個回答才知道有個類庫叫作jsch,功能異常強大,我這水平通常,徹底沒有搞懂其餘功能,只發現了一個對本次主題有用的功能——端口映射。其實原理很簡單,就是你給定SSH登陸信息,登陸後產生一個Session會話,而後將服務器上的某個端口映射到本地,這樣就可使用本地鏈接來鏈接數據庫了。 java

        OK,先把這段代碼地址貼出來。https://github.com/looly/common-tools/blob/master/src/main/java/com/baijob/commonTools/net/SSHUtil.java git

        好的,咱們開始。先貼測試代碼 github

package com.baijob.commonTools;

import com.baijob.commonTools.net.SSHUtil;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class CommonTest {
	public static void main(String[] args) {
		Session session = SSHUtil.openSession("跳板機外網IP", 22, "username", "123456");
		try {
			boolean bindPort = SSHUtil.bindPort(session, "數據庫服務器內網IP", 3306, 3306);
		} catch (JSchException e) {
			e.printStackTrace();
		}
	}
}
這個類的使用方法異常簡單分紅兩個步驟:
step1:調用openSession方法SSH鏈接到一個遠程主機(咱們稱之爲跳板機),端口、用戶名、密碼要有
step2:調用bindPort方法把跳板機能夠登陸的那臺數據庫服務器的端口映射到本地,第一個參數是SSH Session,第二個參數是數據庫所在服務器的內網IP地址,第三個參數是遠程的端口,第四個參數是本機的端口
通過簡單的兩步,就能夠把遠程數據庫的3306端口映射到本地了(固然,本地這個端口是不能被佔的)

step3:咱們就能夠用JDBC鏈接此數據庫了,固然鏈接字符串是這樣的:localhost:3306 數據庫

其實不僅鏈接數據庫,咱們可使用此方式把服務器上任意端口映射下來使用(想一想把80端口映射下來的趕腳) 安全

其實在https://github.com/looly/common-tools/tree/master/src/main/java/com/baijob/commonTools/db/ds下已經自動集成了經過SSH tunnel鏈接數據庫的方法,只要按照https://github.com/looly/common-tools/blob/master/src/main/resources/config/db-example.setting的方式配置數據庫鏈接便可簡單的操做數據庫。這個後續再說。 服務器

最後爲雅安祈福吧,不知道他們的每一個夜晚是怎麼過來的…… session

相關文章
相關標籤/搜索