리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 41 / 50 · Part 5. 네트워크·보안·SOC
실습 환경: Rocky Linux 9 (10.0.0.200) ·ip출력은 실습 컨테이너의 실제 출력 (192.0.2.0/24 문서용 대역)
이전 글: 40. Disk 사용량 관리
Part 5를 시작한다. 지금까지는 한 대의 서버 안 에서 일어나는 일(파일, 권한, 프로세스, 서비스)을 다뤘다. 이제 서버 밖 과 연결되는 부분, 즉 네트워크를 다룬다.
관제에서 보는 공격은 거의 대부분 네트워크로 들어온다. SSH 무차별 대입, 웹 공격, 원격 코드 실행 후의 외부 통신(C2), 데이터 유출 모두 네트워크를 지난다. 그래서 관제 요원은 이 질문에 답할 수 있어야 한다.
이번 글은 세부 프로토콜(42편)이나 명령어(44편)에 들어가기 전에, 전체 지도를 먼저 그린다.
| 계층 | 이름 | 주소·식별자 | Linux에서 담당 |
|---|---|---|---|
| L7 | 애플리케이션 | URL, 사용자명 | sshd, httpd 등 사용자 공간 프로그램 |
| L4 | 전송 (TCP/UDP) | 포트 번호 | 커널 |
| L3 | 네트워크 (IP) | IP 주소 | 커널 (라우팅, netfilter 방화벽) |
| L2 | 데이터 링크 | MAC 주소 | 커널 + NIC 드라이버 |
| L1 | 물리 | 케이블·전파 | NIC 하드웨어 |
핵심은 L4 이하를 커널이 처리한다 는 점이다. 애플리케이션은 socket()으로 소켓을 만들고 send()/recv()만 호출한다. TCP 연결 수립, 재전송, IP 라우팅, 방화벽 검사는 모두 커널이 한다(4편 커널 구조).
| 개념 | 설명 | 확인 |
|---|---|---|
| 인터페이스 | 네트워크 연결 지점. lo(루프백), eth0/ens33(유선) | ip link |
| IP 주소 / 서브넷 | 10.0.0.200/24 = 10.0.0.0~255 같은 네트워크 | ip addr |
| 게이트웨이 | 다른 네트워크로 나갈 때 거치는 라우터 | ip route |
| DNS 서버 | 이름 → IP 변환 | /etc/resolv.conf |
/etc/hosts | DNS보다 먼저 참조되는 이름 표 | 변조 시 트래픽 우회 가능 |
127.0.0.1은 자기 자신이다. 서비스가 127.0.0.1:3306에서 대기하면 서버 내부에서만 접속할 수 있고, 0.0.0.0:3306이면 모든 인터페이스 에서 접속을 받는다. 이 차이는 44편 ss에서 노출 여부를 판단하는 기준이 된다.

외부에서 SSH 접속 패킷이 들어올 때의 흐름이다.
tcpdump는 이 지점에서 복사본을 본다.accept()로 받아 사용자 공간에서 인증을 처리한다./var/log/secure, Ubuntu /var/log/auth.log(21편).실습 환경에서 확인한 실제 인터페이스와 라우팅이다.
$ ip -br addr
lo UNKNOWN 127.0.0.1/8
eth0 UP 192.0.2.2/24
$ ip route
default via 192.0.2.1 dev eth0
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.2
eth0으로 직접 보낸다.default)는 게이트웨이 192.0.2.1로 보낸다.# 1) 인터페이스와 주소
ip -br link
ip -br addr
ip addr show eth0
# 2) 라우팅
ip route
ip route get 8.8.8.8 # 이 목적지로 갈 때 실제 사용할 경로·출발 주소
# 3) 이름 해석
cat /etc/resolv.conf
cat /etc/hosts
getent hosts velog.io # hosts → DNS 순서로 실제 해석
# 4) 인터페이스 통계 (에러·드롭)
ip -s link show eth0
# 5) 연결 확인
ping -c 3 10.0.0.1
tracepath 8.8.8.8 # 또는 traceroute
# 6) 패킷 확인 (root)
sudo tcpdump -i eth0 -nn -c 10 'tcp port 22'
# 7) 배포판별 네트워크 설정
nmcli con show # RHEL (NetworkManager)
ls /etc/netplan/ # Ubuntu (netplan)
아래 출력은 형식 설명용 예시다.
① /etc/hosts 변조
127.0.0.1 localhost
10.0.0.200 rocky
203.0.113.66 update.vendor-example.com ← 추가된 줄
업데이트 서버 이름을 공격자 IP로 연결해 두면, 서버가 가짜 업데이트 를 받아 올 수 있다. /etc/hosts는 DNS보다 먼저 참조되므로 DNS 로그에는 흔적이 남지 않는다.
② ip route get
$ ip route get 203.0.113.50
203.0.113.50 via 10.0.0.1 dev ens33 src 10.0.0.200 uid 0
이 서버가 외부 IP로 나갈 때 어떤 출발 주소(10.0.0.200)를 쓰는지 알 수 있다. 외부 방화벽·프록시 로그에서 이 서버의 트래픽을 찾을 때 기준 주소가 된다(NAT가 있다면 변환 후 주소도 확인).
| 위치 | 공격·위험 | 점검 |
|---|---|---|
| 인터페이스 | 무차별 모드(PROMISC) — 스니핑 도구 실행 | ip link에 PROMISC 플래그 |
| 라우팅 | 기본 게이트웨이·경로 변경 → 트래픽 우회 | ip route 기준값과 비교 |
| 이름 해석 | /etc/hosts, /etc/resolv.conf 변조 | 파일 무결성 감시 (22·30편) |
| 방화벽 | 규칙 삭제·서비스 중지 | 46편 |
| 바인딩 | 내부용 서비스(DB, Redis)가 0.0.0.0에 노출 | 44편 ss -tlnp |
{
date; hostname
ip -br addr; ip route
cat /etc/resolv.conf /etc/hosts
ss -tulnp # 44편
} > /root/baseline/net_$(hostname)_$(date +%F).txt
평소 상태를 저장해 두면, 침해가 의심될 때 diff(27·30편)로 무엇이 바뀌었는지 바로 확인할 수 있다.
[Alert] 방화벽: 10.0.0.200 → 203.0.113.50:4444 외부 연결 (야간)
↓
[호스트] ss -tnp | grep 203.0.113.50 → 어떤 프로세스? (44편)
↓
[프로세스] PID → 실행 파일·부모·계정 (29·35편)
↓
[경로] ip route get 203.0.113.50 → 정상 게이트웨이 경유 확인
↓
[판단] 외부 방화벽(밖)과 ss·ps(안)의 기록을 시각·IP·포트로 연결
ip addr(주소), ip route(경로), /etc/resolv.conf·/etc/hosts(이름)로 기본 구성을 확인한다.127.0.0.1 바인딩은 내부 전용, 0.0.0.0은 모든 인터페이스 노출이다.다음 글 「42. IP / TCP / UDP / Port」 에서는 L3·L4를 자세히 본다. 실습 환경에서 캡처한 실제 TCP 3-way handshake 패킷, TCP 상태(LISTEN, ESTABLISHED, TIME_WAIT), UDP와의 차이, 그리고 잘 알려진 포트를 정리한다.