1. 네트워크 설정 확인

1.1 ifconfig (레거시)

net-tools 패키지에 포함. 현재는 ip 명령으로 대체되었지만, 레거시 환경에서 여전히 사용된다.

ifconfig                    # 모든 활성 인터페이스 정보
ifconfig -a                 # 비활성 포함 모든 인터페이스
ifconfig eth0               # 특정 인터페이스 정보
 
ifconfig eth0 up            # 인터페이스 활성화
ifconfig eth0 down          # 인터페이스 비활성화
ifconfig eth0 192.168.1.100 netmask 255.255.255.0    # IP 수동 설정 (임시)
 
# 설치 (없는 경우)
sudo apt install net-tools   # Debian/Ubuntu
sudo dnf install net-tools   # RHEL/CentOS

1.2 ip - 현대적 네트워크 도구

iproute2 패키지에 포함. ifconfig, route, arp 등을 통합한 명령.

# ip addr - 주소 관리
ip addr show                 # 모든 인터페이스 IP 정보 (= ip a)
ip addr show eth0            # 특정 인터페이스
ip -4 addr show              # IPv4만 표시
ip -6 addr show              # IPv6만 표시
ip -br addr show             # 간결한 출력 (brief)
 
ip addr add 192.168.1.100/24 dev eth0      # IP 추가 (임시)
ip addr del 192.168.1.100/24 dev eth0      # IP 삭제
 
# ip link - 인터페이스(링크) 관리
ip link show                 # 모든 인터페이스 상태
ip -br link show             # 간결한 상태 (UP/DOWN)
ip link set eth0 up          # 인터페이스 활성화
ip link set eth0 down        # 인터페이스 비활성화
ip link set eth0 mtu 9000    # MTU 변경
 
# ip route - 라우팅 테이블 관리
ip route show                # 라우팅 테이블 (= ip r)
ip route get 8.8.8.8         # 특정 IP로의 경로 확인
ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0    # 정적 라우트 추가
ip route del 10.0.0.0/8      # 라우트 삭제
ip route add default via 192.168.1.1                  # 기본 게이트웨이 설정
 
# ip neigh - ARP/이웃 탐색 (arp 대체)
ip neigh show                # ARP 테이블 (= ip n)
ip neigh flush all           # ARP 캐시 초기화

1.3 hostname / hostnamectl

hostname                     # 현재 호스트명
hostname -I                  # 모든 IP 주소 (대문자 I)
hostname -f                  # FQDN (Fully Qualified Domain Name)
 
# systemd 환경
hostnamectl                  # 상세 호스트 정보 (static, transient, pretty)
hostnamectl set-hostname myserver    # 호스트명 변경 (영구적)

2. 네트워크 설정 파일

2.1 공통 설정 파일

# /etc/hostname - 호스트명
cat /etc/hostname
# myserver
 
# /etc/hosts - 로컬 호스트명-IP 매핑 (DNS보다 우선)
cat /etc/hosts
# 127.0.0.1       localhost
# 127.0.1.1       myserver
# 192.168.1.100   db.local db
 
# /etc/resolv.conf - DNS 서버 설정
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# search example.com       # 도메인 검색 접미사
# options timeout:2 attempts:3
 
# /etc/nsswitch.conf - 이름 해석 순서 설정
grep "^hosts:" /etc/nsswitch.conf
# hosts: files dns myhostname
# files = /etc/hosts → dns = DNS 서버 → myhostname = 로컬 호스트명

2.2 Debian/Ubuntu: /etc/network/interfaces (레거시)

cat /etc/network/interfaces
# 루프백
auto lo
iface lo inet loopback

# 고정 IP (static)
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4

# DHCP
auto eth0
iface eth0 inet dhcp
# 적용
sudo ifdown eth0 && sudo ifup eth0
sudo systemctl restart networking

2.3 RHEL/CentOS: /etc/sysconfig/network-scripts/ (레거시)

cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static          # static 또는 dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes                # 부팅 시 자동 활성화
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4

2.4 NetworkManager / nmcli (현대적, 공통)

대부분의 현대 배포판에서 사용하는 네트워크 관리 데몬.

# 상태 확인
nmcli general status              # NetworkManager 전반 상태
nmcli device status               # 디바이스 상태 (= nmcli dev)
nmcli connection show             # 연결 프로필 목록 (= nmcli con show)
nmcli connection show "Wired 1"   # 특정 연결 상세
 
# 연결 관리
nmcli connection up "Wired 1"     # 연결 활성화
nmcli connection down "Wired 1"   # 연결 비활성화
 
# 고정 IP 설정
nmcli connection modify "Wired 1" \
    ipv4.method manual \
    ipv4.addresses 192.168.1.100/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "8.8.8.8,8.8.4.4"
nmcli connection up "Wired 1"     # 변경 적용
 
# DHCP로 전환
nmcli connection modify "Wired 1" ipv4.method auto
nmcli connection up "Wired 1"
 
# 새 연결 생성
nmcli connection add type ethernet \
    con-name "my-static" \
    ifname eth0 \
    ipv4.method manual \
    ipv4.addresses 192.168.1.200/24
 
# Wi-Fi 관련
nmcli device wifi list            # 사용 가능한 Wi-Fi 목록
nmcli device wifi connect "SSID" password "비밀번호"

3. 연결 테스트

3.1 ping

ICMP Echo Request를 보내 네트워크 연결 상태를 확인한다.

ping google.com                    # 무한 핑 (Ctrl+C로 중단)
ping -c 5 google.com              # 5회만 전송 (count)
ping -i 0.5 google.com            # 0.5초 간격 (interval, 기본 1초)
ping -W 3 google.com              # 응답 대기 시간 3초 (timeout)
ping -s 1024 google.com           # 패킷 크기 1024 바이트
ping -f google.com                # flood ping (root만, 부하 테스트)
ping -4 google.com                # IPv4만 사용
ping -6 google.com                # IPv6만 사용

3.2 traceroute / tracepath / mtr

패킷이 목적지까지 거치는 경로(홉)를 추적한다.

# traceroute (설치 필요할 수 있음)
traceroute google.com              # 기본 (UDP)
traceroute -I google.com          # ICMP 사용
traceroute -T google.com          # TCP 사용 (방화벽 통과에 유리)
traceroute -n google.com          # DNS 역조회 안 함 (빠름)
traceroute -m 20 google.com      # 최대 홉 수 20
 
# tracepath (traceroute 대안, 추가 설치 불필요한 경우 많음)
tracepath google.com              # PMTU 탐색도 함께 수행
 
# mtr - ping + traceroute 결합 (실시간 모니터링)
mtr google.com                    # 대화형 모드
mtr -r -c 10 google.com          # 리포트 모드 (10회 후 결과 출력)
mtr -n google.com                # DNS 역조회 안 함

4. 포트/연결 확인

4.1 netstat (레거시)

net-tools 패키지. ss로 대체되었지만 레거시 환경에서 여전히 사용된다.

netstat -tulnp                    # 가장 많이 쓰는 조합
# -t: TCP, -u: UDP, -l: LISTEN 상태만, -n: 숫자(포트번호), -p: 프로세스 표시
 
netstat -an                       # 모든 연결 (ESTABLISHED 포함)
netstat -rn                       # 라우팅 테이블 (route -n과 동일)
netstat -s                        # 프로토콜별 통계
netstat -i                        # 인터페이스 통계
netstat -tulnp | grep :80        # 80번 포트 사용 프로세스

4.2 ss - netstat 대체

더 빠르고 정보가 풍부한 소켓 통계 도구.

ss -tulnp                        # netstat -tulnp와 동일 용도
# -t: TCP, -u: UDP, -l: LISTEN, -n: 숫자, -p: 프로세스
 
ss -s                             # 소켓 통계 요약
ss -a                             # 모든 소켓
ss -o                             # 타이머 정보 포함
 
# 필터링
ss -tn state established          # ESTABLISHED 상태인 TCP
ss -tn dst 192.168.1.1            # 특정 목적지 연결
ss -tn sport = :80                # 소스 포트 80
ss -tn dport = :443               # 목적지 포트 443

4.3 lsof -i

열린 파일(소켓 포함)을 조회하는 명령. 포트 사용 프로세스 확인에 유용.

sudo lsof -i                     # 모든 네트워크 연결
sudo lsof -i :80                 # 80번 포트 사용 프로세스
sudo lsof -i TCP                 # TCP 연결만
sudo lsof -i TCP:22              # TCP 22번 포트
sudo lsof -i @192.168.1.100      # 특정 IP 관련 연결
sudo lsof -i -P -n               # 포트/IP 숫자로 표시 (빠름)

5. DNS 관련 명령어

5.1 nslookup

nslookup google.com                  # A 레코드 조회
nslookup -type=MX google.com        # MX 레코드 (메일 서버)
nslookup -type=NS google.com        # NS 레코드 (네임서버)
nslookup -type=TXT google.com       # TXT 레코드
nslookup google.com 8.8.8.8         # 특정 DNS 서버로 조회

5.2 dig (권장 - 더 상세한 출력)

dig google.com                       # A 레코드 (상세 출력)
dig google.com +short                # IP만 간결하게
dig google.com MX                    # MX 레코드
dig google.com NS                    # NS 레코드
dig google.com ANY                   # 모든 레코드
dig -x 8.8.8.8                      # 역방향 조회 (IP → 도메인)
dig @8.8.8.8 google.com             # 특정 DNS 서버 사용
dig google.com +trace               # 루트 서버부터 전체 조회 과정 추적
dig google.com +noall +answer       # 답변 섹션만 출력

5.3 host

간결한 DNS 조회 도구.

host google.com                      # A 레코드 + MX 레코드
host -t MX google.com               # MX 레코드만
host 8.8.8.8                        # 역방향 조회
host google.com 8.8.8.8             # 특정 DNS 서버 사용

/etc/resolv.conf

cat /etc/resolv.conf
# nameserver 8.8.8.8        # 기본 DNS 서버
# nameserver 8.8.4.4        # 보조 DNS 서버
# search example.com        # 'host myserver' → 'host myserver.example.com' 시도
# domain example.com        # search와 유사 (한 개만)
# options ndots:5 timeout:2 attempts:3

최신 시스템에서 /etc/resolv.confsystemd-resolvedNetworkManager에 의해 자동 관리되는 경우가 많다. 직접 수정하면 덮어씌워질 수 있다.

# systemd-resolved 사용 시 실제 DNS 설정 확인
resolvectl status
systemd-resolve --status

6. 데이터 전송

6.1 curl

URL을 이용한 데이터 전송 도구. API 호출, 파일 다운로드 등.

# 기본 GET 요청
curl https://api.example.com/data
curl -s https://api.example.com/data         # silent (진행바 숨김)
 
# HTTP 메서드 지정
curl -X GET https://api.example.com/data
curl -X POST https://api.example.com/data
curl -X PUT https://api.example.com/data
curl -X DELETE https://api.example.com/data/1
 
# 헤더 추가
curl -H "Content-Type: application/json" \
     -H "Authorization: Bearer token123" \
     https://api.example.com/data
 
# 데이터 전송 (POST)
curl -X POST -d "name=park&age=25" https://api.example.com/users
curl -X POST -d '{"name":"park","age":25}' \
     -H "Content-Type: application/json" \
     https://api.example.com/users
 
# 파일 다운로드
curl -o filename.zip https://example.com/file.zip    # 파일명 지정
curl -O https://example.com/file.zip                 # 원래 파일명 사용
 
# 리다이렉트 따라가기
curl -L https://bit.ly/short-url                     # follow redirect
 
# SSL 인증서 무시 (개발/테스트용)
curl -k https://self-signed.example.com
 
# 상세 출력 (디버깅)
curl -v https://api.example.com/data                 # verbose
curl -I https://api.example.com/data                 # 헤더만 표시 (HEAD 요청)
 
# 이어받기 / 타임아웃
curl -C - -O https://example.com/large.iso           # 이어받기
curl --connect-timeout 10 --max-time 30 https://api.example.com
 
# 업로드
curl -F "file=@/path/to/file.jpg" https://api.example.com/upload    # multipart
curl -T /path/to/file.txt ftp://ftp.example.com/                    # FTP 업로드

6.2 wget

파일 다운로드에 특화된 도구. 재귀 다운로드 가능.

# 기본 다운로드
wget https://example.com/file.zip
wget -O custom_name.zip https://example.com/file.zip    # 파일명 지정
 
# 이어받기
wget -c https://example.com/large.iso                   # continue
 
# 재귀 다운로드 (웹사이트 미러링)
wget -r https://example.com/docs/                       # recursive
wget -r -l 2 https://example.com/                       # 깊이 제한 (level)
wget -r --no-parent https://example.com/docs/           # 상위 디렉토리 안 감
wget --mirror https://example.com/                      # = -r -N -l inf --no-remove-listing
 
# 백그라운드 다운로드
wget -b https://example.com/large.iso                   # background
tail -f wget-log                                         # 진행 확인
 
# 여러 파일 다운로드
wget -i urls.txt                 # 파일에 나열된 URL 다운로드
 
# 속도 제한
wget --limit-rate=500k https://example.com/large.iso

7. 방화벽

7.1 iptables

리눅스 커널의 Netfilter 프레임워크를 설정하는 저수준 도구.

체인(Chain): 패킷이 통과하는 규칙 목록

체인설명
INPUT호스트로 들어오는 패킷
OUTPUT호스트에서 나가는 패킷
FORWARD호스트를 통과하는 패킷 (라우터 역할)

타겟(Target): 규칙에 매칭된 패킷의 처리 방식

타겟설명
ACCEPT허용
DROP무시 (응답 없음)
REJECT거부 (ICMP 에러 응답)
LOG로그 기록 후 다음 규칙으로
# 규칙 확인
sudo iptables -L                   # 모든 체인의 규칙 목록
sudo iptables -L -n -v             # 숫자 표시, 상세 (패킷/바이트 카운터)
sudo iptables -L INPUT --line-numbers   # 규칙 번호 포함
 
# 기본 정책 설정 (매칭 규칙 없을 때의 기본 동작)
sudo iptables -P INPUT DROP        # 기본 차단 (화이트리스트 방식)
sudo iptables -P OUTPUT ACCEPT     # 나가는 건 허용
sudo iptables -P FORWARD DROP      # 포워딩 차단
 
# 규칙 추가 (-A: append)
# 특정 포트 허용
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT     # SSH 허용
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT     # HTTP 허용
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT    # HTTPS 허용
 
# 특정 IP 허용/차단
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT     # 서브넷 허용
sudo iptables -A INPUT -s 10.0.0.5 -j DROP             # 특정 IP 차단
 
# 루프백 허용 (필수!)
sudo iptables -A INPUT -i lo -j ACCEPT
 
# 이미 연결된 세션 허용 (중요!)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
# 규칙 삽입 (-I: insert, 특정 위치에)
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT   # 맨 앞에 삽입
 
# 규칙 삭제
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT     # 조건 매칭으로 삭제
sudo iptables -D INPUT 3                                   # 번호로 삭제
 
# 규칙 초기화
sudo iptables -F                   # 모든 체인의 모든 규칙 삭제 (Flush)
sudo iptables -X                   # 사용자 정의 체인 삭제
 
# 규칙 저장/복원 (재부팅 후 유지)
sudo iptables-save > /etc/iptables.rules
sudo iptables-restore < /etc/iptables.rules
# Debian: sudo apt install iptables-persistent
# RHEL: sudo service iptables save

실전 기본 방화벽 설정 예시:

# 기존 규칙 초기화
sudo iptables -F
 
# 기본 정책
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
 
# 필수 규칙
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
# 서비스 포트 개방
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# ICMP (ping) 허용
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

7.2 firewalld / firewall-cmd (RHEL/CentOS 7+)

iptables의 동적 프론트엔드. 영역(zone) 기반으로 관리.

# 상태 확인
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all                # 현재 zone의 모든 규칙
 
# 서비스 허용
sudo firewall-cmd --add-service=http        # 임시 (--permanent 없으면 리로드 시 사라짐)
sudo firewall-cmd --add-service=http --permanent    # 영구
sudo firewall-cmd --reload                           # 영구 규칙 적용
 
# 포트 허용
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --remove-port=8080/tcp --permanent
 
# 사용 가능한 서비스 목록
sudo firewall-cmd --get-services
 
# Zone 관리
sudo firewall-cmd --get-zones
sudo firewall-cmd --set-default-zone=public
sudo firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent

7.3 ufw (Uncomplicated Firewall, Ubuntu)

iptables의 간편한 프론트엔드.

# 기본 명령
sudo ufw enable                    # 방화벽 활성화
sudo ufw disable                   # 비활성화
sudo ufw status                    # 상태 확인
sudo ufw status verbose            # 상세 상태
sudo ufw status numbered           # 번호 포함
 
# 규칙 추가
sudo ufw allow 22                  # SSH 허용
sudo ufw allow 80/tcp              # HTTP TCP 허용
sudo ufw allow from 192.168.1.0/24 # 서브넷 허용
sudo ufw allow from 192.168.1.0/24 to any port 3306   # MySQL 특정 서브넷만
 
sudo ufw deny 23                   # Telnet 차단
sudo ufw reject 23                 # 거부 (응답 포함)
 
# 규칙 삭제
sudo ufw delete allow 80/tcp
sudo ufw delete 3                  # 번호로 삭제
 
# 기본 정책
sudo ufw default deny incoming
sudo ufw default allow outgoing
 
# 앱 프로필
sudo ufw app list                  # 사용 가능한 앱 프로필
sudo ufw allow 'Nginx Full'       # 앱 프로필로 허용

8. 원격 접속

8.1 ssh

# 기본 접속
ssh user@hostname
ssh user@192.168.1.100
ssh -p 2222 user@hostname          # 포트 지정
 
# 키 기반 인증 (비밀번호 대신 공개키 사용)
ssh-keygen -t ed25519 -C "comment"             # 키 쌍 생성 (ed25519 권장)
ssh-keygen -t rsa -b 4096 -C "comment"         # RSA 4096비트
ssh-copy-id user@hostname                       # 공개키를 서버에 복사 (~/.ssh/authorized_keys)
# 또는 수동:
# cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys (서버에서)

SSH 포트 포워딩 (터널링):

# -L: 로컬 포트 포워딩 (로컬 → 원격)
# 로컬 8080으로 접속하면 원격 서버를 통해 db.internal:3306으로 연결
ssh -L 8080:db.internal:3306 user@bastion
# 이후 localhost:8080 으로 접속하면 db.internal:3306에 연결됨
 
# -R: 리모트 포트 포워딩 (원격 → 로컬)
# 원격 서버의 9090으로 접속하면 내 PC의 localhost:3000으로 연결
ssh -R 9090:localhost:3000 user@remote-server
 
# -D: 동적 포트 포워딩 (SOCKS 프록시)
ssh -D 1080 user@proxy-server
# 브라우저에서 SOCKS5 프록시 localhost:1080 설정 → 모든 트래픽이 proxy-server를 통과
 
# -J: ProxyJump (Jump Host, 다단계 접속)
ssh -J bastion-user@bastion target-user@target
# bastion을 거쳐 target에 접속

SSH 설정 파일 (~/.ssh/config):

Host myserver
    HostName 192.168.1.100
    User phh
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Host production
    HostName 10.0.0.50
    User deploy
    ProxyJump bastion

Host bastion
    HostName bastion.example.com
    User phh
# 이후 간단히 접속
ssh myserver
ssh production

8.2 scp - 파일 복사

# 로컬 → 원격
scp file.txt user@hostname:/remote/path/
scp -r localdir/ user@hostname:/remote/path/    # 디렉토리 재귀 복사
scp -P 2222 file.txt user@hostname:/path/       # 포트 지정 (대문자 P)
 
# 원격 → 로컬
scp user@hostname:/remote/file.txt /local/path/
scp -r user@hostname:/remote/dir/ /local/path/
 
# 원격 → 원격
scp user1@host1:/path/file user2@host2:/path/

8.3 sftp - 대화형 파일 전송

sftp user@hostname
 
# sftp 내부 명령
sftp> ls                  # 원격 디렉토리 목록
sftp> lls                 # 로컬 디렉토리 목록
sftp> get remote_file     # 다운로드
sftp> put local_file      # 업로드
sftp> mget *.log          # 여러 파일 다운로드
sftp> mkdir newdir        # 원격 디렉토리 생성
sftp> exit

8.4 rsync - 효율적 파일 동기화

변경된 부분만 전송하여 네트워크 대역폭을 절약한다.

# 기본 동기화 (-avz: archive + verbose + compress)
rsync -avz /local/dir/ user@hostname:/remote/dir/
 
# 주요 옵션
rsync -avz source/ dest/         # 기본 동기화
rsync -avz --delete source/ dest/   # 소스에 없는 파일은 대상에서도 삭제
rsync -avz --dry-run source/ dest/  # 시뮬레이션 (실제 전송 안 함)
rsync -avz --progress source/ dest/ # 전송 진행 표시
rsync -avz --exclude='*.log' source/ dest/     # 특정 패턴 제외
rsync -avz --exclude-from=exclude.txt source/ dest/
rsync -avz -e "ssh -p 2222" source/ user@host:/dest/  # SSH 포트 지정

소스 경로 끝의 / 유무에 따라 동작이 달라진다.

  • source/ - source 디렉토리의 내용을 dest에 동기화
  • source - source 디렉토리 자체를 dest 아래에 복사 (dest/source/)

9. 네트워크 디버깅

9.1 tcpdump

패킷 캡처 도구. 네트워크 문제 진단에 필수.

# 기본 캡처
sudo tcpdump                            # 모든 인터페이스의 모든 패킷
sudo tcpdump -i eth0                    # 특정 인터페이스
sudo tcpdump -c 100                     # 100개만 캡처
 
# 필터
sudo tcpdump host 192.168.1.100        # 특정 호스트 관련 패킷
sudo tcpdump src 192.168.1.100         # 소스가 특정 IP
sudo tcpdump dst 192.168.1.100         # 목적지가 특정 IP
sudo tcpdump port 80                    # 특정 포트
sudo tcpdump tcp port 443              # TCP 443 포트
sudo tcpdump -n                         # DNS 역조회 안 함 (빠름)
sudo tcpdump -nn                        # 포트명도 숫자로 표시
 
# 복합 필터 (BPF 문법)
sudo tcpdump 'host 192.168.1.100 and port 80'
sudo tcpdump 'tcp[tcpflags] & tcp-syn != 0'    # SYN 패킷만
 
# 파일 저장/읽기
sudo tcpdump -w capture.pcap            # pcap 파일로 저장 (Wireshark로 분석 가능)
sudo tcpdump -r capture.pcap            # pcap 파일 읽기
 
# 상세 출력
sudo tcpdump -X                         # 패킷 내용 HEX + ASCII
sudo tcpdump -A                         # ASCII만
sudo tcpdump -v                         # verbose (-vv, -vvv 가능)

9.2 nmap 기초

네트워크 탐색 및 포트 스캐닝 도구.

# 호스트 탐색
nmap -sn 192.168.1.0/24               # Ping scan (포트 스캔 없이 호스트만)
 
# 포트 스캐닝
nmap 192.168.1.100                     # 상위 1000개 TCP 포트 스캔
nmap -p 22,80,443 192.168.1.100       # 특정 포트
nmap -p 1-65535 192.168.1.100         # 전체 포트 (= -p-)
nmap -sV 192.168.1.100                # 서비스 버전 탐지
nmap -O 192.168.1.100                 # OS 탐지
 
# 스캔 유형
nmap -sT 192.168.1.100               # TCP Connect scan (기본)
nmap -sS 192.168.1.100               # SYN scan (반개방, root)
nmap -sU 192.168.1.100               # UDP scan

허가 없는 네트워크 스캐닝은 법적 문제가 될 수 있다. 자신의 시스템이나 허가받은 네트워크에서만 사용할 것.

10. 소켓 - nc (netcat)

“네트워크의 스위스 아미 나이프”. TCP/UDP 연결을 수동으로 생성/테스트.

# 포트 연결 테스트 (telnet 대안)
nc -zv hostname 80                     # TCP 포트 연결 테스트
nc -zv hostname 20-100                 # 포트 범위 스캔
 
# 간단한 서버/클라이언트
nc -l 1234                             # 1234 포트에서 수신 대기 (서버)
nc hostname 1234                       # 1234 포트에 연결 (클라이언트)
# 양쪽에서 입력하면 채팅 가능
 
# 파일 전송
nc -l 1234 > received_file             # 수신 측
nc hostname 1234 < send_file           # 송신 측
 
# HTTP 요청 수동 전송
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80
 
# UDP
nc -u hostname 5000                    # UDP 연결
nc -lu 5000                            # UDP 수신 대기
 
# 포트 개방 확인 (스크립트에서 유용)
nc -z -w 3 hostname 22 && echo "Open" || echo "Closed"   # 3초 타임아웃

11. /etc/services와 Well-Known Ports

/etc/services

포트 번호와 서비스명의 매핑 파일.

grep "^http " /etc/services
# http    80/tcp    www    # WorldWideWeb HTTP
 
grep "^ssh" /etc/services
# ssh     22/tcp    # SSH Remote Login Protocol

Well-Known Ports

포트서비스프로토콜
20FTP (데이터)TCP
21FTP (제어)TCP
22SSHTCP
23TelnetTCP
25SMTP (메일 전송)TCP
53DNSTCP/UDP
67/68DHCP (서버/클라이언트)UDP
80HTTPTCP
110POP3 (메일 수신)TCP
123NTP (시간 동기화)UDP
143IMAP (메일 수신)TCP
443HTTPSTCP
465SMTPSTCP
993IMAPSTCP
995POP3STCP
3306MySQLTCP
5432PostgreSQLTCP
6379RedisTCP
8080HTTP Proxy (대체)TCP

포트 범위 구분:

  • 0-1023 - Well-Known Ports (root 권한 필요)
  • 1024-49151 - Registered Ports (등록된 서비스)
  • 49152-65535 - Dynamic/Private Ports (클라이언트 임시 포트)