Telnet 네트워크 통신

낚시하는 곰·2025년 3월 27일

krafton jungle

목록 보기
21/52

Telnet이란?

Telnet은 원격지 컴퓨터에 접속해서 터미널(명령어 입력창) 을 사용할 수 있게 해주는 텍스트 기반 통신 프로토콜이다.

  • 프로토콜 계층: TCP/IP 위에서 동작해. 즉, TCP를 이용해서 통신한다.
  • 포트 번호: 기본적으로 23번 포트를 사용한다.

언제 쓰이는가?

  • 리눅스 서버에 원격 접속해서 쉘을 실행할 때.
  • 장비나 서비스가 특정 포트를 열고 있는지 확인할 때.
  • (보안상 요즘은 거의 SSH로 대체됨)

시스템 동작 흐름 (Flow)

상황: 클라이언트가 Telnet을 사용해 서버에 접속할 때

[User Input] → [Telnet Client Process] → [TCP Packet 생성] → 
→ [Network Stack 처리] → [패킷 전송] → 
→ [Server Port 23에 도착] → [서버의 telnetd 프로세스] → [응답]

OS 관점에서 어떤 일이 일어날까?

클라이언트 측:

  1. 사용자가 telnet <IP> <port> 입력 → telnet 클라이언트 프로세스 생성
  2. 프로세스가 소켓 생성socket() 시스템 콜
  3. 서버에 TCP 연결 시도connect() 시스템 콜
  4. 커널이 네트워크 드라이버 통해 패킷 전송

서버 측:

  1. 포트 23을 listen 중인 telnet 서버 프로세스(telnetd)가 있음
  2. 커널이 패킷 수신 → 해당 포트 연결 수락 → accept() 시스템 콜
  3. 새로운 telnet 세션을 위한 자식 프로세스 fork
  4. 사용자 입력 받아 쉘 (/bin/sh) 과 연결

Telnet 시스템 콜 및 데이터 흐름 요약

사용자 입력
   ↓
telnet 클라이언트 프로세스
   ↓ (socket())
소켓 생성
   ↓ (connect())
TCP 연결 요청
   ↓
클라이언트 커널 네트워크 스택
   ↓
패킷 전송 → 서버 네트워크 수신
   ↓ (accept())
telnetd가 연결 수락
   ↓ (fork())
새 telnet 세션 프로세스 생성
   ↓
쉘 (/bin/sh) 실행 및 바인딩
   ↓
클라이언트와 명령어/출력 송수신 반복

왜 안 쓰이게 되었을까?

  • Telnet은 모든 데이터가 평문(plaintext) 으로 전송돼서 보안에 매우 취약해.
  • 대신 요즘은 SSH(Secure Shell) 을 사용해서 암호화된 통신을 해.

Telnet 대신 SSH를 사용하는 이유

1. 평문 전송 문제

  • Telnet은 로그인 정보, 명령어, 출력 결과 모두를 암호화 없이 전송함.
  • 네트워크 스니핑 툴로 쉽게 탈취 가능 (예: Wireshark로 패킷 분석 시 평문 확인 가능)

2. SSH는 암호화된 채널 사용

  • 공개키 암호화 + 대칭키 암호화 조합으로 데이터를 보호함.
  • 통신 초기 handshake 후에는 대칭키로 빠르고 안전하게 데이터 송수신.

3. 다양한 인증 방식 제공

  • Telnet은 단순 ID/PW 인증만 가능.
  • SSH는 비밀번호, 공개키, 2FA 등 다양한 인증 방식 지원.

4. 보안 설정 및 접근 제어 강화

  • SSH는 접속 IP 제한, 로그인 시도 제한, 포트 변경, 로그 기록 등 세부 보안 설정 가능.

5. 패킷 위조 및 중간자 공격 방지

  • Telnet은 세션 탈취나 패킷 위조에 취약함.
  • SSH는 무결성 체크와 MAC(Message Authentication Code)을 통해 보안 유지.

비유:

  • Telnet은 엽서처럼 누구나 내용을 볼 수 있음.
  • SSH는 봉투에 담긴 편지처럼 당사자 외에는 읽을 수 없음.

이메일을 받을 수 있는 이유

전체 흐름 요약

이메일은 송신자가 작성한 메시지를 중간 서버(Mail Server) 를 거쳐, 내 메일 서버에 저장하고, 내가 클라이언트를 통해 꺼내보는 구조이다.

1. 이메일 작성 및 전송 (SMTP)

  • 발신자가 이메일 클라이언트에서 작성 후 전송
  • SMTP 프로토콜로 발신자의 메일 서버에 전달
  • 수신자의 메일 서버로 라우팅됨

2. 수신자 서버에 저장

  • 수신자의 메일 서버가 메일을 수신하고 저장
  • 메일박스 디렉터리에 계정별로 보관

3. 수신자가 메일을 읽음 (IMAP 또는 POP3)

  • 사용자가 클라이언트나 웹메일로 접속
  • IMAP 또는 POP3 프로토콜로 메일을 가져옴
  • 메일 내용이 클라이언트에 복사되거나 동기화됨

실제 흐름 예시

[보낸 사람 입력 → 메일 클라이언트] 
     ↓ SMTP
[보낸 사람 메일 서버]
     ↓ DNS 조회 → 수신자 도메인의 MX 레코드 조회
[수신자 메일 서버]
     ↓ 저장
[내 이메일 클라이언트] ← IMAP 또는 POP3
     ↓
[받은 편지함에서 확인]

핵심 요소

  • 이메일 주소 (you@example.com)
  • DNS 시스템을 통한 수신자 메일 서버 위치 파악
  • SMTP/IMAP/POP3 프로토콜에 따른 통신
  • 메일 서버에 저장된 데이터에 대한 클라이언트 접근

즉, 내가 이메일을 받을 수 있는 이유는:
1. 메일 주소 체계 덕분에 정확한 수신자 식별이 가능하고
2. DNS 시스템으로 메일 서버 위치를 찾고
3. 프로토콜로 통신하며
4. 메일 서버가 메일을 저장해두고 있기 때문에,
5. 내가 클라이언트를 통해 요청하면 응답해주는 구조이기 때문이야.


네트워크 어댑터가 바이트를 복사할 수 있는 이유

네트워크 어댑터(NIC)는 DMA(Direct Memory Access) 기능을 이용해 수신한 데이터를 CPU 개입 없이 메인 메모리로 직접 복사할 수 있다.

전체 흐름 요약

  1. NIC가 이더넷 프레임을 수신함
  2. DMA를 통해 커널이 지정한 메모리 버퍼로 데이터 복사
  3. NIC가 인터럽트를 발생시켜 운영체제에 데이터 도착을 알림
  4. 운영체제는 해당 데이터를 소켓 수신 버퍼로 복사
  5. 사용자 프로세스는 recv() 시스템 콜을 통해 데이터를 읽음

핵심 기술: DMA

  • CPU 없이 장치가 메모리에 직접 접근 가능
  • CPU의 부하 감소, 빠른 입출력 처리 가능

데이터 흐름 요약

[이더넷 프레임 도착] 
        ↓
[NIC 하드웨어] 
        ↓ (DMA)
[커널 공간의 수신 버퍼 (메인 메모리)]
        ↓ (Interrupt)
[운영체제에 알림] 
        ↓ (recv())
[사용자 공간]

책에서 "네트워크 어댑터가 바이트를 복사한다"는 표현은 정확히 말하면,

NIC가 DMA를 사용해 커널 메모리 버퍼에 데이터를 복사하는 것을 의미한다.


링버퍼와 컴퓨터 시스템의 관계

링버퍼(Ring Buffer)란?

  • 고정 크기의 순환형 큐 구조로, 읽기/쓰기 포인터가 앞뒤로 순환하면서 데이터를 저장/읽는 구조이다.

시스템에서 왜 중요한가?

1. 입출력 장치와 커널 사이의 버퍼

  • NIC, 디스크, 사운드 카드 등에서 수신 데이터를 일시 저장하기 위해 사용됨
  • 예: NIC가 수신한 패킷 → DMA로 수신 링버퍼에 저장

2. 인터럽트 최적화

  • 수많은 인터럽트를 줄이고, 일괄 처리(batch) 로 성능 향상
  • 디바이스가 데이터를 링버퍼에 쌓고, 한 번에 커널에 알림

3. 커널 공간 ↔ 사용자 공간 데이터 이동

  • 소켓 수신, 파일 입출력 등에서 중간 버퍼 역할

4. 락 없는 동기화

  • 읽기/쓰기 포인터만 관리하면 락 없이도 동기화 가능
  • 고성능 네트워크 시스템, 멀티쓰레드 환경에서 많이 사용

시스템 흐름 예시 (NIC 기준)

[이더넷 프레임 도착]
       ↓
[NIC 하드웨어]
       ↓ DMA
[커널 메모리 내 수신 링버퍼]
       ↓ 인터럽트 또는 polling
[커널 네트워크 스택]
       ↓
[사용자 소켓 수신 버퍼]

요약

링버퍼는 데이터 흐름을 끊기지 않게 유지하면서도, CPU 부담을 줄이고, 고속 입출력을 가능하게 하는 핵심 구조이다.


Polling vs Interrupt

정의 및 차이

항목PollingInterrupt
동작 방식CPU가 상태를 계속 검사디바이스가 CPU에게 알림
CPU 사용바쁨, 비효율효율적, 필요할 때만 사용
반응 속도즉각적 (계속 검사 중)다소 지연될 수 있음
예시단순 키보드 입력, 타이머NIC, 디스크 I/O

흐름 비교

Polling

while (1) {
    if (device_ready()) {
        data = read_from_device();
    }
}
  • CPU가 디바이스를 끊임없이 확인하는 방식
  • CPU 자원이 낭비될 수 있음

Interrupt

[작업 중인 CPU]
   ↓
[디바이스: "데이터 도착!"] → interrupt 발생
   ↓
[커널의 interrupt handler 실행 → 데이터 처리]
  • 디바이스가 먼저 알림을 보내는 방식
  • CPU는 다른 작업을 하다가 반응함

하이브리드 방식: NAPI (Linux)

  • 처음엔 인터럽트 사용
  • 트래픽이 많아지면 polling으로 전환 (성능 최적화)

요약

Polling은 "왔어?"를 계속 묻는 방식, Interrupt는 "왔어!"라고 알려주는 방식이다.


Network Adapter vs Network

구분Network AdapterNetwork
정의컴퓨터에 장착된 네트워크 인터페이스 하드웨어컴퓨터들이 연결된 전체 통신 구조
예시이더넷 카드, Wi-Fi 모듈 (NIC)LAN, WAN, 인터넷 등
역할데이터 전기신호 ↔ 디지털로 변환 및 전송IP 기반 통신 경로, 라우팅, 주소 할당 등 담당
층위OSI 1~2계층 중심 (물리, 링크 계층)OSI 3계층 이상 포함 (네트워크, 전송, 응용)
위치내 컴퓨터 내부컴퓨터 간 외부 구조

쉽게 말하면?

  • Network Adapter: 내가 말을 꺼낼 수 있게 해주는 입
  • Network: 그 말이 도달할 수 있게 해주는 길 전체

실제 흐름 예시

[User Process 데이터] 
   ↓
[소켓 → TCP/IP 스택]
   ↓
[Network Adapter (NIC)]
   ↓ 전송 (이더넷 프레임)
→ [Network: 라우터, 인터넷, ISP 등]
   ↓
[수신자 컴퓨터의 Network Adapter]
   ↓
[운영체제 → 소켓 → 사용자 공간 복사]

정리:

  • Network Adapter내가 네트워크에 참여할 수 있도록 해주는 장치
  • Network그 참여자들 간의 연결망 전체를 뜻한다

Telnet을 이용해 리모트에서 hello 프로그램을 실행할 수 있는 이유

결론 먼저 말하자면:

Telnet은 리모트 컴퓨터의 쉘(/bin/sh) 과 연결되는 터미널을 만들어주기 때문에,
명령어를 입력하면 그 명령어가 원격 컴퓨터에서 실행되고 결과가 다시 전송되는 구조이다.

흐름으로 이해해보자

예시 상황:

telnet 192.168.0.10

→ 접속 후:

./hello

→ 이 경우 hello 프로그램은 192.168.0.10 컴퓨터에서 실행된다.

시스템에서 일어나는 일

  1. Telnet 클라이언트가 서버에 TCP 연결 요청
    • 서버의 port 23에서 telnetd 프로세스가 대기 중
  2. telnetd는 연결을 수락하고, 자식 프로세스를 fork()
    • 자식 프로세스는 사용자 세션을 담당하며 /bin/sh 또는 bash를 exec()
  3. 나의 명령어 입력은 TCP를 통해 서버로 전달됨 (./hello\n)
    • 이 입력은 쉘의 stdin에 전달됨
  4. 쉘이 해당 명령어를 실행 (./hello)
    • stdout으로 실행 결과 출력
  5. 출력 결과는 다시 TCP로 내 터미널에 전송됨

흐름 요약 그림

[내 입력: ./hello]
     ↓ (TCP)
[서버의 telnetd → fork → /bin/sh]
     ↓
[hello 실행 → 결과 출력]
     ↓ (stdout)
     ↓ (TCP 패킷)
[내 터미널 출력]

왜 hello가 리모트 컴퓨터에서 실행될까?

  • 명령어는 텍스트지만, 실행은 서버의 쉘이 담당
  • telnet은 원격 터미널을 제공하는 구조이기 때문
  • hello 프로그램이 해당 위치에 존재하고 실행 권한이 있다면 실행 가능

보안상 이슈

  • Telnet은 모든 데이터를 평문으로 전달함
  • 로그인 정보, 명령어 모두 노출 가능
  • 악성 명령어 제한 없이 실행 가능 (예: rm -rf /)
  • 그래서 현재는 SSH로 대체되는 것이 일반적

리모트 컴퓨터(Remote Computer)란?

정의

내가 사용 중인 로컬 컴퓨터가 아닌, 네트워크를 통해 원격으로 접속하는 컴퓨터를 의미한다.

로컬 vs 리모트 비교

구분로컬 컴퓨터리모트 컴퓨터
위치내가 사용하는 컴퓨터물리적으로 떨어져 있음
조작 방식직접 조작 (키보드/마우스)Telnet, SSH, RDP 등으로 조작
예시내 노트북, 데스크탑회사 서버, 클라우드 서버, 사무실 컴퓨터

예시 상황

telnet 192.168.0.10

→ 여기서 192.168.0.10리모트 컴퓨터 (원격 접속 대상)

왜 필요한가?

  • 서버 관리, 클라우드 제어, 원격 개발 등을 위해 사용
  • 내 컴퓨터에서 직접 갈 수 없는 장소에 있는 컴퓨터를 제어할 수 있음

한 줄 정리

리모트 컴퓨터는 내 컴퓨터가 아닌, 네트워크로 연결된 다른 컴퓨터다.


profile
취업 준비생 낚곰입니다!! 반갑습니다!!

0개의 댓글