CentOS 7부터 기본 방화벽은 firewalld로 변경되었지만, iptables도 여전히 지원됩니다. 단, iptables 서비스를 사용하려면 별도로 설치해야 합니다.
iptables은 netfilter/iptables의 약자로, IP 패킷 필터링 시스템입니다. netfilter는 커널 공간이라고 불리며, 이는 커널의 일부로 정보 패킷을 처리하는 규칙 세트를 포함합니다. iptables은 사용자 공간 도구로, 이러한 규칙을 쉽게 관리할 수 있게 해줍니다.
- iptables의 네 가지 테이블과 다섯 개의 체인
네 가지 테이블: raw, mangle, nat, filter; 다섯 개의 체인: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING
- 네 가지 테이블 설명
- raw: 예외 처리에 사용되며, PREROUTING 및 OUTPUT 체인에서 사용됩니다.
- mangle: 데이터 패킷 내용 수정 및 트래픽 조정에 사용됩니다.
- nat: 네트워크 주소 변환(NAT)에 사용되며, PREROUTING, POSTROUTING, OUTPUT 체인에서 사용됩니다.
- filter: 패킷 필터링에 사용되며, INPUT, OUTPUT, FORWARD 체인에서 사용됩니다.
테이블 간 우선 순위: raw > mangle > nat > filter
- 다섯 개의 체인 설명
- INPUT: 목적지가 본 컴퓨터인 패킷을 매칭합니다.
- OUTPUT: 출력되는 패킷을 매칭합니다.
- FORWARD: 본 컴퓨터를 통해 전달되는 패킷을 매칭합니다.
- PREROUTING: 목적지를 수정하는데 사용됩니다.
- POSTROUTING: 소스 주소를 수정하는데 사용됩니다.
체인 간 매칭 순서: 입계 데이터 PREROUTING → INPUT; 출계 데이터 OUTPUT → POSTROUTING; 전달 데이터 PREROUTING → FORWARD → POSTROUTING.
체인 내 규칙 매칭 순서: 상단에서 하단으로 차례대로 매칭하며, 일치하는 규칙이 있을 때까지 계속됩니다.
- iptables 문법
iptables [-t 테이블명] [작업명령] [체인명] [규칙번호] [매칭조건] [-j 동작]
주의: 테이블명을 지정하지 않으면 기본적으로 filter 테이블이 사용됩니다.
-A <체인명> [규칙내용] 체인 마지막에 규칙 추가
-D <체인명> [규칙번호|규칙내용] 특정 규칙 삭제
-F <체인명> 특정 체인의 모든 규칙 삭제 (기본 규칙 제외)
-I <체인명> [규칙번호] [규칙내용] 특정 번호에 규칙 삽입 (기본값 1)
-R <체인명> [규칙번호] [규칙내용] 특정 번호의 규칙 수정
-P <체인명> [동작] 체인의 기본 동작 설정
-L <체인명> 특정 체인의 모든 규칙 나열
-S <체인명> 규칙을 명령 형태로 표시
- 일반적인 매칭 조건
-p <프로토콜> 프로토콜 유형 매칭 (tcp, udp 등)
-s <주소>[/마스크] 원본 주소 매칭
-d <주소>[/마스크] 목적지 주소 매칭
-i <네트워크 인터페이스> 입력 인터페이스 매칭
-o <네트워크 인터페이스> 출력 인터페이스 매칭
--sport <포트> 원본 포트 매칭
--dport <포트> 목적지 포트 매칭
- 일반적인 동작
-j ACCEPT 패킷 통과 허용
-j DROP 패킷 차단
-j REJECT 패킷 거부 (응답 메시지 반환)
-j SNAT --to IP[-IP][:PORT[-PORT]] 소스 주소 변환
-j DNAT --to IP[-IP][:PORT[-PORT]] 목적지 주소 변환
-j MASQUERADE 동적 소스 주소 변환
- 부가 사항
-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...] 여러 포트 한 번에 매칭
- 실습 예제
- 특정 테이블의 자세한 규칙 보기
[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
- 특정 테이블의 특정 체인에 규칙 추가
[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
- 특정 체인의 특정 위치에 규칙 삽입
[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
- 특정 체인의 특정 위치의 규칙 삭제
[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
- 특정 체인의 특정 위치의 규칙 대체
[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
- 특정 체인의 기본 동작 수정
[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
- 특정 테이블의 모든 규칙 삭제
[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
- 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
- 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