# 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
# 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 클라이언트가 설치되지 않은 경우가 많음. 이때 대안으로 사용 가능한 도구:
개인 키(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 연결을 통해 다른 서비스에 접근하는 기법
방화벽에서 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 bastionssh internal
폐쇄망에서 자주 겪는 상황과 대응
상황
원인
확인/해결 방법
ssh: connect to host ... port 22: Connection timed out
# 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.comdig 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 접속 용도”