Linux의 iptables 명령어

CentOS 7부터 기본 방화벽은 firewalld로 변경되었지만, iptables도 여전히 지원됩니다. 단, iptables 서비스를 사용하려면 별도로 설치해야 합니다.

iptables은 netfilter/iptables의 약자로, IP 패킷 필터링 시스템입니다. netfilter는 커널 공간이라고 불리며, 이는 커널의 일부로 정보 패킷을 처리하는 규칙 세트를 포함합니다. iptables은 사용자 공간 도구로, 이러한 규칙을 쉽게 관리할 수 있게 해줍니다.

  1. iptables의 네 가지 테이블과 다섯 개의 체인

네 가지 테이블: raw, mangle, nat, filter; 다섯 개의 체인: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING

  1. 네 가지 테이블 설명
  • raw: 예외 처리에 사용되며, PREROUTING 및 OUTPUT 체인에서 사용됩니다.
  • mangle: 데이터 패킷 내용 수정 및 트래픽 조정에 사용됩니다.
  • nat: 네트워크 주소 변환(NAT)에 사용되며, PREROUTING, POSTROUTING, OUTPUT 체인에서 사용됩니다.
  • filter: 패킷 필터링에 사용되며, INPUT, OUTPUT, FORWARD 체인에서 사용됩니다.

테이블 간 우선 순위: raw > mangle > nat > filter

  1. 다섯 개의 체인 설명
  • INPUT: 목적지가 본 컴퓨터인 패킷을 매칭합니다.
  • OUTPUT: 출력되는 패킷을 매칭합니다.
  • FORWARD: 본 컴퓨터를 통해 전달되는 패킷을 매칭합니다.
  • PREROUTING: 목적지를 수정하는데 사용됩니다.
  • POSTROUTING: 소스 주소를 수정하는데 사용됩니다.

체인 간 매칭 순서: 입계 데이터 PREROUTING → INPUT; 출계 데이터 OUTPUT → POSTROUTING; 전달 데이터 PREROUTING → FORWARD → POSTROUTING.

체인 내 규칙 매칭 순서: 상단에서 하단으로 차례대로 매칭하며, 일치하는 규칙이 있을 때까지 계속됩니다.

  1. iptables 문법
iptables [-t 테이블명] [작업명령] [체인명] [규칙번호] [매칭조건] [-j 동작]

주의: 테이블명을 지정하지 않으면 기본적으로 filter 테이블이 사용됩니다.

-A <체인명> [규칙내용] 체인 마지막에 규칙 추가
-D <체인명> [규칙번호|규칙내용] 특정 규칙 삭제
-F <체인명> 특정 체인의 모든 규칙 삭제 (기본 규칙 제외)
-I <체인명> [규칙번호] [규칙내용] 특정 번호에 규칙 삽입 (기본값 1)
-R <체인명> [규칙번호] [규칙내용] 특정 번호의 규칙 수정
-P <체인명> [동작] 체인의 기본 동작 설정
-L <체인명> 특정 체인의 모든 규칙 나열
-S <체인명> 규칙을 명령 형태로 표시
  1. 일반적인 매칭 조건
-p <프로토콜> 프로토콜 유형 매칭 (tcp, udp 등)
-s <주소>[/마스크] 원본 주소 매칭
-d <주소>[/마스크] 목적지 주소 매칭
-i <네트워크 인터페이스> 입력 인터페이스 매칭
-o <네트워크 인터페이스> 출력 인터페이스 매칭
--sport <포트> 원본 포트 매칭
--dport <포트> 목적지 포트 매칭
  1. 일반적인 동작
-j ACCEPT 패킷 통과 허용
-j DROP 패킷 차단
-j REJECT 패킷 거부 (응답 메시지 반환)
-j SNAT --to IP[-IP][:PORT[-PORT]] 소스 주소 변환
-j DNAT --to IP[-IP][:PORT[-PORT]] 목적지 주소 변환
-j MASQUERADE 동적 소스 주소 변환
  1. 부가 사항
-m state --state <상태> 패킷 상태 매칭 (NEW, ESTABLISHED, RELATED, INVALID)
-m mac --mac-source <MAC> 원본 MAC 주소 매칭
-m limit --limit <속도> [--burst 버퍼수] 일정 속도로 패킷 매칭
-m multiport <--sports|--dports|--ports> <포트1>[,포트2,포트3...] 여러 포트 한 번에 매칭
  1. 실습 예제
  1. 특정 테이블의 자세한 규칙 보기
[root@server ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  531 39448 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    2   104 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    1   229 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 39 packets, 6995 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  1. 특정 테이블의 특정 체인에 규칙 추가
[root@server ~]# iptables -t filter -A INPUT -j DROP
[root@server ~]# iptables -t filter -nvL --line 
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination 
1 653 48060 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 
4 2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
  1. 특정 체인의 특정 위치에 규칙 삽입
[root@server ~]# iptables -t filter -I INPUT 6 -j REJECT
[root@server ~]# iptables -t filter -nvL --line          
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      779 59067 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        4   208 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
5        2   458 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
6        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
7        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  1. 특정 체인의 특정 위치의 규칙 삭제
[root@server ~]# iptables -t filter -D INPUT 6
[root@server ~]# iptables -t filter -nvL --line   
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      877 65731 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        4   208 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
5        2   458 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
6        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  1. 특정 체인의 특정 위치의 규칙 대체
[root@server ~]# iptables -t filter -R INPUT 6 -j REJECT 
[root@server ~]# iptables -t filter -nvL --line          
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      938 69875 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        4   208 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
5        3   687 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
6        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
  1. 특정 체인의 기본 동작 수정
[root@server ~]# iptables -t filter -P INPUT DROP    
[root@server ~]# iptables -t filter -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1106 82675 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    5   260 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    4   916 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
  1. 특정 테이블의 모든 규칙 삭제
[root@server ~]# iptables -t filter -P INPUT ACCEPT
[root@server ~]# iptables -t filter -F
[root@server ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 12 packets, 792 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 7 packets, 676 bytes)
 pkts bytes target     prot opt in     out     source               destination 
  1. SNAT 동작 사용하여 내부 호스트 외부 접속 가능

환경: server 외부 IP 192.168.5.101, 내부 IP 192.168.6.1; client 내부 IP 192.168.6.2

[root@server ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@server ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@server ~]# iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -j SNAT --to 192.168.5.101
  1. DNAT 동작 사용하여 내부 포트 외부 맵핑

환경: server 외부 IP 192.168.5.101, 내부 IP 192.168.6.1; client 내부 IP 192.168.6.2; 물리 머신 IP 192.168.5.2

[root@server ~]# iptables -t nat -A PREROUTING -d 192.168.5.101 -p tcp --dport 23 -j DNAT --to 192.168.6.2:22

태그: linux iptables firewall Networking

6월 19일 22:24에 게시됨