Alert

이 글은 Claude Code의 도움을 받아 작성되었습니다

알아볼 내용

  1. 방화벽의 개념과 동작 원리
  2. 포트와 방화벽의 관계
  3. Telnet
  4. SSH
  5. 폐쇄망에서의 네트워크 통신

방화벽 (Firewall)

개념 : 네트워크 트래픽을 모니터링하고, 미리 정의된 보안 규칙에 따라 허용하거나 차단하는 보안 시스템
  • 이름의 유래 : 건축에서 화재 확산을 막는 ‘방화벽’처럼, 네트워크에서 신뢰할 수 없는 외부 트래픽이 내부로 유입되는 것을 차단
  • 네트워크의 경계에 위치하여 내부 네트워크와 외부 네트워크(인터넷) 사이의 관문 역할
방화벽의 동작 원리 : 규칙(Rule) 기반 트래픽 필터링
  • 패킷이 방화벽을 통과할 때, 사전에 정의된 규칙(정책)에 따라 허용(Allow) 또는 차단(Deny/Drop) 결정
  • 규칙에서 주로 검사하는 항목
    • 출발지 IP 주소 / 목적지 IP 주소
    • 출발지 포트 번호 / 목적지 포트 번호
    • 프로토콜 종류 (TCP, UDP, ICMP 등)
    • 트래픽 방향 (인바운드 / 아웃바운드)
  • 규칙은 위에서부터 순서대로 매칭되며, 먼저 매칭된 규칙이 적용됨 (순서 중요)
방화벽 규칙 예시 (iptables 기준)
방화벽 규칙 확인
# 현재 방화벽 규칙 확인
sudo iptables -L -n -v
 
# 특정 포트(22번, SSH) 허용
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# 특정 IP에서 오는 트래픽만 허용
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
 
# 특정 포트(23번, Telnet) 차단
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
 
# 기본 정책: 명시적으로 허용하지 않은 모든 인바운드 트래픽 차단
sudo iptables -P INPUT DROP
방화벽의 종류
종류설명특징
패킷 필터링 방화벽패킷의 헤더 정보(IP, 포트, 프로토콜)만 검사빠르지만 패킷 내용(페이로드)은 검사하지 않음
상태 기반 방화벽 (Stateful)연결 상태를 추적하여 정상적인 세션의 패킷만 허용내가 요청한 응답인지 구분 가능.
비상태 방화벽 (Stateless)각 패킷을 독립적으로 검사, 연결 상태 추적하지 않음인바운드/아웃바운드 규칙을 각각 설정해야 함.
애플리케이션 방화벽 (WAF)HTTP 등 애플리케이션 계층의 내용까지 검사SQL 인젝션, XSS 등 웹 공격 탐지 가능
네트워크 방화벽 vs 호스트 방화벽
  • 네트워크 방화벽 : 네트워크 경계에 설치되는 전용 장비/소프트웨어
    • 라우터, 전용 방화벽 장비 등에서 동작
    • 네트워크 전체를 보호
  • 호스트 방화벽 : 개별 서버/PC에서 동작하는 소프트웨어 방화벽
    • Linux: iptables, firewalld, ufw
    • macOS: pf (Packet Filter)
    • Windows: Windows Defender 방화벽
호스트 방화벽 실무 명령어
# --- Linux (firewalld) ---
# 방화벽 상태 확인
sudo firewall-cmd --state
 
# 허용된 포트 목록 확인
sudo firewall-cmd --list-ports
 
# 8080 포트 영구 허용
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
 
# --- Linux (ufw, Ubuntu 계열) ---
sudo ufw status
sudo ufw allow 22/tcp
sudo ufw deny 23/tcp
 
# --- macOS ---
# 방화벽 상태 확인
sudo pfctl -s rules

포트와 방화벽의 관계

  • 방화벽은 포트 번호를 기준으로 트래픽을 허용하거나 차단하는 것이 핵심
  • 폐쇄망에서는 기본적으로 모든 포트를 차단하고, 업무에 필요한 포트만 선별적으로 개방하는 화이트리스트(Whitelist) 방식 사용
폐쇄망에서 자주 개방하는 포트
포트프로토콜용도개방 여부
22SSH원격 서버 접속, 파일 전송✅ 주로 허용
23Telnet원격 접속 (비암호화)❌ 보통 차단
80HTTP웹 서비스상황에 따라
443HTTPS암호화된 웹 서비스상황에 따라
3306MySQL데이터베이스내부만 허용
5432PostgreSQL데이터베이스내부만 허용
8080HTTP 대체개발용 웹 서버내부만 허용
방화벽 포트 개방 여부 확인하기
포트 연결 테스트
# telnet으로 특정 서버의 포트 열려있는지 확인
telnet 192.168.1.10 22
# 결과: Connected to 192.168.1.10 → 포트 열림
# 결과: Connection refused / timeout → 포트 닫힘 또는 방화벽 차단
 
# nc (netcat)으로 확인
nc -zv 192.168.1.10 22
# 결과: Connection to 192.168.1.10 22 port [tcp/ssh] succeeded!
 
# 여러 포트 범위를 한번에 스캔
nc -zv 192.168.1.10 20-25
 
# curl로 HTTP 포트 확인
curl -v telnet://192.168.1.10:8080

Telnet

개념 : 원격 호스트에 접속하기 위한 프로토콜포트 23번 사용
  • 1969년에 개발된 가장 오래된 원격 접속 프로토콜 중 하나
  • 네트워크를 통해 원격 서버의 터미널(쉘)에 접속하여 명령어를 실행할 수 있음
  • TCP 기반으로 동작
치명적인 보안 문제 : 평문(Plain Text) 통신
  • 모든 데이터가 암호화 없이 네트워크를 통해 전송됨
    • 사용자 ID, 비밀번호, 입력하는 명령어, 출력 결과 모두 평문
    • 네트워크 상에서 패킷 캡처(스니핑)하면 내용이 그대로 노출
  • 때문에 현재는 원격 접속 용도로는 사용하지 않음 → SSH로 대체
Telnet 패킷 스니핑 예시 (왜 위험한지)
# tcpdump로 telnet 트래픽을 캡처하면
sudo tcpdump -i eth0 port 23 -A
 
# 아래처럼 입력한 ID/PW가 평문으로 보임
# ...user: admin...
# ...password: mypassword123...
현재의 Telnet 활용 : 네트워크 진단 도구
  • 원격 접속 용도는 사라졌지만, 포트 연결 테스트 도구로 여전히 유용
  • 방화벽 개방 여부, 서비스 정상 동작 여부를 빠르게 확인할 때 사용
Telnet 실무 활용 예시
# 1. SSH 포트(22) 열려있는지 확인
telnet 10.0.1.50 22
# Trying 10.0.1.50...
# Connected to 10.0.1.50.
# SSH-2.0-OpenSSH_8.9  ← 서비스 배너가 보이면 연결 성공
 
# 2. 웹 서버 포트(80) 확인
telnet www.example.com 80
# 접속 후 HTTP 요청을 직접 입력할 수도 있음
# GET / HTTP/1.1
# Host: www.example.com
 
# 3. DB 포트 확인 (MySQL 3306)
telnet 10.0.1.100 3306
# Connection refused ← 방화벽에서 차단되었거나 서비스가 꺼져있음
 
# 4. SMTP 서버 확인 (메일 서버 25번 포트)
telnet mail.company.com 25
# 220 mail.company.com ESMTP ← 메일 서버 정상 동작

telnet이 설치되어 있지 않은 경우

폐쇄망 환경에서는 telnet 클라이언트가 설치되지 않은 경우가 많음. 이때 대안으로 사용 가능한 도구:

  • nc (netcat) : nc -zv host port
  • curl : curl -v telnet://host:port
  • /dev/tcp (Bash 내장) : echo > /dev/tcp/host/port && echo "open" || echo "closed"
# Bash 내장 기능으로 포트 확인 (별도 설치 불필요)
(echo > /dev/tcp/10.0.1.50/22) 2>/dev/null && echo "Port 22 OPEN" || echo "Port 22 CLOSED"

SSH (Secure Shell)

개념 : 암호화된 통신을 통해 원격 호스트에 안전하게 접속하는 프로토콜로 포트 22번 사용
  • Telnet의 보안 문제를 해결하기 위해 1995년에 개발
  • 전송되는 모든 데이터가 암호화되어 스니핑에 안전
  • 현재 원격 서버 관리의 사실상 표준 (de facto standard)
Telnet vs SSH 비교
항목TelnetSSH
포트2322
암호화❌ 평문 전송✅ 전체 암호화
인증 방식ID/PW만 가능ID/PW, 공개키, 인증서 등
데이터 무결성보장 안됨보장됨
파일 전송별도 프로토콜 필요 (FTP)SCP, SFTP 내장
현재 용도포트 테스트 용도원격 접속 표준
SSH 인증 방식
1. 비밀번호 인증 : 가장 기본적인 방식
비밀번호 인증으로 SSH 접속
# 기본 접속 (22번 포트)
ssh username@192.168.1.10
 
# 포트 지정 접속 (방화벽에서 SSH 포트를 22가 아닌 다른 포트로 설정한 경우)
ssh -p 2222 username@192.168.1.10
  • 매번 비밀번호를 입력해야 하고, 비밀번호가 (암호화되어 전송되긴 하지만) 브루트포스 공격에 취약할 수 있음
2. 공개키(Public Key) 인증 : 보안성과 편의성 모두 우수한 방식
  • 공개 키 암호화 방식을 활용한 인증
  • 개인 키(Private Key)는 클라이언트가 보관, 공개 키(Public Key)는 서버에 등록
SSH 공개키 인증 설정 (전체 과정)
# 1단계: 키 쌍 생성 (클라이언트에서 실행)
ssh-keygen -t rsa -b 4096 -C "user@company.com"
# Generating public/private rsa key pair.
# Enter file in which to save the key (/home/user/.ssh/id_rsa): [Enter]
# Enter passphrase (empty for no passphrase): [보안을 위해 설정 권장]
# 결과: ~/.ssh/id_rsa (개인키), ~/.ssh/id_rsa.pub (공개키) 생성
 
# 2단계: 공개키를 서버에 등록
ssh-copy-id username@192.168.1.10
# 또는 수동으로
cat ~/.ssh/id_rsa.pub | ssh username@192.168.1.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
 
# 3단계: 비밀번호 없이 접속 확인
ssh username@192.168.1.10
# 비밀번호 입력 없이 바로 접속됨
SSH의 주요 기능
원격 쉘 (Remote Shell) : 가장 기본적인 용도
원격 명령 실행
# 원격 서버에 접속하여 쉘 사용
ssh user@server
 
# 접속 없이 원격 명령만 실행하고 종료
ssh user@server "df -h && free -m"
# 서버의 디스크 사용량과 메모리 상태를 확인하고 바로 로컬로 돌아옴
 
# 원격 서버에서 스크립트 실행
ssh user@server "bash -s" < local_script.sh
SCP (Secure Copy) : SSH 기반 파일 전송
SCP 파일 전송
# 로컬 → 서버로 파일 전송
scp ./data.csv user@server:/home/user/data/
 
# 서버 → 로컬로 파일 가져오기
scp user@server:/var/log/app.log ./
 
# 디렉토리 전체 전송 (-r 옵션)
scp -r ./project/ user@server:/home/user/
 
# 포트 지정
scp -P 2222 ./file.txt user@server:/tmp/
SFTP (SSH File Transfer Protocol) : 대화형 파일 전송
SFTP 사용
sftp user@server
# sftp> ls                    # 서버 파일 목록
# sftp> cd /var/log           # 서버 디렉토리 이동
# sftp> get app.log           # 서버 → 로컬 다운로드
# sftp> put data.csv          # 로컬 → 서버 업로드
# sftp> exit
SSH 포트 포워딩 (SSH Tunneling) : 방화벽을 우회하지 않고, 허용된 SSH 연결을 통해 다른 서비스에 접근하는 기법
  • 포트 포워딩의 SSH 버전
  • 방화벽에서 22번 포트만 열려있어도, SSH 터널을 통해 내부의 DB, 웹 서버 등에 접근 가능
SSH 로컬 포트 포워딩
# 문제 상황: 방화벽이 DB 포트(5432)를 차단하고 있어서 직접 접속 불가
# 해결: SSH 터널을 통해 우회
 
# 로컬 포트 포워딩 (-L)
# 로컬의 15432 포트 → SSH 서버를 경유 → 내부 DB 서버의 5432 포트
ssh -L 15432:db-server:5432 user@ssh-server
 
# 이제 로컬에서 아래처럼 DB에 접속 가능
psql -h localhost -p 15432 -U dbuser mydb
로컬 포트 포워딩 흐름도
[내 PC:15432] ---SSH 암호화 터널--→ [SSH 서버] ---내부망--→ [DB 서버:5432]
                방화벽 통과 (22번)          방화벽 내부
SSH 리모트 포트 포워딩
# 리모트 포트 포워딩 (-R)
# 내부 서버에서 실행하면, 외부에서 내부 서비스에 접근 가능하게 만듦
# SSH 서버의 8080 포트로 들어오는 요청 → 로컬의 3000 포트로 전달
ssh -R 8080:localhost:3000 user@ssh-server
SSH 다이나믹 포트 포워딩 (SOCKS 프록시)
# 다이나믹 포트 포워딩 (-D)
# 로컬에 SOCKS 프록시를 생성하여, 모든 트래픽을 SSH 터널로 전달
ssh -D 1080 user@ssh-server
 
# 브라우저 프록시 설정에서 SOCKS5 localhost:1080 지정하면
# 브라우저의 모든 트래픽이 SSH 서버를 경유
SSH 설정 파일로 편리하게 관리
~/.ssh/config 설정 예시
# ~/.ssh/config 파일에 자주 접속하는 서버 정보 저장
 
# 개발 서버
Host dev
    HostName 10.0.1.50
    User developer
    Port 22
    IdentityFile ~/.ssh/id_rsa_dev
 
# 점프 서버(Bastion)를 경유하는 내부 서버
Host internal-db
    HostName 172.16.0.100
    User admin
    ProxyJump bastion
 
# 점프 서버 (Bastion Host)
Host bastion
    HostName 203.0.113.10
    User gatekeeper
    Port 2222
 
# 사용 예시:
# ssh dev              ← 길게 입력할 필요 없이 별칭으로 접속
# ssh internal-db      ← bastion을 자동으로 경유하여 내부 서버 접속

폐쇄망에서의 네트워크 통신

폐쇄망이란 : 외부 인터넷과 물리적 또는 논리적으로 분리된 내부 네트워크
  • 금융, 공공기관, 군사, 의료 등 보안이 중요한 환경에서 사용
  • 외부 인터넷 접근이 원천 차단되어 있으며, 내부 네트워크 간 통신도 방화벽으로 제어
  • 소프트웨어 설치, 패키지 다운로드 등이 제한되어 별도 내부 저장소(미러) 운영
폐쇄망 네트워크 구성 예시
일반적인 폐쇄망 구조
[인터넷] ──✕──  [방화벽] ── [DMZ] ── [내부 방화벽] ── [내부망]
                                    │                    │
                              Bastion Host          작업 서버들
                              (점프 서버)            DB 서버
                                                    배치 서버
  • DMZ (Demilitarized Zone) : 외부와 내부 사이의 완충 지대
    • 외부에서 제한적으로 접근 가능한 서비스(메일, 웹 등)를 배치
    • 내부망으로의 직접 접근은 불허
  • Bastion Host (점프 서버) : 외부에서 내부망에 접근하기 위한 유일한 진입점
    • SSH 접속만 허용되며, 여기서 다시 내부 서버로 접속
    • 모든 접속 로그가 기록되어 감사(Audit) 추적 가능
폐쇄망 접속 실무 흐름
Bastion Host를 경유한 내부 서버 접속
# 1. 먼저 Bastion Host에 SSH 접속
ssh user@bastion.company.com
 
# 2. Bastion에서 내부 서버로 다시 SSH 접속
ssh user@172.16.0.50
 
# --- 위 과정을 한 번에 하려면 ProxyJump 사용 ---
ssh -J user@bastion.company.com user@172.16.0.50
 
# --- 또는 ~/.ssh/config에 설정해두면 ---
# Host internal
#     HostName 172.16.0.50
#     User user
#     ProxyJump bastion
ssh internal
폐쇄망에서 자주 겪는 상황과 대응
상황원인확인/해결 방법
ssh: connect to host ... port 22: Connection timed out방화벽에서 해당 IP/포트 차단telnet host 22로 포트 확인, 방화벽 담당자에게 개방 요청
pip install / apt-get 실패외부 인터넷 차단내부 미러 서버 또는 프록시 설정
특정 서버 간 통신 불가내부 방화벽 세그먼트 간 차단nc -zv host port로 확인, 내부 방화벽 규칙 확인
git clone 실패외부 GitHub 접근 불가내부 GitLab/Gitea 미러 사용
Docker 이미지 Pull 실패외부 Registry 접근 불가내부 Harbor/Registry 미러 사용
폐쇄망 네트워크 디버깅 체크리스트
단계별 네트워크 문제 진단
# 1단계: 네트워크 연결 자체 확인 (ICMP)
ping 172.16.0.50
# 응답 없으면 → 네트워크 경로 문제 또는 ICMP 차단
 
# 2단계: 경로 추적
traceroute 172.16.0.50
# 어디서 패킷이 멈추는지 확인 → 방화벽 위치 파악
 
# 3단계: 특정 포트 연결 확인
telnet 172.16.0.50 22       # SSH 포트
nc -zv 172.16.0.50 5432     # DB 포트
# Connection refused → 서비스 미실행 또는 호스트 방화벽 차단
# timeout → 네트워크 방화벽 차단 가능성 높음
 
# 4단계: DNS 확인
nslookup internal-server.company.com
dig internal-server.company.com
# 폐쇄망에서는 내부 DNS 서버를 사용하므로 DNS 설정 확인 필요
 
# 5단계: 현재 열려있는 포트 확인 (서버 측에서)
sudo ss -tlnp         # 어떤 포트가 LISTEN 상태인지 확인
sudo netstat -tlnp     # ss가 없는 경우 대안

방화벽 개방 요청 시 필요한 정보

폐쇄망에서 방화벽 개방을 요청할 때 일반적으로 아래 정보를 명시해야 함:

  • 출발지 IP (또는 IP 대역) : 요청을 보내는 서버
  • 목적지 IP (또는 IP 대역) : 요청을 받는 서버
  • 포트 번호 : 사용할 서비스의 포트
  • 프로토콜 : TCP / UDP
  • 용도 : 왜 필요한지 설명

예시: “출발지 10.0.1.0/24 → 목적지 172.16.0.100:5432/TCP, PostgreSQL DB 접속 용도”