본문 바로가기
자격증

[리눅스마스터 1급] 18. 방화벽 설정 (iptables)

by LimSeongHyeon 2025. 5. 5.


iptables

iptables는 리눅스에서 네트워크 패킷 필터링과 방화벽 기능을 담당하는 커맨드라인 도구이다. 실제 동작은 리눅스 커널 안의 netfilter 프레임워크에서 처리되고, iptables는 그 규칙을 설정, 조회, 관리하는 역할을 한다. 즉, 리눅스에서 “어떤 네트워크 패킷을 허용할지, 차단할지, 수정할지” 결정하는 방화벽 도구이다.

 

 

OPTIONS
옵션 설명 예시
-p 프로토콜 지정 (tcp, udp, icmp) -p tcp
-s / -d 출발지 / 목적지 IP 주소 (또는 대역) 지정 -s 192.168.1.0/24
-d 10.0.0.5
--sport / --dport 출발지 / 목적지 포트 지정 --dport 22
-i / -o 입력 / 출력 인터페이스 지정 -i eth0
-o eth1
-m state --state 상태 모듈: 연결 상태 기반 필터링 (NEW, ESTABLISHED, RELATED) -m state --state ESTABLISHED
-m limit 속도 제한 모듈 -m limit --limit 5/min
모든 테이블에 대해서 특정 옵션을 지정하는 내용은 동일하기 때문에 해당 옵션을 익혀 하단 테이블 설명에 참고하여 적용하면 된다.

 

 

 

filter

iptables에서 가장 기본적이고 많이 쓰는 테이블로, 주로 패킷의 허용/차단을 담당한다. filter Table을 사용하기에 -t filter를 작성하고 그 이후 원하는 체인(상황), 원하는 옵션(조건)들, 마지막으로 해당 옵션이 성립할 때 행할 action을 선택해주면 된다.
꼭 해당 트리를 기억해두고 상황에 맞는 체인, 옵션, 액션을 조합해서 작성하자.

 

 

ACTION

액션 설명
ACCEPT 패킷 허용
DROP 패킷 무응답으로 버림 (상대방은 모름)
REJECT 패킷 거부 (거부 응답을 보냄, ICMP 메시지 사용)
LOG 패킷을 로그에 기록 (/var/log/messages)
RETURN 사용자 정의 체인에서 상위 체인으로 복귀

 

해석해보자!

1) $ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
2) $ iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j DROP
더보기

1) -t가 생략되어 있으므로 filter table이고, 들어오는 패킷이 tcp - 22port면 허용한다.

2) -t가 생략되어 있으므로 filter table이고, 들어오는 패킷이 tcp - 80에 source ip가 192.168.1.100이면 무응답으로 버린다.

 

nat

NAT (Network Address Translation)은 네트워크에서 IP 주소나 포트 번호를 다른 값으로 변환하는 기술이다.
공유기에서 내부 사설 IP를 공인 IP로 바꾸어 외부와 통신하거나, 하나의 공인 IP로 여러 내부 호스트가 외부와 통신하는 것. 그리고, 특정 외부 요청을 내부 서버로 포워딩 하는 것과 같은 설정이 가능하다.

 

 

CHAIN

체인 설명
PREROUTING 패킷이 라우팅 결정 전에 처리됨 (목적지 IP/포트 변경, DNAT/REDIRECT)
OUTPUT 로컬에서 발생한 패킷 처리 (예: 서버에서 생성된 패킷의 목적지 변경)
POSTROUTING 패킷이 라우팅 결정 후 처리됨 (출발지 IP/포트 변경, SNAT/MASQUERADE)

 

 

ACTION

액션 설명
DNAT 목적지 IP 또는 포트를 변경 (Destination NAT, 예: 포트포워딩)
REDIRECT 패킷의 목적지를 로컬 머신으로 돌림 (예: 80포트 → 8080 리다이렉트)
SNAT 출발지 IP 또는 포트를 변경 (Source NAT, 예: 서버 외부 통신 시 공용 IP로 변경)
MASQUERADE 동적 IP 환경에서 출발지 IP를 자동으로 변경 (예: 공유기에서 NAT)

 

 

tip, nat 꼭 알아두자!

들어오는 것 = 들어오기 직전(PREROUTING)에 DNAT (destination IP 변경)
$ iptables -t nat -A PREROUTING [OPTIONS] -j DNAT --to-destination [IP]

나가는 것 = 나가기 직전(POSTROUTING)에 SNAT(source IP 변경)
$ iptables -t nat -A POSTROUTING [OPTIONS] -j SNAT --to [IP]

 

 

테스트 문제

$ iptables (?) -o eth0 (?) --to 201.23.5.11
1) 첫 번째 이더넷카드(eth0)를 통해 외부로 나가는 패킷에 201.23.5.11번 IP주소를 부여한다.

$ iptables (?) -p tcp -d 203.200.1.14 --dport 80 (?) --to 201.23.5.11:80
2) 203.200.1.14의 80포트로 들어오는 패킷을 201.23.5.11의 80 포트로 연결한다.
더보기

1) $ iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 201.23.5.11

2) $ iptables -t nat -A PREROUTING -p tcp -d 203.200.1.14 --deport 80 -j DNAT --to 201.23.5.11:80

 

mangle

 

 

raw

 

관련 명령어

 

규칙 초기화

# filter 테이블 모든 체인 삭제
$ iptables -F

# nat 테이블 모든 체인 삭제
$ iptables -t nat -F

# nat 테이블 POSTROUTING 체인 삭제
$ iptables -t nat -F POSTROUTING

 

 

규칙 확인

# filter 테이블의 모든 체인 확인
$ iptables -L

# filter 테이블의 모든 체인 확인 (port와 같은 내용은 숫자값으로 변경)
$ iptables -nL

# filter 테이블의 모든 체인을 자세히 확인
$ iptables -vL

# nat 테이블의 모든 체인을 확인
$ iptables -t nat -L

# nat 테이블의 POSTROUTING 체인 확인
$ iptables -t nat -L POSTROUTING

 

규칙 수정

# INPUT 체인 맨 앞에 443 허용 삽입
iptables -I INPUT -p tcp --dport 443 -j ACCEPT

# INPUT 체인 2번째 위치에 53번 포트 허용 삽입
iptables -I INPUT 2 -p udp --dport 53 -j ACCEPT

# INPUT 체인 2번째 규칙을 "80번 포트 허용"으로 교체
$ iptables -R INPUT 2 -p tcp --dport 80 -j ACCEPT

# INPUT 체인 3번째 규칙 삭제
iptables -D INPUT 3

# INPUT 체인에서 ssh(22) 허용 규칙 삭제
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-I 옵션은 -A처럼 추가하는 옵션이지만, -A는 체인 맨 끝에 추가하는 방식이고 -I는 맨 앞에 추가 혹은 추가 지점을 지정할 수 있는 옵션이다.

 

 

파일 저장 및 불러오기

$ iptables-save > sample-firewall.sh
$ iptables-restore < smaple-firewall.sh

문제

 

iptables

 

아래 iptables에 관련된 조건에 맞는 명령어를 작성하세요.

1) FILTER 테이블의 모든 체인에 설정된 정책 정보를 출력한다.
2) FILTER 테이블의 모든 체인에 설정도니 정책 정보 (포트, 프로토콜 등)을 숫자값으로 출력한다.
3) FITLER 테이블의 모든 체인에 설정된 정책 정보를 패킷, 바이트 등을 추가하여 자세히 출력한다.
4) FILTER 테이블의 INPUT 체인에 설정된 정책 정보를 출력한다.
5) NAT 테이블에 설정된 정책 정보를 출력한다.
6) FILTER 테이블에 설정된 INPUT 체인에 설정된 정책 정보의 앞부분에 번호를 붙여 출력한다.
더보기

1) $ iptables -L

2) $ iptables -nL

3) $ iptables -vL

4) $ iptables -L INPUT

5) $ iptables -t NAT -L

6) $ iptables -L INPUT --line-numbers

 

 

아래 조건에 맞는 iptables 명령어를 작성하세요.

$ iptables ① INPUT ②
$ iptables ③ INPUT -s 192.168.10.24 ④

[조건]
외부로 들어오는 패킷을 모두 거부하고, IP 주소가 192.168.10.24인 호스트에서 들어오는 패킷에 대해서만 허용하는 정책을 설정한다.
더보기

1) -P

2) REJECT 혹은 DROP

3) -A

4) ACCEPT

 

 

iptables NAT에 관련하여 아래 조건에 맞는 명령어를 작성하세요.

1) POSTROUTING 체인의 규칙 확인
2) PREROUTING 체인의 규칙 초기화
3) PREROUTING 체인에 80포트로 들어오는 트래픽을 192.168.10.1로 전달하는 규칙 추가
더보기

1) $ iptables -t nat -L POSTROUTING

2) $ iptables -t nat -F PREROUTING

3) $ iptables -t nat -A PREROUTING --dport 80 -j DNAT --to-destination 192.168.10.1

 

iptables 기반으로 하나의 공인 IP 주소를 공유해서 다수의 컴퓨터를 사용하려고 한다. 이에 맞는 명령어를 작성하세요.

$ iptables -t ① -A ② ③ eth0 -j ④ --to 200.100.51.4

[조건]

해당 시스템에는 이더넷 카드 두개가 장착되어 있고, 외부망과 연결된 첫 번째 이더넷 카드(eth0)의 공인 IP 주소는 200.100.51.4이다.
더보기

$ iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 200.100.51.4

 

1) nat

2) POSTROUTING

3) -o

4) SNAT

 

 

하나의 공인 IP 주소를 이용하여 다수의 서버를 연결하여 구성한 상태에서, iptables를 이용하여 방화벽 규칙을 설정하는 과정을 알맞게 작성하세요.

$ iptables -t ① -A ② -p ③ -d 203.20.13.100 ④ -j ⑤ --to ⑥

[조건]
외부에서 들어오는 웹 서비스 요청을 내부 192.168.0.12인 웹 서버로 전달한다.
더보기

$ iptables -t nat -A PREROUTING -p tcp -d 203.20.13.100 --dport 80 -j DNAT --to 192.168.0.12

 

1) nat

2) PREROUTING

3) tcp

4) --deport 80

5) DNAT

6) 192.168.0.12

 

 

아래 iptables와 관련하여 해당 조건에 해당되는 명령어를 작성하세요

1) 현재 설정되어 있는 iptables의 규칙을 iptables_v01.backup 파일로 저장한다.
2) 현재 설정되어 있는 iptables의 filter 테이블의 규칙을 전부 제거한다.
3) iptables_v01.backup 파일에 저장되어 있는 iptables의 규칙을 불러와 반영한다.
4) 적용된 iptables의 filter 테이블 규칙을 확인한다.
더보기

1) $ iptables-save > iptables_v01.backup

2) $ iptables -F

3) $ iptables-restore < iptables_v01.backup

4) $ iptables -L

 

 

다음 iptables와 관련하여 해당 조건에 해당되는 명령어를 작성하세요.

$ iptables (?) (?) -j DROP
1) filter 테이블의 INPUT 체인 2번째 정책의 source ip 주소를 192.168.20.5로 수정하려고 한다.

$ iptables (?)
2) filter 테이블의 INPUT 체인 5번째 정책을 제거한다

$ iptables (?) -j LOG
3) filter 테이블의 INPUT 사슬에 설정한 2번째 정책에 연관된 로그를 기록하도록 설정한다.
더보기

1) $ iptables -R INPUT 2 -s 192.168.20.5 -j DROP

2) $ iptables -D INPUT 5

3) $ iptables -I INPUT 2 -j LOG