업무의 일부분으로
Oracle Cloud에 접속해야하는 부분을 테스트 해봐야 했다.
단순하게 접근하는게 아니라,
VPN이 구축되어 있고, 그 안에 서브넷이 나누어져 있고, 보통 DB의 경우 private subnet으로
외부에서 접근을 할 수 없도록 구성되어 있다.
그러면 도대체 어떻게 접속할 수 있느냐에 대한 해결책으로 SSH Tunneling이 있다는 것이다.
기본 조건
- SSH연결을 하기 위해 필요한 조건
- 원격으로 접속할 HostIP : "100.0.0.0" (예시)
- 유저 이름(username) : "abc"
- 비밀번호 : 암호화된 비밀번호일 수도 있고, 스프링의 경우 평문으로 암호를 추가하는 것과, private 키 파일을 통해서 접근하는 방식으로 나뉜다.
- 포트 : ssh연결이니 거의 22번 포트를 사용한다고 보면 된다.
public class SSHConnector {
private final static String remoteHost = "100.0.0.0";
private final static String user = "abc";
private final static String passwordPath = "키파일경로";
private final static int port = 22;
private Session session;
public void closeSSH() {
session.disconnect();
}
public SSHConnector() {
try {
JSch jSch = new JSch();
jSch.addIdentity(passwordPath);
session = jSch.getSession(user, remoteHost, port);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
}catch (Exception e){
e.printStackTrace();
}
}
}
- 주의해야할 점은 비밀번호를 키 파일로 가지고 있을 경우
- addIdentity를 써야 한다.
SSH 연결 후 Oracle Cloud와의 접속이 남아 있었다.
int localPort = session.setPortForwardingL(0, 포워딩 할 서브넷 IP주소, 포워딩할 포트);
System.out.println("연결성공");
String url = "jdbc:oracle:thin:@localhost:" + localPort + "/" + 서비스이름(Service Name)
Connection connection = DriverManager.getConnection(url, DB유저이름, DB비밀번호);
System.out.println("Connected to Oracle database via SSH tunneling!");
connection.close();
- 조건
- session.setPortFowardingL에대해 설명
- 첫번째 파라미터는 8080으로 두면
- 나의 컴퓨터(local)의 8080포트를 통해서 커넥션을 받아오려는 작업(연결)을 수행할 때
- 8080 -> 포워딩할 포트(세번째 파라미터)로 포워딩해준 다는 의미
- 0번으로 두면 자동으로 나의 컴퓨터(localhost)의 안 쓰는 포트를 할당해준다.(랜덤)
- 0번 말고 나의 컴퓨터(localhost)에서 안 쓰는 포트를 할당해주면 그 포트로 고정된다.
- 추후 properties나 yml에 설정을 변경해줄 수 있다. (고정이 된 경우)
- 두번째 파라미터는 내가 포워딩할 서브넷 IP주소를 의미한다.
- 예를 들어 oracle cloud의 private subnet에도 할당된 주소가 있을텐데 그 부분을 입력하면 된다.
- 세번째 파라미터는 포워딩할 포트이다.
- 첫번째 파라미터를 로컬(localhost)에서 (port - 8080) 접속했을 시에 (포워딩 할 IP주소) - (port - 9000)로 포워딩 해준다는 뜻
- 예시) localhost - 8080 -> 40.0.0.0 -> 9000번 포트로 포워딩해서 커넥션을 받아옴.
- 첫번째 파라미터는 8080으로 두면
- session.setPortFowardingL에대해 설명
- String url = "jdbc:oracle:thin:@localhost:" + localPort + "/" + 서비스이름(Service Name)
- 여기서 주의해야 할 점은 @뒤에 보통 내가 접속하려고 하는 DB의 IP를 입력한다. 100.0.0.0 이렇게 하면 안 된다.
- 꼭 localhost로 해줘야 한다.
- localPort는 위에서도 작성한 부분이 반영되어야 한다. 중요한건 내 컴퓨터(localhost)의 남는 포트라는 것.
- session.setPortFowardingL의 첫번째 파라미터와 일치해야 한다.
- 여기서는 간단하게 접속하고 커넥션을 다시 종료했는데,
- 고정된 포트를 설정하고, 시스템 설정만 잘 바꾸면 성공이다.
하나 알았던 점이 있는데
오라클의 SID와 Service Name의 차이점이였다.
SID: DB인스턴스 1개
Service Name: 여러개의 인스턴스를 묶어 하나의 서비스로 구성하는 것
JDBC를 사용하여 접근시 URL 작성도 달라진다.
SID의 경우 ":"을 사용한다.
jdbc:oracle:thin@20.20.20.20:ORA
Service Name의 경우 "/"을 사용한다.
jdbc:oracle:thin@20.20.20.20/ORA
참고 사이트
https://annajin.tistory.com/227
'네트워크 관련 > 네트워크' 카테고리의 다른 글
데이터링크 계층 (0) | 2022.12.26 |
---|---|
네트워크 토폴로지 (0) | 2022.12.21 |
유니캐스트, 멀티캐스트, 브로드캐스트 (0) | 2022.12.21 |