Ubuntu에서 iptables 설정하기

Ubuntu에서 iptables 설정하기

iptables는 Linux 커널의 Netfilter 기능을 사용자 공간에서 다루기 위한 도구로, 방화벽 정책과 NAT를 구성할 때 널리 사용됩니다. 시스템 관리자는 테이블(table), 체인(chain), 규칙(rule)의 세 가지 축을 조합해 네트워크 트래픽을 제어합니다.

프로토콜별 도구는 다음과 같이 구분됩니다.
iptables(IPv4), ip6tables(IPv6), arptables(ARP), ebtables(이더넷 프레임).

일반적인 Linux 배포판에서는 /usr/sbin/iptables 경로에 설치됩니다. 또한 iptables의 뒤를 잇는 차세대 프레임워크로 nftables가 있으며, 코드 중복을 줄이고 처리 경로를 단순화했다는 점이 알려져 있습니다. (상세 소개는 https://en.wikipedia.org/wiki/Nftables 참고)


준비사항 (PREREQUISITE)

테스트는 Ubuntu 서버 환경을 전제로 하며, 명령 실행에는 root 권한이 필요합니다. UFW(Uncomplicated Firewall)를 함께 쓰는 경우 충돌을 피하려면 설정 전에 UFW를 비활성화 또는 제거하는 편이 안전합니다.

예제는 VMware® Workstation 15 Pro(15.5.1 build-15018445) 상에서 구동되는 Ubuntu 18.04.4 LTS(Bionic Beaver, 64-bit, Server)로 검증했습니다.


요약 (SUMMARY)

  • iptables 확인·초기화 방법
  • 규칙 조회 옵션과 출력 형식 구분
  • 핵심 용어(타깃/체인/테이블/파라미터/커맨드) 정리
  • 규칙 추가/확인/삭제/삽입/교체/정책/카운터 초기화 등 실전 명령

iptables 개요

iptables는 커널 2.4부터 ipchains를 대체한 방화벽 도구로, Netfilter의 패킷 필터링을 사용자 공간에서 선언적으로 제어합니다. 상태 추적, 애플리케이션 계층 매치, 속도 제한, 정책 관리 등 다양한 확장 모듈과 함께 활용됩니다. Ubuntu 18.04에는 기본적으로 iptables와 프런트엔드 도구인 UFW가 포함됩니다. 아래 예제는 root 권한을 가진 사용자가 직접 iptables를 다룬다는 가정으로 진행합니다.


1. iptables 확인 및 초기화

주의: 원격 서버에서 초기화·정책 변경을 수행할 때는 SSH 차단을 피하기 위해 허용 규칙을 먼저 적용한 뒤 정책을 강화하세요.

1.1. iptables 확인

# which iptables
/sbin/iptables

# iptables -V
iptables v1.6.1

1.2. iptables 초기화

모든 체인의 모든 규칙 제거

# iptables -F

기본 체인을 제외한 사용자 정의 체인 제거

# iptables -X

2. iptables 조회

아래 출력은 초기 상태를 가정한 예시입니다.

기본 조회

# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

조회 옵션

  • -v, --verbose : 체인별/규칙별 패킷·바이트 카운터, 인터페이스 등 상세 표시
  • -n, --numeric : 호스트/서비스 이름 대신 IP·포트 숫자로 표시
  • -x, --exact : 카운터를 정확한 값으로 확장
  • --line-numbers : 각 규칙 앞에 번호를 부여

상세 조회 예시

# iptables -L -v
Chain INPUT (policy ACCEPT 10 packets, 676 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 5 packets, 812 bytes)
pkts bytes target prot opt in out source destination

IP/포트 숫자 표기로 조회

# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

정확한 값으로 확장

# iptables -L -x
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

라인 번호 포함 조회

# iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination

Chain FORWARD (policy ACCEPT)
num target prot opt source destination

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

전체 규칙 ‘선언형’ 출력

# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

카운터 포함한 선언형 출력

# iptables -S -v
-P INPUT ACCEPT -c 117 8240
-P FORWARD ACCEPT -c 0 0
-P OUTPUT ACCEPT -c 103 13208
  • -L은 사람이 읽기 좋은 목록(참조용), -S는 재적용 가능한 선언형 출력(iptables-restore용)입니다.
우분투 환경에 iptables 설정하기
Ubuntu에서 iptables 설정하기

3. iptables 용어

iptables는 테이블(table)체인(chain)규칙(rule)의 3단 구성으로 동작합니다. 각 규칙이 트래픽과 일치하면, 해당 규칙에 지정한 타깃(target) 동작이 실행됩니다.

3.1. target(타깃)

타깃은 “규칙에 일치했을 때 무엇을 할지”를 정의합니다. 대표적인 타깃은 다음과 같습니다.

  • ACCEPT — 패킷을 통과시킵니다.
  • DROP — 무응답으로 폐기합니다(상대는 타임아웃으로 인지).
  • REJECT — 오류 응답(ICMP/포트 거부 등)을 돌려보내며 차단합니다.
  • LOG — 규칙에 일치한 패킷을 syslog에 기록합니다(허용/차단과 별개).
  • RETURN — 현재 체인 처리를 중단하고, 호출 지점의 다음 규칙으로 돌아갑니다.
  • QUEUE — 패킷을 사용자 공간 큐로 전달합니다(특수한 패킷 처리에 사용).
  • SNAT — 소스 주소 변환(출발지 IP/포트 재작성, 보통 POSTROUTING에서).
  • DNAT — 목적지 주소 변환(도착지 IP/포트 재작성, 보통 PREROUTING에서).

예시: 80/tcp 허용과 23/tcp(telnet) 차단 로그

## 80 허용
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

## 23 접근 시 로그 남기고 드롭
#iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "TELNET_BLOCK "
#iptables -A INPUT -p tcp --dport 23 -j DROP

3.2. chain(체인)

체인은 “규칙들의 순서 있는 목록”입니다. 위에서 아래로 평가하며, 어떤 규칙에 일치해 타깃이 실행되면 그 체인에서는 더 내려가지 않습니다. 체인은 트래픽이 흐르는 시점/방향에 따라 다음과 같이 쓰입니다.

  • INPUT — 이 호스트로 들어오는 트래픽에 대한 정책.
  • OUTPUT — 이 호스트에서 나가는 트래픽에 대한 정책.
  • FORWARD — 라우팅되어 경유만 하는 트래픽(게이트웨이/라우터에서).
  • PREROUTING — 라우팅 결정 이전 단계(주로 DNAT).
  • POSTROUTING — 라우팅 처리 이후 단계(주로 SNAT/마스커레이드).

INPUT·FORWARD·OUTPUT는 기본 체인이므로 삭제할 수 없습니다. 필요하면 -N으로 사용자 정의 체인을 만들고, -j로 분기해 재사용 가능한 정책 블록을 구성합니다.

예시: SSH 방화벽을 별도 체인으로 분리

## 체인 생성
# iptables -N SSH_GUARD

## INPUT에서 SSH_GUARD로 분기
# iptables -A INPUT -p tcp --dport 22 -j SSH_GUARD

## 내부망은 허용, 그 외는 지연 후 거부 같은 커스텀 로직 배치 가능
# iptables -A SSH_GUARD -s 10.0.0.0/8 -j ACCEPT
#i ptables -A SSH_GUARD -j REJECT

3.3. table(테이블)

테이블은 “어떤 목적의 처리를 할 것인지”를 구분합니다. 명령에 -t를 지정해 선택하며, 테이블마다 제공하는 기본 체인이 다릅니다.

  • filter: 접근 제어(허용/차단/로그)의 중심. 기본 테이블이므로 -t를 생략하면 filter가 선택됩니다.
    • 기본 체인: INPUT, FORWARD, OUTPUT.
  • nat: 주소 변환(SNAT/DNAT). 신규 연결 시 참조합니다.
    • 기본 체인: PREROUTING, INPUT, OUTPUT, POSTROUTING. (IPv6 NAT는 커널 버전에 따라 지원됨)
  • mangle: 패킷 성형/마킹(DSCP/TTL/mark 등).
    • 기본 체인: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.
  • raw: 연결 추적(Conntrack) 예외 지정(NOTRACK).
    • 기본 체인: PREROUTING, OUTPUT.
  • security: SELinux 등 MAC(강제 접근 제어) 정책 연계.
    • 기본 체인: INPUT, FORWARD, OUTPUT.

예시: NAT 포워딩

## 외부 203.0.113.10:8080 → 내부 10.0.1.50:80
# iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 8080 -j DNAT --to-destination 10.0.1.50:80

## 사설 대역을 외부로 NAT
# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE

3.4. parameter(파라미터)

파라미터는 규칙의 “조건”과 “작동 방식”을 구체화합니다. 자주 쓰는 항목은 다음과 같습니다.

  • -4 / -6: IPv4/IPv6 전용 규칙 파일과 혼용 시 구분에 사용(restore 스크립트에서 유용).
  • -p: 프로토콜 지정(예: tcp, udp, icmp).
  • -s / -d: 출발지/목적지(호스트명, IP, CIDR 모두 가능).
  • -i / -o: 인바운드/아웃바운드 인터페이스.
  • -m <모듈>: 확장 매치 사용(예: -m state, -m conntrack, -m multiport 등).
  • -j <타깃>: 일치 시 실행할 동작 지정(ACCEPT/DROP/REJECT/LOG/SNAT/DNAT/…).
  • -g <체인>: 지정 체인으로 “이동”하여 계속 처리(-j와 유사하지만 RETURN 동작 차이가 있습니다).
  • -f: 조각난 IPv4 패킷의 두 번째 이후 조각만 매치.
  • -c: 규칙 추가/교체 시 카운터(패킷/바이트) 초기값 설정.

예시: 여러 포트를 한 번에 허용(multiport 모듈)

# iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

3.5. command(커맨드)

커맨드는 “규칙을 어떻게 다룰지(추가/삽입/교체/삭제/조회/초기화 등)”를 지정합니다. 핵심 명령은 다음과 같습니다.

  • -A / --append: 선택한 체인의 에 규칙 추가.
  • -I / --insert: 지정 위치(번호)에 규칙 삽입.
  • -R / --replace: 특정 번호 규칙을 교체.
  • -D / --delete: 규칙식 또는 번호로 삭제.
  • -C / --check: 규칙이 이미 존재하는지 확인(중복 추가 방지에 유용).
  • -L / --list: 읽기 쉬운 목록으로 조회(옵션: -v, -n, -x, --line-numbers).
  • -S / --list-rules: 재적용 가능한 선언형 출력(백업/배포 자동화에 적합).
  • -F / --flush: 체인 내 규칙을 모두 비웁니다.
  • -N / -E / -X: 사용자 정의 체인 생성/이름변경/삭제.
  • -P / --policy: 기본 체인의 정책을 ACCEPT/DROP 등으로 설정.
  • -Z / --zero: 규칙/체인의 카운터를 0으로 초기화.

예시: 규칙 삽입/교체/삭제

## 1번 위치에 SSH 허용 삽입
# iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

## 1번 규칙을 내부망 허용으로 교체
# iptables -R INPUT 1 -p tcp -s 10.0.0.0/8 --dport 22 -j ACCEPT

## 1번 규칙 삭제
# iptables -D INPUT 1

타깃은 “일치 시 동작”, 체인은 “평가 순서와 방향”, 테이블은 “처리 목적”을 결정합니다. 파라미터로 조건을 상세히 정의하고, 커맨드로 규칙을 관리합니다. 이 네 요소를 일관된 원칙으로 설계하면, 정책 변경·배포·복구가 모두 쉬워집니다.

우분투 환경에 iptables 설정하기

4. iptables 사용 방법

4.1. 규칙 추가(append)

# iptables [table] -A chain rule-specification
# iptables [-t TABLE-NAME] -A chain -m MATCH-NAME [match-options] -j TARGET-NAME [target-options]
## 로컬 루프백 허용
# iptables -A INPUT -i lo -j ACCEPT

4.2. 규칙 확인(check)

# iptables [table] -C chain rule-specification
# iptables [-t TABLE-NAME] -C chain -m MATCH-NAME [match-options] -j TARGET-NAME [target-options]
## TCP 8080 허용 규칙 존재 여부
iptables -C INPUT -p tcp --dport 8080 -j ACCEPT

4.3. 규칙 삭제(delete, 규칙식)

# iptables [table] -D chain rule-specification
# iptables [-t TABLE-NAME] -D chain -m MATCH-NAME [match-options] -j TARGET-NAME [target-options]
## TCP 22 REJECT 규칙 삭제
iptables -D INPUT -p tcp -m tcp --dport 22 -j REJECT

4.4. 규칙 삭제(delete, 번호)

# iptables [table] -D chain rule-number
# iptables [-t TABLE-NAME] -D chain rule-number
## FORWARD 체인 1번 규칙 삭제
iptables -D FORWARD 1

4.5. 규칙 삽입(insert)

# iptables [table] -I [rule-number] rule-specification
# iptables [-t TABLE-NAME] -I chain [rule-number] -m MATCH-NAME [match-options] -j TARGET-NAME [target-options]
## INPUT 1번 위치에 UDP 53 DROP
iptables -I INPUT 1 -p udp --dport 53 -j DROP

4.6. 규칙 교체(replace)

# iptables [table] -R rule-number rule-specification
# iptables [-t TABLE-NAME] -R chain rule-number -m MATCH-NAME [match-options] -j TARGET-NAME [target-options]
## INPUT 1번을 10.0.1.0/24 → TCP 8080 허용으로 교체
iptables -R INPUT 1 -p tcp -s 10.0.1.0/24 --dport 8080 -j ACCEPT

4.7. 규칙 조회(list)

# iptables [table] -L [chain [rule-number]] [options]
# iptables [-t TABLE-NAME] -L [chain [rule-number]] [options]
## 서비스 이름 기반
# iptables -L

## 포트 번호 기반
# iptables -L -n

4.8. 규칙 모두 삭제(flush)

# iptables [table] -F [chain [rule-number]] [options]
# iptables [-t TABLE-NAME] -F [chain [rule-number]] [options]
## 모든 체인 비우기
# iptables -F

## FORWARD 체인만 비우기
# iptables -F FORWARD

4.9. 규칙 출력(list-rules)

# iptables [table] -S [chain [rule-number]]
# iptables [-t TABLE-NAME] -S [chain [rule-number]]
# iptables -S OUTPUT 1

4.10. 사용자 정의 체인 생성

# iptables [table] -N chain
# iptables [-t TABLE-NAME] -N chain
# iptables -N rex-chain-income

4.11. 사용자 정의 체인 이름 변경

# iptables [table] -E old-chain-name new-chain-name
# iptables [-t TABLE-NAME] -E old-chain-name new-chain-name
# iptables -E rex-chain-income rex-chain-income-new

4.12. 사용자 정의 체인 삭제

# iptables [table] -X [chain]
# iptables [-t TABLE-NAME] -X [chain]
# iptables -X rex-chain-income-new

4.13. 기본 체인 정책(policy) 설정

# iptables [table] -P chain target
# iptables [-t TABLE-NAME] -P chain -j TARGET-NAME [target-options]
## FORWARD 정책을 DROP으로 강화
# iptables -P FORWARD DROP

4.14. 카운터 초기화(zero)

# iptables [table] -Z [chain [rule-number]] [options]
# iptables [-t TABLE-NAME] -Z [chain [rule-number]] [options]
# iptables -Z FORWARD

마무리(CONCLUSION)

Ubuntu에서 iptables 설정하기

여기까지 Ubuntu 환경에서 iptables로 방화벽과 NAT 정책을 구성·조회·관리하는 방법을 정리했습니다. 보안을 강화할 수 있지만, 규칙 순서·기본 정책 설정 오류로 원격 접속이 끊길 수 있으니 적용 전후로 꼭 점검하시기 바랍니다.


참고 자료


취업, 이직, 퇴사, 커리어 고민으로 힘든가요?

Notices를 확인하고 상담 서비스를 받으세요.

1분만 투자하세요.
1분으로 1년을 아끼고, 10년의 커리어가 달라져요.