[AWS] ssh Tunneling
SSH Tunneling은 VPC 내부의 프라이빗 서버와 같은 외부에서 직접 접근할 수 없는 서버에 보안된 통신 채널을 설정하여 외부에서 안전하게 접근할 수 있는 방식입니다. 일반적으로 프라이빗 서브넷에 있는 EC2 인스턴스는 퍼블릭 인터넷과 직접적으로 연결되지 않기 때문에 외부에서 접근이 불가능하지만, SSH Tunneling을 사용하면 퍼블릭 네트워크를 통해 안전하게 통신할 수 있습니다.
SSH Tunneling이란?
SSH Tunneling은 SSH 프로토콜을 사용하여 암호화된 연결을 통해 네트워크 트래픽을 포워딩하는 방법입니다. 이를 통해 외부에서 프라이빗 네트워크에 있는 서버에 보안된 경로를 통해 접근할 수 있게 해줍니다.
SSH Tunneling을 사용하는 이유
1. 프라이빗 서버에 접근:
• AWS VPC에서 프라이빗 서브넷에 있는 서버는 퍼블릭 IP가 없기 때문에 직접적으로 접근할 수 없습니다.
• 퍼블릭 서브넷에 있는 Bastion 호스트 또는 퍼블릭 IP가 있는 서버를 경유하여 SSH Tunneling을 통해 프라이빗 서버에 접근할 수 있습니다.
2. 보안:
• 모든 트래픽이 SSH 프로토콜로 암호화되기 때문에, 외부 네트워크에서 통신을 도청당할 위험을 줄일 수 있습니다.
• 외부 네트워크에서는 직접 접근할 수 없는 서버에 간접적으로 접근할 수 있어, 보안성이 강화됩니다.
SSH Tunneling의 동작 방식
SSH Tunneling은 로컬 컴퓨터에서 원격 서버로의 SSH 연결을 통해 포트 포워딩을 설정하는 방식입니다. 이 과정에서 Bastion 호스트와 같은 중간 서버를 통해 프라이빗 서브넷에 있는 서버에 접근할 수 있게 됩니다.
1. Bastion 호스트 사용 시 SSH Tunneling:
• Bastion 호스트는 퍼블릭 서브넷에 위치한, 외부에서 접근 가능한 EC2 인스턴스입니다.
• 외부에서 프라이빗 서브넷에 있는 서버에 직접 접근할 수 없기 때문에, Bastion 호스트를 경유하여 프라이빗 서버로의 SSH 연결을 설정합니다.
2. SSH Tunneling으로 프라이빗 서버에 접근:
• 로컬 컴퓨터에서 SSH 명령어를 통해 터널을 설정하고, 로컬 포트를 통해 프라이빗 서버에 간접적으로 접근할 수 있습니다.
• 터널은 Bastion 호스트를 통해 설정되며, 로컬 포트에서 Bastion 호스트를 경유해 프라이빗 서버로 트래픽이 전달됩니다.
SSH Tunneling 설정 과정
다음은 SSH Tunneling을 통해 외부에서 프라이빗 서브넷의 서버에 접근하는 과정입니다:
1. Bastion 호스트 생성
• 먼저 퍼블릭 서브넷에 **Bastion 호스트(EC2 인스턴스)**를 생성합니다.
• 이 인스턴스는 퍼블릭 IP를 가지고 있어 외부에서 SSH 접속이 가능합니다.
2. SSH Tunneling 설정 (로컬에서 터널 열기)
로컬 컴퓨터에서 SSH Tunneling을 설정하여 프라이빗 서버에 접근하는 명령은 다음과 같습니다:
ssh -i "bastion-key.pem" -N -L 33322:<private-instance-ip>:22 ec2-user@<bastion-public-ip>
• -i 옵션: Bastion 호스트에 접근하기 위한 프라이빗 키 (bastion-key.pem)을 지정합니다.
• -N 옵션: 터널링만 하고, 원격 서버에서 명령을 실행하지 않도록 설정합니다.
• -L 옵션: 로컬 포트 포워딩을 설정합니다.
• 33322: 로컬 컴퓨터에서 사용할 포트 번호입니다. 예를 들어, localhost:33322로 접근하면 프라이빗 서버로 트래픽이 전달됩니다.
• <private-instance-ip>: 프라이빗 서브넷에 있는 프라이빗 서버의 IP 주소입니다.
• 22: 프라이빗 서버로 SSH 접속 시 사용할 포트 번호(기본적으로 22번)를 의미합니다.
• ec2-user@<bastion-public-ip>: Bastion 호스트의 퍼블릭 IP 주소와 SSH 접속 시 사용할 사용자입니다. AWS에서 기본적으로 ec2-user를 사용합니다.
3. 로컬 컴퓨터에서 프라이빗 서버에 접속
터널이 열리면, 로컬에서 프라이빗 서브넷의 서버에 SSH로 접근할 수 있습니다. 다음 명령어를 통해 프라이빗 서버에 접속할 수 있습니다:
ssh -i "private-key.pem" -p 33322 ec2-user@localhost
• -i 옵션: 프라이빗 서버에 접근하기 위한 프라이빗 키 파일 (private-key.pem)을 지정합니다.
• -p 33322: 앞서 설정한 로컬 포트 33322를 사용하여 SSH 접속을 시도합니다.
• ec2-user@localhost: 로컬호스트에 접속하면서, 로컬 포트 포워딩을 통해 프라이빗 서버에 접속합니다.
이 명령어를 통해 Bastion 호스트를 경유하여 프라이빗 서버에 접근할 수 있습니다.
SSH Tunneling의 전체 흐름 요약
1. 로컬 컴퓨터에서 Bastion 호스트로 SSH 연결을 설정하고, 프라이빗 서버로 트래픽을 전달하기 위한 **포트 포워딩(SSH Tunneling)**을 설정합니다.
2. 터널을 열고, 로컬 포트를 통해 프라이빗 서버에 접근할 수 있도록 설정합니다.
3. 터널을 통해 로컬 컴퓨터에서 프라이빗 서버로 SSH 접속을 시도하면, 트래픽이 Bastion 호스트를 경유하여 전달됩니다.
4. 이렇게 설정된 SSH Tunneling은 암호화된 통신을 보장하며, 안전하게 프라이빗 서버에 접근할 수 있게 해줍니다.
결론
SSH Tunneling은 프라이빗 서브넷에 있는 서버에 안전하게 접근하기 위한 효과적인 방법입니다. 퍼블릭 서브넷에 있는 Bastion 호스트를 통해 프라이빗 서브넷의 서버에 간접적으로 접근할 수 있으며, 모든 통신이 암호화되어 보안성이 강화됩니다. 이 방식은 특히 VPC와 같은 클라우드 환경에서 프라이빗 서버에 안전하게 접근할 때 매우 유용합니다.
*추가 질문*
질문: 왜 로컬과 프라이빗 EC2를 바로 연결하는 것처럼 보이는가?
(2개의 ssh키 : 로컬 -> bastion, 로컬 -> ec2(private) 이렇게 설정 하게된다. 하지만 bastion을 경유할탠데, 왜 로컬 -> ec2(private)으로 키를 설정하는가?(바로 연결되는 것 처럼 보임)
실제로 로컬에서 프라이빗 서브넷의 EC2로 바로 연결하는 것이 아닙니다. SSH 터널링을 통해 프라이빗 EC2에 접근하고 있지만, 이 연결은 Bastion 호스트를 경유하는 방식입니다. 하지만 사용자가 터널링된 포트를 통해 접근할 때, Bastion을 경유하고 있다는 사실을 투명하게 처리하므로, 마치 로컬에서 바로 프라이빗 EC2에 연결하는 것처럼 보입니다.
즉, SSH 터널링을 설정하면, Bastion 호스트는 중간 경유지 역할을 하며, 터널을 통해 트래픽을 로컬에서 프라이빗 EC2로 전달합니다. 하지만 이 과정은 자동으로 처리되기 때문에 사용자는 이를 신경 쓸 필요 없이, 로컬에서 바로 프라이빗 EC2로 연결하는 것처럼 보입니다.