SSH tunneling

진영민·2023년 2월 28일
0

잡다한 상식

목록 보기
15/22
post-custom-banner

SSH란?

Secure Shell의 줄임말, 원격 호스트에 접속하기 위해 사용하는 보안 프로토콜

클라이언트와 서버가 각각의 키를 보유하여 연결 상대를 인증하고 안전하게 데이터를 주고받는다.
주로 22번 포트를 사용한다.(바꿀 수 있다.)

SSH 포트 포워딩

하나의 컴퓨터 안에서 포워딩

상황 설정

웹 서버가 있다고 가정해 보자. 해당 서버에는 보안상의 이유로 22번 포트를 제외한 모든 포트가 막혀 있다. 따라서 SSH 말고는 해당 컴퓨터에 접근할 수 없다.

해결 방안

SSH 터널링을 이용하여 22번 포트로 들어오는 정보를 서버 내부에서 80번 포트로 옮길 수 있다.

두 개의 컴퓨터 안에서 포워딩

local 포트 포워딩

상황 설정

만약, 컴퓨터A는 방화벽이 있어 외부 아이피로는 접근할 수 없다고 가정해 보자.
또한, 내부 전산망에 22번 포트가 열린 접속 가능한 컴퓨터B가 있다고 가정하자.

이런 상황이라면, 컴퓨터B는 내부망에 있기 때문에 컴퓨터A에 접근할 수 있다.
또한, 외부 사용자는 컴퓨터B에 22번 포트로 연결할 수 있다.

해결 방안

컴퓨터B에서 컴퓨터 A와 터널링을 진행한다.

컴퓨터B에서 다음의 명령어를 입력한다.
ssh -L 3000:localhost:2555 (컴퓨터A의 IP주소)

컴퓨터B에 컴퓨터A의 키가 있어 ssh 연결이 가능하다면
컴퓨터B의 3000번 포트를 점유하여 3000번 포트로 들어온 요청을 컴퓨터A의 2555번 포트로 포워딩 할 수 있다.

remote 포트 포워딩

상황 설정

local 포트 포워딩에서는 컴퓨터B가 컴퓨터A에 접근할 수 있었다.
하지만 이번에는 컴퓨터B 또한 외부망에 있어 컴퓨터A에 접근할 수 없다고 가정해 보자.
물론, 컴퓨터A는 우리가 직접 조작할 수 있다.

해결 방안

방화벽 밖에서는 방화벽 안으로 연결을 할 수 없기 때문에, 방화벽 안에서 방화벽 밖의 컴퓨터B로 tunnel을 뚫는다.

컴퓨터A에서 다음의 명령어를 입력한다.
ssh -R 3000:localhost:2555 (컴퓨터B의 IP주소)

3000번 포트로 들어온 요청을 컴퓨터A의 2555번 포트로 포워딩 한다.
방화벽은 방화벽 안의 컴퓨터에게 들어오는 요청은 막지만, 방화벽 안에서 밖으로 가는 요청은 막지 않는다는 것을 이용한 전략이다.

장단점

방화벽은 괜히 만든것이 아니다. 외부의 접속을 차단하기 위해 만든 것이지만, 우리는 굳이 구멍을 뚫어 외부에서의 접근을 허용하였다. 따라서 보안상의 문제가 발생할 수 있다.

시행착오

내가 처음 SSH remote를 시도했을 때, 외부의 ec2를 이용하여 방화벽 안에 있는 서버 컴퓨터에 접근하고자 하였다.
편의를 위해 방화벽 안에 있는 컴퓨터는 컴퓨터A, ec2는 컴퓨터B라고 칭하겠다.

처음에는ssh -R 3000:localhost:3000 (컴퓨터B의 IP주소)명령어를 이용하여 터널을 뚫었다.
netcat을 통해 컴퓨터B에서 컴퓨터A로 정상적인 데이터 전달이 이루어졌다.

또한, 컴퓨터B의 모든 포트를 열어둔 탓에, 컴퓨터B는 외부의 모든 요청을 받을 수 있다.

컴퓨터B의 3000번 포트에 요청을 보냈을 때, 컴퓨터A에 띄워놓은 서버로 요청이 전달되기를 기대했지만, 컴퓨터A의 서버에는 응답을 하지 않았다.

오랜 시간 구글링을 한 결과, sshd_config파일을 수정해야 한다는 것을 알았다.
vim을 이용하여 /etc/ssh/sshd_config 파일을 수정하였다.

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes

의 설정을 해 주자, 연결이 정상적으로 동작하였고,

TCPKeepAlive no
ClientAliveInterval 120
ClientAliveCountMax 10

의 설정을 하여 연결이 계속 지속되게 하였다.

profile
코린이
post-custom-banner

0개의 댓글