infra
Platform

모듈 맵

[Network] 라우팅 테이블(Route Table) 조회와 게이트웨이 추가/삭제

0 / 35 완료

펼치기
0 / 35 완료0%

네트워크 트러블슈팅 · 03 / 35

[Network] 라우팅 테이블(Route Table) 조회와 게이트웨이 추가/삭제

ip route 명령어로 라우팅 테이블을 확인하고 정적 경로를 추가합니다

🚨INCIDENT ALERT
HIGH

신규 사내망 대역으로 가는 트래픽만 실패합니다. 인터넷은 되고 같은 서브넷도 되지만, 특정 대역으로 가는 경로가 라우팅 테이블에 없습니다.

게이트웨이와 정적 라우팅을 읽을 수 있어야 "어디로 보내야 하는지"를 서버에 알려줄 수 있습니다.

게이트웨이와 정적 라우팅

네트워크에서 패킷이 목적지까지 어떤 경로로 이동할지를 결정하는 것이 **라우팅(Routing)**입니다. 이 챕터에서는 라우터와 게이트웨이의 역할을 이해하고, 리눅스 ip route 명령어로 라우팅 테이블을 읽고 직접 정적 경로를 추가하는 방법을 실습합니다.


이번 챕터에서 배울 것
  • 1라우터의 패킷 전달 원리와 라우팅 테이블 구조를 설명할 수 있다
  • 2디폴트 게이트웨이(0.0.0.0/0)의 역할을 이해하고 설정할 수 있다
  • 3ip route 명령어로 정적 경로를 추가·삭제·검증할 수 있다
  • 4RHEL/Ubuntu 환경별로 영구 경로를 설정할 수 있다(nmcli, Netplan)
  • 5NIC 2개 환경에서 발생하는 비대칭 라우팅 문제를 진단할 수 있다
  • 6정책 기반 라우팅(Policy-based Routing)으로 비대칭 라우팅을 해결할 수 있다
실습 환경 준비
현재 라우팅 테이블 확인
ip route show
네트워크 인터페이스 및 IP 정보 확인
ip addr show
traceroute 설치 확인 또는 설치
traceroute --version 2>&1 | head -1 || sudo apt-get install -y traceroute
sudo 권한 확인 (경로 추가/삭제에 필요)
sudo ip route show table all | head -5
💡개념

라우터의 역할과 패킷 전달 원리

서버를 배포하고 서비스가 잘 올라왔는데 외부에서 전혀 접근이 안 될 때가 있습니다. 포트는 열려 있고, 방화벽 규칙도 문제없고, 프로세스도 정상인데 패킷이 서버까지 도달하지 못합니다. ip route를 보면 게이트웨이가 없거나 잘못된 네트워크 인터페이스로 경로가 잡혀 있는 경우가 많습니다. 라우터가 패킷을 어떻게 전달하는지 이해하지 못하면, 이런 네트워크 단절 상황에서 몇 시간을 낭비하게 됩니다.

라우터의 역할과 패킷 전달 원리 — 라우터는 패킷의 목적지 IP를 라우팅 테이블과 대조해 다음 홉으로 전달(forwarding). 서로 다른 네트워크를 연결하며, 목적지까지 여러 라우터를 거쳐(hop by hop) 패킷이 이동. 같은 네트워크면 직접 전달, 다른 네트워크면 게이트웨이로 보냄확대

라우터는 무엇을 하는가

**라우터(Router)**는 서로 다른 네트워크 사이에서 패킷을 전달하는 장비입니다. 호스트가 패킷을 보낼 때, 목적지 IP 주소가 자신과 같은 서브넷인지 아닌지를 먼저 판단합니다.

  • 같은 서브넷: ARP로 목적지 MAC 주소를 찾아 직접 전송
  • 다른 서브넷: 라우터(게이트웨이)에게 패킷을 위임

라우터는 여러 개의 네트워크 인터페이스를 가지고, 각 인터페이스가 서로 다른 네트워크에 연결됩니다. 패킷이 들어오면 **라우팅 테이블(Routing Table)**을 조회하여 어느 인터페이스로 내보낼지 결정합니다.

라우터와 게이트웨이 토폴로지 — 서버 A→스위치(192.168.1.0/24)→라우터(eth0 게이트웨이·eth1 외부 연결)→인터넷/다른 서브넷확대

서버 A(192.168.1.10)가 8.8.8.8로 패킷을 보낼 때의 흐름:

  1. 8.8.8.8은 192.168.1.0/24 서브넷이 아님을 판단
  2. 게이트웨이 192.168.1.1(라우터 eth0)로 패킷 전송
  3. 라우터가 자신의 라우팅 테이블을 보고 eth1로 패킷을 전달
  4. 패킷이 인터넷으로 나감

라우팅 테이블 구조

리눅스에서 ip route 명령으로 라우팅 테이블을 확인합니다:

로컬 터미널
# 실습 디렉토리 준비
mkdir -p /tmp/networking/part1/exam_3 && cd /tmp/networking/part1/exam_3

$ ip route
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 100
🔍실행 후 확인할 것
  • default 줄 존재 여부ip route show 출력 첫 줄에 "default via X.X.X.X dev eth0"이 있으면 게이트웨이가 설정된 것 — 이 줄이 없으면 인터넷 연결 불가
  • via 뒤 IP 일치 여부via 다음에 나오는 IP가 공유기·네트워크 게이트웨이 주소(보통 X.X.X.1)와 일치하는지 확인 — 틀리면 ping 8.8.8.8이 실패함
  • dev 필드 — 인터페이스 확인dev eth0(또는 ens3, wlan0 등) 필드가 실제 UP 상태 인터페이스인지 ip link show로 교차 확인 — DOWN 인터페이스로 향하면 경로가 있어도 패킷 손실

각 필드의 의미:

필드의미
default목적지 0.0.0.0/0 — 다른 경로가 없을 때 사용
via 192.168.1.1다음 홉(Next Hop) 게이트웨이 주소
dev eth0패킷을 보낼 네트워크 인터페이스
proto dhcp이 경로가 DHCP로 설정되었음
metric 100경로 우선순위 (낮을수록 우선)
scope link직접 연결된 네트워크 (게이트웨이 불필요)

라우팅 결정 우선순위

라우터는 가장 구체적인(Longest Prefix Match) 경로를 선택합니다:

목적지: 10.0.1.50

라우팅 테이블:
  10.0.0.0/8      via 192.168.1.2   ← 매칭
  10.0.1.0/24     via 192.168.1.3   ← 더 구체적 → 이 경로 선택
  default         via 192.168.1.1

/24/8보다 더 구체적이므로 10.0.1.0/24 경로가 선택됩니다.

패킷이 목적지를 찾아가는 법 — 라우팅 결정 단계

💡개념

목적지 IP를 넣으면 커널이 밟는 6단계 — 라우팅 결정 흐름

ping 8.8.8.8 한 줄, 혹은 애플리케이션이 소켓을 여는 순간. 커널은 목적지 IP 하나만 손에 쥐고 "이 패킷을 어느 인터페이스로, 누구에게 넘길지"를 매번 계산합니다. 이 계산이 라우팅 결정이고, 아래 6단계로 진행됩니다. 각 단계를 알면 "왜 이 대상만 안 되지", "왜 응답이 안 돌아오지"를 단계로 좁힐 수 있습니다.

TEXT
[호스트]  목적지 8.8.8.8 로 패킷을 보내려 함
   │
   ① 목적지 IP 확인 → 라우팅 테이블(ip route) 조회 시작
   │
   ② longest prefix match 로 경로 선택
   │    10.0.1.0/24 vs 0.0.0.0/0 → 더 긴 prefix 가 이김
   │    맞는 경로 없으면 default(0.0.0.0/0) 로
   │
   ③ 선택된 경로가 '직접 연결'인가 '게이트웨이 경유'인가
   │    ├─ scope link (같은 서브넷) → 목적지 IP 의 MAC 을 직접 해석
   │    └─ via 게이트웨이         → 다음 홉(게이트웨이)으로 위임
   │
   ④ 넘길 대상의 MAC 을 ARP 로 해석
   │    (게이트웨이 경유면 '목적지'가 아니라 '게이트웨이의 MAC')
   │
   ⑤ L2 이더넷 프레임 생성 → dev 인터페이스로 송신
   │    출발지 MAC = 내 NIC / 목적지 MAC = 게이트웨이
   │
   ⑥ 다음 홉 라우터가 ①~⑤ 를 자기 테이블로 반복 (TTL -1)
   ▼
[목적지]  홉을 거쳐 도달 (TTL 0 이면 폐기 + ICMP → traceroute 가 이용)

각 단계에서 무슨 일이 일어나고, 어긋나면 어떤 증상인가:

단계하는 일여기서 어긋나면
① 목적지 판별커널이 목적지 IP를 꺼내 라우팅 테이블과 대조 시작목적지 자체가 틀리면(DNS 오해석 등) 이후 전부 엉뚱한 경로
② longest prefix match목적지에 가장 구체적으로(prefix 긴) 맞는 경로 선택, 없으면 default의도한 대역 경로 없으면 default로 새거나, default마저 없으면 Network is unreachable
③ 직접 vs 게이트웨이scope link면 직접 전달, via <게이트웨이>면 다음 홉으로 위임게이트웨이가 내 서브넷 밖 IP면 경로가 성립 안 됨
④ 다음 홉 MAC 해석넘길 대상(게이트웨이, 직접이면 목적지) IP의 MAC을 ARP로 알아냄게이트웨이가 ARP 무응답이면 ip neighINCOMPLETE — 프레임 못 만듦
⑤ L2 프레임 송신목적지 MAC=게이트웨이 MAC인 프레임을 dev 인터페이스로 전송dev가 DOWN이면 경로가 있어도 패킷 손실
⑥ 홉 반복다음 홉 라우터가 자기 테이블로 같은 판단 반복, TTL 1씩 감소되돌아오는 경로가 다르면 비대칭 라우팅 / TTL 0이면 폐기·ICMP

라우팅은 "목적지 IP 하나로 다음 홉을 고르는 계산"을 홉마다 반복하는 것입니다. 라우팅 테이블을 눈으로 읽어 추측하지 말고, ip route get <목적지IP>로 커널이 실제로 고른 경로·인터페이스·출발지 IP를 직접 물어보는 것이 진단의 출발점입니다 — 이 결과가 의도와 다르면 ②(경로 선택)를, 정상인데도 통신이 안 되면 ④ 이하(ARP·L2)나 그 위(방화벽)를 의심합니다.


💡개념

디폴트 게이트웨이와 정적 경로 설정

클라우드 인스턴스를 재시작했더니 어제까지 되던 특정 외부 IP로의 통신이 갑자기 안 됩니다. ping은 되는데 특정 서브넷만 막힙니다. 원인은 재시작 후 임시로 추가한 정적 경로가 사라진 것이었습니다. 디폴트 게이트웨이와 정적 경로의 차이, 영구 설정 방법을 모르면 재부팅마다 경로 설정을 다시 해야 하는 상황이 반복됩니다.

디폴트 게이트웨이와 정적 경로 — 라우팅 테이블에 명시된 경로가 없는 모든 트래픽은 디폴트 게이트웨이(0.0.0.0/0)로 보냄. 특정 네트워크는 ip route add로 정적 경로를 추가해 다른 경로로 보낼 수 있음. "인터넷은 되는데 특정 사내망만 안 됨"은 정적 경로 누락이 흔한 원인확대

디폴트 게이트웨이란

**디폴트 게이트웨이(Default Gateway)**는 라우팅 테이블에 일치하는 경로가 없을 때 패킷을 전달하는 마지막 수단입니다. ip route 출력에서 default via [IP]로 표시됩니다.

DHCP 환경에서는 자동으로 설정되지만, 정적 IP를 사용하는 서버라면 반드시 수동으로 설정해야 합니다. 디폴트 게이트웨이가 없으면 로컬 서브넷 외부와 통신이 불가능합니다.

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 디폴트 게이트웨이 확인
$ ip route show default
default via 10.0.0.1 dev eth0 proto static

# 디폴트 게이트웨이 임시 추가
$ ip route add default via 10.0.0.1 dev eth0

# 디폴트 게이트웨이 삭제
$ ip route del default via 10.0.0.1

정적 경로(Static Route) 추가

특정 서브넷으로 가는 패킷을 다른 게이트웨이로 보내야 할 때 정적 경로를 추가합니다. 대표적인 사례:

  • 사내 전용 서브넷(172.16.0.0/12)은 사내망 라우터를 통해
  • 인터넷 트래픽은 기본 게이트웨이를 통해
위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 정적 경로 추가 (임시 — 재부팅 시 사라짐)
$ ip route add 172.16.0.0/16 via 10.0.0.254 dev eth0

# 경로 확인
$ ip route
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link
172.16.0.0/16 via 10.0.0.254 dev eth0   ← 추가된 정적 경로

# 특정 목적지로의 경로 확인
$ ip route get 172.16.5.10
172.16.5.10 via 10.0.0.254 dev eth0 src 10.0.0.5

# 정적 경로 삭제
$ ip route del 172.16.0.0/16 via 10.0.0.254

영구 경로 설정 방법

Linux 배포판별 정적 라우팅 영구 적용 가이드 (Debian /etc/network/interfaces 등)

서버가 재부팅되면 터미널에 입력한 ip route add 정적 경로는 모두 초기화됩니다. 실무 SRE는 서버 재시작 후에도 설정이 유지되도록 다음과 같이 네트워크 설정 파일에 라우팅 경로를 명시해야 합니다.

  1. Debian/Ubuntu 계열 (Legacy /etc/network/interfaces 환경): 설정 파일 맨 아래에 up route add 지시어를 추가하여 네트워크 인터페이스가 Up 상태가 될 때 커맨드가 자동 기동되도록 구성합니다.
    로컬 터미널
    auto eth0
    iface eth0 inet static
        address 192.168.1.10
        netmask 255.255.255.0
        # 인터페이스 활성화 시 정적 경로 자동 결합
        up ip route add 10.0.0.0/8 via 192.168.1.1 dev eth0
    
  2. 현대적 Netplan 환경 (Ubuntu 18.04+): /etc/netplan/*.yaml 파일을 열어 routes 레이아웃에 직접 정적 게이트웨이를 선언합니다.

RHEL/CentOS (NetworkManager 방식)

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# nmcli로 영구 경로 추가
$ nmcli connection modify eth0 +ipv4.routes "172.16.0.0/16 10.0.0.254"
$ nmcli connection up eth0

# 또는 파일 직접 편집
$ cat /etc/sysconfig/network-scripts/route-eth0
172.16.0.0/16 via 10.0.0.254 dev eth0

Ubuntu/Debian (Netplan 방식)

YAML
# /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      addresses: [10.0.0.5/24]
      gateway4: 10.0.0.1
      routes:
        - to: 172.16.0.0/16
          via: 10.0.0.254
로컬 터미널
# Netplan 적용
$ netplan apply

NIC 2개 서버의 비대칭 라우팅 문제

서버에 NIC가 2개 있을 때(예: 서비스용 eth0 + 관리용 eth1) 단일 디폴트 게이트웨이만 설정하면 **비대칭 라우팅(Asymmetric Routing)**이 발생합니다.

[클라이언트]
    |
    → eth1(10.0.2.10)으로 패킷 수신
    ← 응답이 eth0(10.0.1.10)의 게이트웨이로 나감 ← 문제!

이 문제는 방화벽 상태 추적(stateful inspection)을 깨뜨려 연결 거부나 불안정한 통신을 유발합니다.

해결책: Policy-based Routing (정책 기반 라우팅) — 출처 IP별로 다른 라우팅 테이블을 적용합니다.

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# eth1용 별도 라우팅 테이블 생성
$ echo "200 eth1-table" >> /etc/iproute2/rt_tables

# eth1 테이블에 게이트웨이 추가
$ ip route add default via 10.0.2.1 dev eth1 table eth1-table

# eth1로 들어온 패킷은 eth1-table 사용 규칙
$ ip rule add from 10.0.2.10 lookup eth1-table
라우팅 진단 판단 — 경로가 어디서 어긋나나
특정 대상만 통신 안 됨ip route get <대상IP>로 '실제로 어느 경로·인터페이스로 나가는지' 확인 — 라우팅 테이블을 눈으로 읽지 말고 커널 결정을 물어라. '의도한 경로로 나가는가'부터
경로 우선순위 충돌longest prefix match(더 구체적인 경로 우선) → metric 낮은 것 우선. 같은 대상에 경로가 여러 개면 더 좁은 prefix가 이긴다. '/32가 /24를 이긴다'
NIC 2개 서버에서 응답이 안 옴비대칭 라우팅 — 요청은 eth0, 응답은 기본 게이트웨이(eth1)로 나가 rp_filter에 드롭. 'NIC 2개인데 한쪽만 안 됨'의 전형. policy routing(ip rule)으로 들어온 NIC로 응답
rp_filter 때문에 드롭되는지net.ipv4.conf.<if>.rp_filter가 1(strict)이면 비대칭 경로 패킷을 버림. 멀티홈 서버는 2(loose)로 완화 또는 policy routing. '비대칭+rp_filter=조용한 드롭'
기본 게이트웨이가 여러 개default가 둘이면 metric 낮은 쪽만 사용 — 의도와 다르면 metric 조정. 'default 두 줄 = 하나만 일한다'. ip route로 metric 확인
경로는 맞는데 그래도 안 됨라우팅(L3) 위의 문제 — 방화벽·NAT·대상 LISTEN. ip route get이 정상 경로를 주면 라우팅은 무죄, 그 위를 보라

현재 라우팅 테이블 확인하기

목표

ip route 명령어로 현재 서버의 라우팅 테이블을 읽고, 각 항목의 의미를 파악합니다.

실습 환경

  • 리눅스 서버 (Ubuntu 20.04 이상 또는 CentOS/RHEL 7 이상)
  • root 또는 sudo 권한

단계별 실습

1단계: 라우팅 테이블 전체 출력

로컬 터미널
$ ip route

예상 출력:

default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.5 metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.5 metric 100

각 줄을 읽는 방법:

  • default via 10.0.0.1 dev eth0: 목적지를 모르면 10.0.0.1로 보내고, eth0을 사용한다
  • 10.0.0.0/24 dev eth0 ... scope link: 10.0.0.0/24는 eth0에 직접 연결된 네트워크다

2단계: 특정 목적지 경로 추적

로컬 터미널
# 8.8.8.8로 가는 경로 확인
$ ip route get 8.8.8.8

# 출력 예시:
# 8.8.8.8 via 10.0.0.1 dev eth0 src 10.0.0.5 uid 0
로컬 터미널
# 같은 서브넷 내 호스트 경로
$ ip route get 10.0.0.20

# 출력 예시:
# 10.0.0.20 dev eth0 src 10.0.0.5 uid 0
# ← via가 없음 = 직접 연결

3단계: 라우팅 테이블 상세 보기

로컬 터미널
# 모든 라우팅 테이블 보기
$ ip route show table all

# 캐시된 경로 보기 (커널 3.x 이하에서만)
$ ip route show cache

4단계: 인터페이스별 라우팅 확인

로컬 터미널
$ ip route show dev eth0

확인 포인트

  • default via 항목이 존재하는가?
  • 로컬 서브넷은 scope link로 표시되는가?
  • metric 값이 낮은 경로가 우선 선택되는가?

정적 경로 추가 및 검증

목표

ip route add 명령어로 특정 서브넷에 대한 정적 경로를 추가하고, 통신이 올바른 경로로 이루어지는지 확인합니다.

시나리오

사내 개발 서브넷 192.168.100.0/24는 별도의 게이트웨이 10.0.0.254를 통해야만 접근할 수 있습니다. 현재 이 서브넷으로 통신이 안 됩니다.

단계별 실습

1단계: 현재 상태 확인

로컬 터미널
# 192.168.100.1로 ping 시도 (실패 예상)
$ ping -c 2 192.168.100.1
# connect: Network is unreachable 또는 응답 없음

# 현재 라우팅 테이블 확인
$ ip route
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link

2단계: 정적 경로 추가

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 192.168.100.0/24 서브넷으로 가는 경로를 10.0.0.254 게이트웨이로 설정
$ sudo ip route add 192.168.100.0/24 via 10.0.0.254 dev eth0

# 추가 확인
$ ip route
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link
192.168.100.0/24 via 10.0.0.254 dev eth0   ← 새로 추가됨

3단계: 경로 적용 검증

로컬 터미널
# ip route get으로 경로 확인
$ ip route get 192.168.100.50
# 192.168.100.50 via 10.0.0.254 dev eth0 src 10.0.0.5

# 실제 통신 테스트
$ ping -c 4 192.168.100.1

# traceroute로 경유 경로 확인
$ traceroute 192.168.100.1

4단계: 영구 설정 (Ubuntu Netplan)

로컬 터미널
$ sudo nano /etc/netplan/01-netcfg.yaml
YAML
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses: [10.0.0.5/24]
      gateway4: 10.0.0.1
      routes:
        - to: 192.168.100.0/24
          via: 10.0.0.254
      nameservers:
        addresses: [8.8.8.8]
로컬 터미널
$ sudo netplan apply

5단계: 경로 롤백

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 테스트용 임시 경로 삭제
$ sudo ip route del 192.168.100.0/24 via 10.0.0.254

NIC 2개 환경에서 비대칭 라우팅 진단

목표

NIC가 2개인 서버에서 비대칭 라우팅 문제를 인식하고, 정책 기반 라우팅으로 해결하는 방법을 이해합니다.

시나리오

서버에 두 NIC가 있습니다:

  • eth0: 10.0.1.10/24, 게이트웨이 10.0.1.1 (서비스 트래픽)
  • eth1: 10.0.2.10/24, 게이트웨이 10.0.2.1 (관리 트래픽)

현재 eth0의 게이트웨이만 디폴트로 설정되어 있어, eth1로 들어온 관리 SSH 트래픽 응답이 eth0으로 나가는 비대칭 라우팅이 발생합니다.

단계별 실습

1단계: 현재 상태 진단

로컬 터미널
# 인터페이스 상태 확인
$ ip addr
# eth0: 10.0.1.10/24
# eth1: 10.0.2.10/24

# 라우팅 테이블 확인
$ ip route
default via 10.0.1.1 dev eth0   ← eth1 트래픽도 eth0으로 나감!
10.0.1.0/24 dev eth0 proto kernel scope link
10.0.2.0/24 dev eth1 proto kernel scope link

2단계: 정책 기반 라우팅 테이블 생성

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# rt_tables에 새 테이블 등록
$ echo "200 mgmt" | sudo tee -a /etc/iproute2/rt_tables

# mgmt 테이블에 eth1 기본 경로 추가
$ sudo ip route add default via 10.0.2.1 dev eth1 table mgmt

# eth1 서브넷도 mgmt 테이블에 추가
$ sudo ip route add 10.0.2.0/24 dev eth1 src 10.0.2.10 table mgmt

3단계: 라우팅 규칙 적용

로컬 터미널
# eth1 IP(10.0.2.10)에서 출발한 패킷은 mgmt 테이블 사용
$ sudo ip rule add from 10.0.2.10/32 table mgmt priority 100

# 규칙 확인
$ ip rule show
0:      from all lookup local
100:    from 10.0.2.10 lookup mgmt   ← 추가됨
32766:  from all lookup main
32767:  from all lookup default

4단계: 검증

로컬 터미널
# eth1로 들어오는 트래픽 응답 경로 확인
$ ip route get 10.0.2.50 from 10.0.2.10
# 10.0.2.50 from 10.0.2.10 dev eth1 table mgmt src 10.0.2.10

# eth0 트래픽은 여전히 main 테이블 사용
$ ip route get 8.8.8.8
# 8.8.8.8 via 10.0.1.1 dev eth0 src 10.0.1.10

증상

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
$ sudo ip route add 172.16.0.0/16 via 10.0.0.254
# 정상 작동

# 서버 재부팅 후...
$ ip route
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link
# ← 172.16.0.0/16 경로가 사라짐!

원인

ip route add런타임 명령으로 커널 메모리에만 적용됩니다. 재부팅하면 네트워크 설정이 설정 파일에서 다시 읽히므로 임시 경로는 모두 사라집니다.

해결 방법

운영체제별 영구 설정 방법:

RHEL/CentOS 7 (network-scripts)

위험 명령어

이 명령은 실행 중인 서비스 상태를 바꿔 순간적인 중단이나 설정 반영 실패를 만들 수 있습니다. 운영 트래픽 영향과 재시작 후 확인 명령을 먼저 준비하세요.

로컬 터미널
$ sudo vi /etc/sysconfig/network-scripts/route-eth0
# 내용 추가:
172.16.0.0/16 via 10.0.0.254 dev eth0

$ sudo systemctl restart network

RHEL/CentOS 8+ / Fedora (NetworkManager)

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
$ sudo nmcli connection modify "Wired connection 1" \
    +ipv4.routes "172.16.0.0/16 10.0.0.254"
$ sudo nmcli connection up "Wired connection 1"

# 확인
$ nmcli connection show "Wired connection 1" | grep ipv4.routes

Ubuntu (Netplan)

로컬 터미널
$ sudo vi /etc/netplan/01-netcfg.yaml
# routes 섹션 추가 후:
$ sudo netplan apply

임시 방편: rc.local

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
$ sudo vi /etc/rc.local
# 재부팅 시 자동 실행 스크립트 추가:
ip route add 172.16.0.0/16 via 10.0.0.254 dev eth0

예방 방법

인프라에서 네트워크 변경 시 항상 영구 설정과 임시 명령을 함께 적용하고, 적용 후 ip route 출력을 문서화해 두는 습관을 들이세요.


증상

로컬 터미널
$ ip route
default via 192.168.1.1 dev eth0

$ ping 8.8.8.8
# Request timeout — 응답 없음

$ ping 192.168.1.1
# PING 192.168.1.1: 56 bytes of data
# Request timeout

원인 체크리스트

1. 게이트웨이 자체가 살아있는지 확인

로컬 터미널
# ARP로 게이트웨이 MAC 확인
$ arping -I eth0 -c 3 192.168.1.1

# ARP 테이블 확인
$ arp -n
# 192.168.1.1 항목이 없거나 FAILED이면 물리적 연결 문제

2. 게이트웨이 주소가 올바른지 확인

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 잘못된 케이스: 게이트웨이가 다른 서브넷에 있음
$ ip addr show eth0
# inet 10.0.0.5/24

$ ip route show default
# default via 192.168.1.1 dev eth0  ← 192.168.1.1은 10.0.0.0/24 서브넷에 없음!

# 수정
$ sudo ip route del default
$ sudo ip route add default via 10.0.0.1 dev eth0

3. 인터페이스가 UP 상태인지 확인

로컬 터미널
$ ip link show eth0
# 2: eth0: <BROADCAST,MULTICAST> mtu 1500   ← UP이 없으면 문제!

# UP 상태로 변경
$ sudo ip link set eth0 up

4. NAT/방화벽 문제

로컬 터미널
# 게이트웨이(라우터)에서 NAT 설정 확인
$ sudo iptables -t nat -L POSTROUTING

# 나가는 트래픽 허용 여부
$ sudo iptables -L FORWARD

진단 순서

게이트웨이 ping 실패
    ↓
ARP 응답 확인 → 없으면 물리/스위치 문제
    ↓
ARP 성공인데 ping 실패 → 게이트웨이 ICMP 차단 (보안그룹 확인)
    ↓
게이트웨이 ping 성공인데 외부 ping 실패 → NAT/라우팅 설정 확인

심화 — rp_filter: 커널이 로그도 없이 버리는 비대칭 패킷

💡개념

심화: 리버스 경로 필터(rp_filter)와 비대칭 라우팅의 조용한 드롭

NIC가 2개인 서버에서 "요청은 tcpdump에 찍히는데 응답이 사라지고 로그조차 없다"는 유령 같은 증상의 정체는 대개 rp_filter입니다. 이 커널 검사의 동작을 알아야 정책 기반 라우팅이 왜 필요한지 납득됩니다.

  • 무엇을 검사하나: rp_filter는 패킷이 들어온 인터페이스가, 그 출발지 IP로 되돌아가는 경로(FIB 역방향 조회)의 인터페이스와 일치하는지 커널이 검사하는 리버스 경로 검증입니다.
  • strict vs loose: 1(strict)은 응답이 나갈 인터페이스와 들어온 인터페이스가 다르면(비대칭) 폐기합니다. 2(loose)는 어느 인터페이스로든 그 출발지로 나가는 경로만 있으면 통과시킵니다. 0은 검사하지 않습니다.
  • 멀티홈에서 자연히 깨진다: 디폴트 게이트웨이가 하나뿐이면, eth1로 들어온 요청의 응답이 eth0 경로로 나가려다 eth1의 strict 검사에 걸려 사라집니다. 방화벽이 아니라 라우팅 스택이 버리는 것입니다.
  • 조용함이 핵심: rp_filter 폐기는 기본적으로 로그를 남기지 않습니다. net.ipv4.conf.<if>.log_martians=1을 켜야 dmesg에 martian source 로그가 남고, nstat -az의 리버스 경로 폐기 카운터로 드러납니다.
  • 근본책: 정책 기반 라우팅(ip rule + 별도 테이블)으로 들어온 NIC로 응답이 나가는 대칭 경로를 만듭니다. 임시로는 rp_filter2로 완화하되, all과 인터페이스별 값 중 큰 값이 적용되므로 둘 다 낮춰야 합니다.

상황: eth0로 오는 트래픽은 정상인데 eth1(관리망 등)로 들어오는 접속만 무응답입니다. tcpdump로 보면 SYN은 들어오는데 SYN-ACK가 나가지 않습니다.

원인: 디폴트 게이트웨이가 eth0 하나뿐이라, eth1로 들어온 요청의 응답이 eth0 경로로 향합니다. 그 순간 eth1rp_filter=strict가 이 비대칭 경로를 로그 없이 폐기합니다. 방화벽·앱이 아니라 커널 라우팅 단계에서 사라진 것입니다.

진단: sysctl net.ipv4.conf.eth1.rp_filternet.ipv4.conf.all.rp_filter 값이 1인지 확인합니다. net.ipv4.conf.eth1.log_martians=1을 켠 뒤 dmesg에 martian source가 찍히는지, nstat -az의 리버스 경로 폐기 카운터가 요청마다 증가하는지 봅니다. ip route get <출발지IP> from <서버IP> iif eth1로 커널이 고른 응답 경로가 eth0으로 어긋나는지 확정합니다.

해결: 정책 기반 라우팅으로 eth1 전용 테이블(ip route add default via <eth1-gw> dev eth1 table 200 + ip rule add from <eth1-IP> lookup 200)을 만들어 들어온 NIC로 응답이 나가는 대칭 경로를 확보합니다. 임시로는 net.ipv4.conf.eth1.rp_filter=2로 완화하되 all.rp_filter도 함께 낮춰야 적용됩니다.


💼
실무 맥락
현업 패턴

온콜 엔지니어의 하루

새벽 2시, 모니터링 알림이 울립니다. 특정 서비스 노드들이 데이터베이스 서버에 접속 불가 상태입니다. SSH로 접속해 빠르게 진단합니다.

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 데이터베이스 서버(172.16.5.10)로 ping
$ ping -c 3 172.16.5.10
# connect: Network is unreachable

# 라우팅 테이블 확인
$ ip route
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link
# ← 172.16.0.0/16 경로가 없음!

# 원인 파악: 오늘 오후 네트워크 팀이 라우터 교체 작업을 했고
# 새 라우터의 IP가 10.0.0.254로 변경됨

$ sudo ip route add 172.16.0.0/16 via 10.0.0.254
$ ping -c 3 172.16.5.10
# 64 bytes from 172.16.5.10: icmp_seq=1 ttl=63 time=0.8 ms ← 복구!

5분 만에 서비스가 복구됩니다. 이후 영구 설정과 다른 노드들에도 동일하게 적용합니다.

이 기술이 필요한 직군

직군활용 상황
서버/인프라 엔지니어멀티홈 서버 라우팅 설정, VPC 피어링 후 경로 추가
DevOps/SRE컨테이너 네트워크(Pod CIDR) 라우팅 설정, 서비스 복구
클라우드 엔지니어AWS Route Table, GCP Cloud Router 설정
네트워크 엔지니어BGP/OSPF 동적 라우팅 설계, 정책 기반 라우팅

알아두면 차별화되는 지식

클라우드 환경의 라우팅

AWS VPC에서는 각 서브넷에 Route Table이 연결됩니다. 콘솔에서 설정하는 내용이 결국 ip route와 동일한 개념입니다:

Destination     Target
10.0.0.0/16     local           ← 동일 VPC
172.16.0.0/16   tgw-xxxxx       ← Transit Gateway (온프레미스 연결)
0.0.0.0/0       igw-xxxxx       ← Internet Gateway (인터넷 출구)

클라우드 콘솔 Route Table을 자신 있게 다루려면 기본 ip route 개념이 탄탄해야 합니다.

컨테이너/쿠버네티스 환경

쿠버네티스 클러스터에서 Pod 간 통신도 결국 라우팅입니다. CNI 플러그인(Flannel, Calico 등)이 자동으로 각 노드에 라우팅 테이블을 구성합니다:

로컬 터미널
# 쿠버네티스 노드에서의 ip route 예시
$ ip route
10.244.0.0/24 dev cni0 scope link        ← 자신의 Pod 서브넷
10.244.1.0/24 via 10.0.0.11 dev flannel0 ← 다른 노드의 Pod 서브넷

이 라우팅을 이해하면 Pod 간 통신 문제를 빠르게 진단할 수 있습니다.


핵심 명령어 요약

위험 명령어

이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.

로컬 터미널
# 라우팅 테이블 확인
ip route
ip route show

# 특정 목적지 경로 추적
ip route get [목적지 IP]

# 정적 경로 추가 (임시)
ip route add [서브넷/prefix] via [게이트웨이] dev [인터페이스]

# 디폴트 게이트웨이 추가 (임시)
ip route add default via [게이트웨이] dev [인터페이스]

# 경로 삭제
ip route del [서브넷/prefix] via [게이트웨이]

# 경로 변경
ip route change [서브넷/prefix] via [새 게이트웨이]

# 정책 라우팅 규칙 확인
ip rule show

체크리스트

라우팅 설정 전 반드시 확인할 사항:

  • 게이트웨이 IP가 자신과 같은 서브넷에 있는가?
  • ip route get [목적지]로 경로가 올바르게 잡히는가?
  • 영구 설정 파일에도 반영했는가?
  • NIC가 2개 이상이라면 비대칭 라우팅 가능성을 검토했는가?
  • 변경 전 기존 라우팅 테이블을 백업/문서화했는가?

관련 모듈로 더 깊이:

다음 모듈에서는 DNS 동작 원리와 도메인 질의 과정, dig로 DNS 문제를 진단하는 방법을 다룹니다.

지식 확인

퀴즈 — 8문제

Q1

서버 A(10.0.1.10/24)에서 외부 API(8.8.8.8)를 호출하면 타임아웃됩니다. `ping 10.0.1.1`(게이트웨이)은 성공합니다. `ip route show`에 `default` 항목이 없습니다. 무슨 상황입니까?

Q2

서버 재부팅 후 `ip route show`에 `default` 경로가 사라졌습니다. 지난번에 `ip route add default via 10.0.1.1`로 추가했었는데 왜 사라졌습니까?

Q3

서버에 NIC가 2개(eth0: 10.0.1.10, eth1: 10.0.2.10) 있을 때, eth1로 들어온 패킷이 eth0로 나가는 현상을 무엇이라 하는가?

Q4

`ip route add 172.16.0.0/16 via 10.0.0.254` 명령어의 의미는?

Q5

정적 경로(static route)를 영구 적용하려면 어디에 설정해야 하는가?

Q6

라우터(또는 라우팅 기능을 켠 리눅스)가 패킷을 받아 어디로 보낼지 정하는 기본 원리는?

Q7

[심화] 멀티홈(NIC 2개) 서버에서 net.ipv4.conf.eth1.rp_filter가 1(strict)일 때 커널이 하는 일은?

Q8

[심화] NIC 2개 서버에서 eth1로 들어온 요청에 대한 응답만 사라진다. tcpdump에는 요청이 보이는데 응답은 안 나가고 앱 로그에도 방화벽 로그에도 흔적이 없다. 원인을 확정하기 위한 확인으로 가장 적절한 것은?

0 / 8 답변

🧪 실습으로 확인하기

라우팅·게이트웨이 — "어떤 대역만 안 닿는" 문제 진단

중급

같은 서버인데 어떤 대역은 닿고 어떤 대역은 안 닿는다. 답은 라우팅 테이블에 있다. ip route로 목적지별 경로를 읽고, 어느 게이트웨이로 나가는지·경로가 누락됐는지 진단하고, 정적 경로/기본 게이트웨이를 바로잡는다. 비대칭 라우팅과 방화벽을 라우팅 문제로 오인하지 않는 분별까지 다룬다.

40📋 3단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요