
iptables 사용하기
- iptables를 이용하여 정책을 설정할 때 가장 중요한 것은 실질적 룰(Rule)에 해당하는 매치(Match)와 타깃(Target)
- 매치는 iptables가 규칙 타깃에 의해 명시되는 동작에 따라 패킷을 처리하기 위해서 만족해야 하는 조건
- 타깃은 iptables에서 패킷이 규칙과 일치할 때 취하는 동작
- TCP 패킷에만 적용하려면 -p(--protocol) 매치를 사용해서 적용, -p 옵션으로 프로토콜을 명시하지 않으면 모든 프로토콜(tcp, udp, icmp)에 해당 정책에 적용됨
💡 firewalld 중단하기
RHEL 7버전부터는 iptables 기반의 동적 관리 방화벽인 firewalld가 기본적으로 운영되고 있음. 따라서 ‘iptables -L’ 명령을 실행하면 기본 사슬(chain) 이외에 firewalld가 생성한 많은 사슬이 존재하는 것을 확인 가능
iptables 명령을 직접 사용하면 다음 명령을 실행해서 firewalld의 동작을 중지시킴
# systemctl stop firewalld
firewalld의 동작을 재부팅 후에도 중지시키려면 다음의 명령을 추가로 실행
# systemctl disable firewalld
iptables [-t table] action chain match [-j target]
- 테이블의 기본 설정은 Filter이고, 다른 테이블 지정할 때는 -t 옵션을 사용
- 액션은 사슬 지정, 설정, 제어할 때 사용. 주로 -N, -A와 같은 대문자 옵션을 사용
- 사슬을 설정하고 하는 사슬을 명기하면 되는데 INPUT, OUTPUT과 같이 입력. 대소문자 구분
- 실질적인 룰에 해당하는 매치와 타깃을 지정하면 됨
- 매치는 -d, -p와 같은 소문자 옵션을 사용해서 설정
- 타깃은 -j(--jump)옵션을 사용하여 설정
[주요 액션]
| Action | 설명 |
| -N --newchain |
새로운 사용자 정의 사슬을 만듦 |
| -X --delete-chain |
비어있는 사슬을 제거 기본 사슬은 제거할 수 없음 |
| -P --policy |
사슬의 기본 정책을 설정 |
| -L --list |
현재 사슬의 규칙을 나열 |
| -S --list-rules |
현재 사슬의 규칙을 적용한 명령 형태로 출력 iptables-save 명령으로 저장되는 형태로 출력 |
| -F --flush |
사슬로부터 규칙을 제거 |
| -Z --zero |
사슬내의 모든 규칙들의 패킷과 바이트의 카운트를 0으로 만듦 |
| -A --append |
사슬에 새로운 규칙을 추가 해당 사슬에 맨 마지막 규칙으로 등록 |
| -I --insert |
사슬에 규칙을 맨 첫 부분에 삽입 룰 넘버를 사용하여 특정 부분에 삽입할 수 있음 |
| -R --replace |
사슬의 규칙을 교환 |
| -D --delete |
사슬의 규칙을 제거 |
[주요 매치]
| Match | 설명 |
| -s --source, --src |
출발지 IP 주소나 네트워크와 매칭 도메인, IP 주소, 넷마스크값을 이용하여 표기 |
| -d --destination, --dst |
목적지 IP 주소나 네트워크와 매칭 도메인, IP 주소, 넷마스크값을 이용하여 표기 |
| -p --protocol |
특정 프로토콜과 매칭 TCP, UDP, ICMP와 같은 이름을 사용하고 대소문자는 구분하지 않음 이 옵션을 사용하지 않으면 모든 프로토콜이 대상이됨 |
| -i --in-interface |
입력 인터페이스와 매칭 |
| -o --out-interface |
출력 인터페이스와 매칭 |
| ! | 아닌(NOT)의 의미로 사용하는데, 특정 매칭을 제외할 때 사용 |
| -m --match |
좀 더 세밀하게 제어할 때 사용하는 매칭 옵션 |
| --state | 연결 상태와 매칭 INVALID, ESTABLISHED, NEW, RELATED를 사용 |
| --string | 특정한 패턴과 매칭 |
[기타 옵션]
| 옵션 | 설명 |
| -n --numeric |
다른 옵션과 같이 사용되며 출력 정보를 숫자값으로 표현 |
| -v --verbose |
다른 옵션과 같이 사용되며 패킷, 바이트 수 등을 추가하여 정보를 자세히 출력 |
| --line-number | 정책 앞에 번호를 붙여 출력하며 삭제나 삽입할 때 유용 |
[주요 타깃 (-j, --jump)]
| Target | 설명 |
| ACCEPT | 패킷을 허가하는 것으로 본래 라우팅대로 진행 |
| DROP | 패킷을 거부하는 것으로 더이상 어떤 처리도 수행되지 않고 버림 |
| LOG | 패킷을 syslog에 전달하여 기록 일반적으로 /var/log/messages에 저장 |
| REJECT | 패킷을 버리고 동시에 적당한 응답 패킷을 전달 TCP인 경우 TCP 재설정(Reset) 패킷, UDP인 경우 ICMP 포트 도달 불가(Port Unreachable)메시지 전송 |
| RETURN | 호출 사슬 내에서 패킷 처리를 계속 진행 |
[사용 예]
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책 정보를 출력
iptables -L
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책 정보(포트, 프로토콜 등)를 숫자값으로 출력
iptables -nL
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책 정보를 패킷, 바이트 등을 추가하여 자세히 출력
iptables -vL
- 기본 테이블인 Filter의 INPUT 사슬에 설정된 정책 정보를 출력
iptables -L INPUT
- NAT 테이블의 모든 사슬에 설정된 정책 정보를 출력
iptables -t NAT -L
- 기본 테이블인 Filter의 모든 사슬에 설정된 정책을 모두 제거
iptables -F
- 기본 테이블인 Filter의 INPUT 사슬에 설정된 정책을 모두 제거
iptables -F INPUT
- INPUT 사슬에 발신지가 192.168.12.22이고 도착지가 localhost인 패킷을 거부(DROP) 시키는 정책을 추가
iptables -A INPUT -s 192.168.12.22 -d localhost -j DROP
- INPUT 사슬에 발신지가 192.168.1.0 네트워크 대역에 속한 호스트들을 허가하는 정책을 추가
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
- INPUT 사슬에 발신지가 192.168.5.13으로부터 들어오는 ICMP 패킷을 거부
iptables -A INPUT -s 192.168.5.13 -p ICMP -j DROP
- INPUT 사슬에 발신지가 192.168.5.13으로부터 패킷 중에 ICMP 프로토콜을 제외한 모든 프로토콜을 거부
iptables -A INPUT -s 192.168.5.13 ! -p ICMP -j DROP
- INPUT 사슬에 설정한 관련 정책을 삭제
iptables -D INPUT -s 192.168.5.13 -p ICMP -j DROP
- 기본 테이블인 Filter의 INPUT 사슬에 설정된 정책 정보의 앞 부분에 번호를 붙여서 출력
iptables -L INPUT --line-number
- INPUT 사슬에 설정한 두 번째 정책을 삭제
iptables -D INPUT 2
- www.posein.org의 웹 사이트에 접속을 차단
iptables -A OUTPUT -p tcp -d www.posein.org --dport 80 -o eth0 -j DROP
- 공인 IP 주소를 공유하여 SNAT를 설정했을 경우에 사설 IP 대역 사용자들의 www.posein.org의 웹 사이트에 접속을 차단
iptables -A FORWARD -p tcp -d www.posein.org --dport 80 -o eth0 -j DROP
'Linux' 카테고리의 다른 글
| [Linux] iptables를 이용한 NAT(Network Address Translation) 구현 (0) | 2026.04.20 |
|---|---|
| [Linux] iptables 설정 저장 반영 - iptables-save / iptables-restore (0) | 2026.04.14 |
| [Linux] DHCP(Dynamic Host Configuration Protocol) (0) | 2026.03.31 |
| [Linux] Squid Proxy (0) | 2026.03.16 |
| [Linux] DNS 서버 - zone 파일 (0) | 2026.03.09 |