iptables란?
넷필터 프로젝트에서 개발했으며 광범위한 프로토콜 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 강력한 메커니즘을 제공합니다.
서비스 등록과 시작
CentOS 6.4 Minimal에는 iptables가 설치되어 있습니다. ip6tables도 설치되어 있는데 이는 IPv6 체계에서 사용합니다.
★ 설치 확인 ★
# rpm -qa | grep iptables
iptables-1.4.7-9.el6.x86_64
iptables-ipv6-1.4.7-9.el6.x86_64
★ 설치되어 있지 않으면 ★
# yum -y install iptables
iptables 용어
1) 테이블(tables)
iptables에는 테이블이라는 광범위한 범주가 있는데 filter, nat, mangle, raw 4개의 테이블로 구성되며,
이 중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블입니다.
2) 체인(chain)
iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 입니다.
이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행합니다.
들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정합니다.
- INPUT : 호스트 컴퓨터를 향한 모든 패킷
- OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
- FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷
3) 매치(match)
iptables에서 패킷을 처리할 때 만족해야 하는 조건을 말합니다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용합니다.
- --source (-s) : 출발지 IP주소나 네트워크와의 매칭
- --destination (-d) : 목적지 IP주소나 네트워크와의 매칭
- --protocol (-p) : 특정 프로토콜과의 매칭
- --in-interface (i) : 입력 인터페이스
- --out-interface (-o) : 출력 인터페이스
- --state : 연결 상태와의 매칭
- --string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
- --comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
- --syn (-y) : SYN 패킷을 허용하지 않는다.
- --fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
- --table (-t) : 처리될 테이블
- --jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
- --match (-m) : 특정 모듈과의 매치
4) 타겟(target)
iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원합니다.
- ACCEPT : 패킷을 받아들인다.
- DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
- LOG : 패킷을 syslog에 기록한다.
- RETURN : 호출 체인 내에서 패킷 처리를 계속한다.
REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 "connection refused"라는 오류 메시지를 보여주지만
DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 버립니다.
5) 연결 추적(Connection Tracking)
iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해 줍니다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있습니다.
- NEW : 새로운 연결을 요청하는 패킷 ex) HTTP 요청
- ESTABLISHED : 기존 연결의 일부인 패킷
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷
- INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷
상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능합니다.
UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용 가능합니다.
6) 명령어(commond)
- -A (--append) : 새로운 규칙을 추가한다.
- -D (--delete) : 규칙을 삭제한다.
- -C (--check) : 패킷을 테스트한다.
- -R (--replace) : 새로운 규칙으로 교체한다.
- -I (--insert) : 새로운 규칙을 삽입한다.
- -L (--list) : 규칙을 출력한다.
- -F (--flush) : chain으로부터 규칙을 모두 삭제한다.
- -Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
- -N (--new) : 새로운 chain을 만든다.
- -X (--delete-chain) : chain을 삭제한다.
- -P (--policy) : 기본정책을 변경한다.
7) 기본 동작
패킷에 대한 규칙은 위에서부터 차례로 검사하고, 그 규칙과 일치하는 패킷에 대하여 지정한 ACCEPT, DROP 등을 수행합니다.
규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙에 따라 처리하고 체인에 있는 추가 규칙을 무시합니다.
패킷이 체인의 모든 규칙과 매치되지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행됩니다.
기본 정책 (최상단 정책) 은 policy ACCEPT , policy DROP 으로 설정할 수 있습니다.
일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 허용해 줄 포트와 IP주소등에 대해 ACCEPT를 수행하게 만듭니다.
8) iptables 출력
명령어 n의 경우 L과 같이 사용 가능한데, numeric output of addresses and ports 으로 주소/포트를 숫자로 출력해줍니다.
# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables 설정
아래는 CentOS 6.4 Minimal의 기본적인 iptables의 설정내용입니다.
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
기본 정책은 모든 패킷에 대해 ACCEPT이며, SSH 서비스는 기본적으로 허용되어 있습니다.
※ 기본 정책을 DROP으로 설정할 경우 SSH로 접속해 사용중이라면 그 순간 서버과 연결이 끊어집니다.
기본 설정
기본 정책을 ACCEPT로 설정
# iptables -P INPUT ACCEPT
체인에 정의된 모든 규칙 삭제
# iptables -F
모든 규칙이 삭제 된 것 확인
# 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
INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용 추가
# iptables -A INPUT -i lo -j ACCEPT
일반적으로 많은 소프트웨어들이 localhost 어댑터와 통신이 되어야 하기에 필요하다.
INPUT 체인에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
INPUT 체인에 프로톨콜이 tcp이며 목적지포트가 22번인 패킷에 대해 허용 추가 (SSH 허용)
# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
INPUT 체인에 대한 기본 정책을 버림(DROP)으로 변경 (위의 정책 제외하고 모든 패킷 DROP)
# iptables -P INPUT DROP
FORWARD 체인에 대한 기본정책을 버림으로 변경 (서버가 라우팅 할 일이 없어서 DROP)
# iptables -P FORWARD DROP
OUTPUT 체인에 대한 기본정책을 허용으로 변경 (외부로 나가는 통신은 모두 허용)
# iptables -P OUTPUT ACCEPT
설정 확인
# iptables -L -v
Chain INPUT (policy DROP 108 packets, 12199 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
273 25012 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 9 packets, 1612 bytes)
pkts bytes target prot opt in out source destination
설정 저장
# service iptables save
※ iptables 규칙을 만들 때는 순서가 매우 중요합니다.
예를 들어 로컬 192.168.100.0/24 에서 들어오는 모든 패킷을 DROP 하도록 지정한 후 192.168.100.13에서 들어오는 패킷을 모두 ACCEPT 하면 뒤에 추가된 ACCEPT 규칙은 무시됩니다.
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 192.168.100.0/24 0.0.0.0/0
ACCEPT tcp -- 192.168.100.13/32 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain L (0 references)
target prot opt source destination
규칙을 순서대로 확인하기 때문에 DROP 되면서 규칙에 걸렸으니 아래 규칙은 무시합니다.
추가 설정
네임서버 DNS 규칙 추가 (DNS는 TCP UDP 둘 다 열어줘야함)
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
웹 서버 HTTP/HTTPS 규칙 추가
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-- 한번에 등록 시 ( -m multiport --dports )
# iptables -A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT
Mysql / MariaDB 규칙 추가
# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
FTP (passive mode) 규칙 추가
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A OUTPUT -p tcp –-sport 21 -j ACCEPT
-- 21 포트로 서버와 연결 후 1024 이상 포트는 파일 전송 시 사용
# iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT
메일서버 SMTP 규칙 추가
# iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-- Secure SMTP 465
# iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
메일서버 POP3 규칙 추가
# iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-- Secure POP3 995
# iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
메일서버 IMAP 규칙 추가
# iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-- Secure IMAP 993
# iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
ICMP Ping 허용
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
NTP 시간동기화
# iptables -A INPUT -p udp --dport 123 -j ACCEPT
NULL 패킷 차단 (보안 취약점 조치)
- NULL 패킷은 정찰 패킷으로 서버설정이 약한 곳을 찾을 때 사용됩니다.
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
syn-flood attack 차단
- syn-flood attack은 3way handshake의 약점을 이용해 서버의 모든 포트를 사용하는 DDos공격의 일종입니다.
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-- /etc/sysctl.conf 에 하기 내용도 함께 추가
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.netfilter.ip_conntrack_max = 1048576
X-MAS 패킷 차단
- TCP 통신 시 모든 플래그 값을 설정하여 패킷을 전송하는 정찰 패킷입니다.
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
기타 사용법
iptables 수정법
- /etc/sysconfig/iptables 파일을 수정 또는 iptables 명령어 이용 (파일이 없을 경우 yum으로 설치하면 생깁니다.)
실행 순번 확인
# iptables -nL --line-number
순번 3의 행을 아래와 같이 R(replace) - 수정
# iptables -R INPUT 3 -p tcp --dport 2222 -j ACCEPT
루프백 인터페이스에 대해 모든 패킷을 허용
# iptables -A INPUT -i lo -j ACCEPT
랜카드 지정에 대해 모든 패킷을 허용
# iptables -A INPUT -i eth0 -j ACCEPT
신뢰할 만한 ip에 대해 모든 패킷을 허용
# iptables -A INPUT -s 192.168.0.3 -j ACCEPT
신뢰할 만한 ip 대역에 대해 모든 패킷을 허용
# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
-- 서브넷마스크로도 설정 가능
# iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
신뢰할 만한 ip와 MAC주소에 대해 모든 패킷을 허용
# iptables -A INPUT -s 192.168.0.3 -m mac --mac-source 00:50:80:FD:E6:32 -j ACCEPT
포트 범위지정 ( 콜론 : 으로 범위지정)
# iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT
자동화 스크립트 (iptables-script)
#!/bin/bash
# iptables 설정 자동화 스크립트
# 입맛에 따라 수정해서 사용합시다.
iptables -F
# TCP 포트 22번을 SSH 접속을 위해 허용
# 원격 접속을 위해 먼저 설정합니다
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 기본 정책을 설정합니다
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# localhost 접속 허용
iptables -A INPUT -i lo -j ACCEPT
# established and related 접속을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Apache 포트 80 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 설정을 저장
/sbin/service iptables save
# 설정한 내용을 출력
iptables -L -v
iptables-scirpt를 저장하고 실행 권한주고 실행하면 규칙이 적용됩니다.
# chmod +x iptables-script
-- 권한 부여 후 실행
# ./iptables-script
출처: http://webdir.tistory.com/170 [WEBDIR]
'OS > Linux' 카테고리의 다른 글
Linux - 스왑 메모리(SWAP Memory) 란? (0) | 2024.05.03 |
---|---|
Linux - CentOS 부팅 모드 변경 방법 (GUI / CLI) (2) | 2023.12.01 |
Linux - fstab(파일시스템테이블) 이란? (6) | 2023.10.18 |
Linux - Too many open files 오류 해결 방법 (2) | 2023.07.13 |
Linux - SSH 포트 변경하기 (외부 접근 보안 강화하기) (0) | 2023.06.23 |