본문 바로가기

Network/L7

Telnet Over SSL/TLS 과 SSH

안녕하세요.

얼마 전에 공부하다가 문득 이런 생각이 들었습니다.

 

"나는 잘 알려진 포트 중에서 몇 개나 알고 있을까?"

 

그래서 위키백과의 TCP/UDP 포트번호 문서를 찾아보다가, 992번 포트를 발견했습니다. 이 포트를 사용하는 프로토콜은 Telnet Over SSL/TLS, 즉 SSL/TLS 위에서 동작하는 Telnet 프로토콜이었습니다.

제가 알기론 Telnet은 과거에 원격 접속을 위해 사용되는 프로토콜이고, 통신 간 평문으로 전송되기 때문에 보안에 취약하다고 알고 있었습니다. 그래서 요즘은 암호화를 제공하는 SSH 프로토콜을 사용해 원격 접속한다고 알고 있었지요. 

 

그런데 "SSL/TLS 위에서 동작하는 Telnet이라니, 그럼 SSH 랑 다른 게 뭐지?"라는 생각이 들었고 이를 데모로 구현하며 공부해보고자 했습니다.

 

이번 글에서는 OSI 7 Layer에서 7계층 프로토콜인  Telnet Over SSL/TLS 와 SSH에 대해 알아보겠습니다.

또한 글의 이해를 위해 TCP 와 SSL/TLS에 대한 이해가 필요합니다. 두 개념에 대해 내용은 TCP와 TLS의 동작원리 #1, TCP와 TLS의 동작원리 #2 를 참고해 주세요.

 

포트(Port)와 Well-known-port

컴퓨터 네트워크에는 포트라는 개념이 있습니다. 포트 중 특정 용도로 사용하기 위한 포트는 포트번호를 고정해 사용하기로 약속했으며, 이를 잘 알려진 포트(well-knwon-port)라 합니다.

포트(port)는 소프트웨어에서는 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위이다. 주로 포트를 사용하는 프로토콜은 전송 계층 프로토콜이라 하며, 예를 들어 전송 제어 프로토콜(TCP)과 사용자 데이터그램 프로토콜(UDP)이 있다. 각 포트는 번호로 구별되며 이 번호를 포트 번호라고 한다.  포트 번호는 IP 주소와 함께 쓰여 해당하는 프로토콜에 의해 사용된다.

출처 : 위키백과

 

위키백과의 말을 조금 더 알기 쉽게 예시를 들어 알아보겠습니다.

 

제가 살고 있는 집에는 공간이 여러 개 있습니다. 이 공간들은 각각의 용도가 있으며, 각 공간들을 구분해야 합니다.

 

출처 : https://www.ilyoeconomy.com/news/articleView.html?idxno=43679

화장실을 쓰고 싶은데, 안방으로 들어가면 안 되니까요. 

각 공간에 들어가기 위해서는 을 열고 들어갑니다. 문이 어떤 공간으로 통할지는 문 앞에 표시하곤 하지요. 

 

이처럼 포트는 컴퓨터 소프트웨어의 서비스를 구분하기 위한 문입니다. 화장실로 통하는 문에 화장실 마크를 붙여놓는 것처럼, 컴퓨터도 각 소프트웨어들을 구분하기 위한 구분자를 사용합니다. 

이게 바로 포트이고, 포트는 0부터 65,535까지의 숫자로 표현합니다.

 

UDP 헤더. 출처 : https://www.geeksforgeeks.org/user-datagram-protocol-udp/

위 그림은 전송 계층 프로토콜인 UDP 프로토콜 패킷의 헤더입니다. 출발지와 목적지의 포트는 16비트로 표현합니다. 즉 2^16 만큼의 포트번호를 가지며, 이는 10진수로 변환하면 65,535 개의 포트번호를 가질 수 있음을 의미합니다.

그중 0번부터 1023번까지의 포트를 well-known-port 라 하며, 이 범위의 포트는 특정한 목적으로 사용하기로 약속했습니다.

 

Telnet 프로토콜

네트워크에서의 포트에 대해 이해해 봤습니다.

이번에는 OSI 7 Layer 중 응용 계층의 프로토콜인 Telnet 프로토콜에 대해 알아보겠습니다.

Telnet 프로토콜의 이름은 여러 유래가 있습니다. 아래와 같은 유래들이 있으나, 대부분 Telecommunication network로 사용하는 듯합니다.

 

  • Telecommunication network protocol
  • Teletype network
  • TErminal NETwork

 

Telnet은 사용자가 로컬 시스템에서 다른 원격 시스템에 접속해 명령을 실행할 수 있게 해주는 프로토콜입니다. 전송계층으로는 TCP 프로토콜을 사용하고, 포트는 23번 포트를 사용합니다.

 

하지만 이 Telnet은 치명적인 단점이 있습니다.

바로클라이언트와 서버 간 데이터 전송을 평문으로 한다는 점입니다.

원격 접속을 위해 아이디와 패스워드를 입력하거나, 원격지로 데이터를 전송할 때 암호화되지 않은 평문을 전송하기 때문에 모든 트래픽에 대한 내용이 오픈되어 있습니다.

 

따라서 요즘은 목적지의 포트가 잘 열려있는지 확인하는 용도로 많이 사용합니다.

telnet

위 그림과 같이 telnet [목적지 IP주소 혹은 호스트 주소] [포트번호]의 형태로 작성하면 해당 목적지의 포트번호가 사용할 수 있는 상태인지 확인할 수 있습니다. naver.com의 80번 포트에 telnet 요청을 해서 http 서비스를 사용 가능한 상태인지 확인해보고 있는 모습입니다.

 

 

SSH 프로토콜

SSH

SSH 프로토콜도 Telnet과 마찬가지로 원격 접속을 위한 프로토콜입니다. 다만 SSH는 SSL/TLS 암호화가 적용되었기 때문에, Telnet의 단점을 극복할 수 있습니다.(SSL/TLS에 대해 대한 내용은 이전 글을 참고해 주세요.)

 

전송 계층의 프로토콜로 TCP를 사용하며, 22번 포트를 사용합니다.

 

이 SSH 프로토콜을 사용해 암호화 기능을 제공하기도 합니다. 예를 들면 파일 전송 프로토콜인 FTP에 SSH 터널링 기능을 제공하여 전송 데이터를 암호화하는 SFTP 프로토콜이 그 예시입니다.

 

Telnet Over SSL/TLS

Telnet Over SSL/TLS는 말 뜻 그대로 SSL/TLS 위에서 동작하는 Telnet입니다.

즉 Telnet 프로토콜에 SSL/TLS를 적용해 암호화를 적용하는 겁니다.

그렇다면, 이게 SSH랑 뭐가 다른 걸까요?

 

SSH vs Telnet Over SSL/TLS

두 프로토콜의 가장 큰 차이점은, 설계 목적과 암호화 주체입니다.

두 프로토콜의 설계 목적과 암호화 주체를 표로 정리하면 아래와 같습니다.

  SSH Telnet Over SSL/TLS
암호화 주체 SSH 자체 암호화 프로토콜 SSL/TLS
설계 목적 원격접속 및 파일 전송 애플리케이션 보안(SSL/TLS)

 

 

SSH 프로토콜은 SSL/TLS를 기반으로 동작하지 않습니다.

SSH 자체 암호화 프로토콜을 사용합니다만, 그 과정은 SSL/TLS의 암호화 과정과 매우 유사합니다.

 

1. 사용할 암호화 알고리즘을 협상하고

2. 협상된 알고리즘으로 클라이언트-서버 간 암복호화에 사용할 대칭키를 교환하고

3. 대칭키를 사용해 이후의 통신을 암호화합니다.

 

더 자세한 암호화 과정이 궁금하신 분들은 TLS의 동작원리 #2 글을 참고해 주세요.

 

Wireshark 실습

실제로 Telnet Over SSL/TLS를 데모로 구현해서 암호화가 수행되는지 알아보겠습니다.

실습 환경 및 시나리오는 아래와 같습니다.

 

실습 환경

  • Telnet 서버(Ubuntu-server 24.04, 192.168.11.36)
  • Telnet 클라이언트(macOS, 192.16.10.84)

 

실습 시나리오

  • Telnet 프로토콜로 클라이언트에서 서버로 원격 접속
  • Telnet Over SSL/TLS를 사용해 암호화된 원격 접속(사용한 인증서는 셀프 서명된 인증서)

Telnet 프로토콜로 클라이언트에서 서버로 원격 접속

telnet 192.168.11.36 23
Trying 192.168.11.36...
Connected to 192.168.11.36.
Escape character is '^]'.
lm_will: not enough room in buffer for DISPLAY

Linux 6.8.0-1010-raspi (ubuntu.wisoft-network) (pts/0)

ubuntu login: ubuntu
Password: 
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-1010-raspi aarch64)

 

위처럼 telnet [목적지 IP 주소]를 통해 원격의 라즈베리파이 서버에 접속해 보았습니다.

 

Wireshark 패킷 캡쳐

이후 Telnet 클라이언트와 Telnet 서버 간 주고받는 패킷을 캡처해 본 내용입니다. 하위 프로토콜로 TCP를 사용하므로 TCP 연결 수립을 위해 3-way-handshake 과정을 거칩니다.

이후 Telnet 프로토콜이 동작합니다.

 

Telnet 프로토콜의 평문 데이터

주고받는 패킷의 일부를 캡처한 모습입니다.

이전에 언급한 대로, Telnet 프로토콜은 데이터를 평문으로 전송합니다. 따라서 원격 접속을 위해 사용자 계정을 입력하는 메시지가 모두 평문으로 전송됐고, 이를 네트워크 상의 패킷을 스니핑 해 볼 수 있습니다. 우분투 리눅스의 기본 계정인 ubuntu를 입력하고 엔터를 친 모양입니다.

이렇게 Telnet 프로토콜을 사용하게 되면 모든 데이터가 인터넷상에 오픈됩니다.

 

Telnet Over SSL/TLS 프로토콜로 클라이언트에서 서버로 원격 접속

stunnel 4, 범용 SSL/TLS 터널링 오픈소스 소프트웨어

Telnet 프로토콜을 SSL/TLS 위에서 동작시켜야 하므로 인증서가 필요합니다.

데모를 위한 실습이므로 인증서는 셀프 서명 한 인증서를 임시로 사용했고, 로컬 호스트와 원격 서버 간 ssl 터널링을 구현해 주는 stunnel4 소프트웨어를 통해 Telnet 프로토콜을 SSL/TLS 위에서 동작하도록 했습니다.

 

client = yes
[telnet]
accept = 127.0.0.1:992
connect = 192.168.11.36:992

 

stunnel 소프트웨어의 사용을 위한 설정 파일입니다.(stunnel.conf)

로컬호스트의 992번 포트로 접속하면, 원격 서버(192.168.11.36)의 992번 포트로 터널링 해 연결시켜 줍니다.

 

Wireshark 패킷 캡쳐

마찬가지로 Wireshark 프로그램으로 패킷을 캡처해 보았습니다.

TLS 연결을 수행하고 데이터들을 전부 암호화해서 전송하고 있습니다. 포트도 Telnet의 23번이 아닌 992번 포트를 사용하고 있습니다.

마치며

이번 글에서는 well-known-port 중 생소한 992번 포트에 대해 알아봤습니다. 원격 접속 프로토콜로서의 Telnet은 거의 사장됐다고 보는 게 맞지만, 어느 레거시에서 아직 이 프로토콜을 사용할지 모르기 때문에 공부할 필요가 있다고 생각했기에 이 글을 작성하게 되었습니다.

 

지적 및 질문을 댓글로 부탁드립니다.

감사합니다.

'Network > L7' 카테고리의 다른 글

FTP 프로토콜의 Active모드와 Passive모드 이해하기  (0) 2024.08.30