iptables는 리눅스상에서 방화벽을 설정하는 도구로서 네트워크 패킷을 필터링하거나 변경하는 등의 기능을 수행합니다.
특정 조건을 가지고 있는 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있으며, 특정 조건등을 통해 다양한 방식의 패킷 필터링과 처리 방식을 지원합니다.
네트워킹에서 패킷이란 기다란 메시지를 여러개로 쪼갠 작은 한 조각을 말합니다. 인터넷과 같은 컴퓨터 네트워크를 통해 전송되는 데이터는 작은 단위의 패킷으로 나뉘어 전송하고 이를 수신하는 기기에서 재조합 하는 과정을 거칩니다.
iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw, security 같은 5개의 테이블로 구성 됩니다.
방화벽의 가장 기본적인 테이블로서 특정 룰에 따라 패킷을 차단 하거나 허용하는 역할을 함
filter 테이블에는 기본적으로 3개의 chain이 있으며 사용 할 수 있음
INPUT chain
OUTPUT chain
FORWARD chain
방화벽으로 향하는 패킷을 방화벽이 보호하는 내부 네트워크의 다른 주소로 포워딩
방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈 때 다른 ip주소로 변환하는 역할을 함
INPUT chain (SNAT)
POSTROUTING chain (SNAT)
OUTPUT chain (DNAT)
PREROUTING chain (DNAT)
Linux 커널에서 처리되는 패킷의 값을 변경하는데 사용
패킷의 TTL이나 TOS(type of service: 패킷전송의 우선 순위) 값을 변경하거나 매칭 할 때 사용
PREROUTING chain
POSTROUTING chain
INPUT chain
OUTPUT chain
FORWARD chain
Conection Tracking(연결 추적) 기능을 좀 더 자세히 다룰 때 사용
PREROUTING chain
OUTPUT chain
SELinux 내부적으로 패킷에 security context 를 마킹하는 역할을 함
Mandatory Access Control (MAC): security 테이블을 사용하여 시스템 전체에 대한 강력한 MAC 정책을 구현함.
SELinux: security 테이블을 사용하여 SELinux 정책을 구현하고 적용을 함.
AppArmor: security 테이블을 사용하여 AppArmor 프로필을 구성하고 적용을 함.
INPUT chain
OUTPUT chain
FORWARD chain
수행할 특정 작업을 지정합니다.
아래에서 달리 지정하지 않는 한 명령 줄에서 이 중 하나만 지정할 수 있습니다.
-A (--append) : 새로운 규칙을 추가.
-D (--delete) : 규칙을 삭제.
-C (--check) : 패킷을 테스트.
-R (--replace) : 새로운 규칙으로 교체.
-I (--insert) : 새로운 규칙을 삽입.
-L (--list) : 규칙을 출력.
-F (--flush) : chain으로부터 규칙을 모두 삭제.
-Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬.
-N (--new) : 새로운 chain을 만듬.
-t 명령어를 사용하여 체인을 만들 테이블을 지정 해야 함
-X (--delete-chain) : chain을 삭제.
기본 체인 삭제 불가, 사용자 정의 체인만 삭제 가능 하며 삭제할 체인이 비어 있어야 가능
-P (--policy) : 기본정책을 변경.
-A 와 -I 의 차이점
추가 옵션이 두개 인 이유는 룰을 적용 받는 순서가 위 에서 부터 아래로 흐르는 방식이라서 허용 차단 순으로 사용을 해야 하기 때문입니다.
만약 차단 허용 순으로 룰이 만들어진다면 허용 룰은 차단 룰셋에서 버려지므로 적용 받지 못하게 됩니다.
따라서 add 를 한다면 기존의 다른 룰에 의해서 추가된 룰이 무시될 수도 있습니다. 그럴 땐 -A 대신 -I 를 사용하여 제일 상단에 추가되게 할 수 있습니다.
즉, -A 는 규칙 마지막 줄에 추가 가 되는 것 이고 -I 는 순서 넘버를 따로 받아 원하는 위치에 추가 할 수 있습니다.
체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행합니다.
외부에서 방화벽 자체로 향하는 패킷에 대한 필터링을 담당함
내부에서 방화벽 자체로 향하는 패킷에 대한 필터링을 담당함
방화벽을 통과하여 방화벽이 보호하는 다른 서버 등으로 향하는 경우
내부의 다른 서버에서 방화벽을 통해 외부로 나가는 패킷에 대한 필터링을 하는 경우
SourceNAT(SNAT) 타켓과 매칭되어 내부 네트워크에서 방화벽을 통해 외부로 나갈때 사용
POSTROUTING 은 사무실 등에서 사설 ip를 사용하면서 하나의 공인ip 로 인터넷을 공유 하고자 할때 즉, 공유기의 용도로 사용 할 수 있음
DestinationNAT(DNAT) 타켓과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 패킷을 방화벽이 보호 하는 내부 서버로 포워딩 할 때 사용
사용자는 위의 5개의 체인 외에도 필요한 경우에 직접 체인을 생성할 수 있습니다. 이러한 사용자 정의 체인은 다른 체인과 마찬가지로 패킷의 송수신을 모니터링하고 필터링 할 수 있습니다. 예를 들어, 특정 서비스를 위한 규칙을 별도의 체인으로 만들어 관리하는 것이 가능합니다. 사용자 정의 체인을 생성하려면 -N 옵션을 사용합니다.
iptables에서 패킷을 처리 할 때 만족해야 하는 조건을 가리킵니다. 즉, 이 조건을 만족 시키는 패킷들만 규칙을 적용합니다.
--source (-s) : 출발지 IP주소나 네트워크와의 매칭
--destination (-d) : 목적지 ip주소나 네트워크와의 매칭
--protocol (-p) : 특정 프로토콜과의 매칭
--in-interface (i) : 입력 인테페이스
--out-interface (-o) : 출력 인터페이스
--state : 연결 상태와의 매칭
--comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
--syn (-y) : SYN 패킷을 허용하지 않는다.
SYN란 TCP(Transmission Control Protocol) 통신에서 세션을 초기화할 때 사용하는 패킷입니다.
--table (-t) : 처리될 테이블
--jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
iptables는 -m, --match 을 사용하여 확장 패킷 일치 모듈을 사용할 수 있습니다.
규칙에 주석(최대 256자)을 추가할 수 있습니다.
--comment
주석에 "A privatized IP block" 란 정보를 넣음
iptables -A INPUT -s 192.168.0.0/16 -m comment --comment "A privatized IP block"
--state
패킷의 상태를 확인할 수 있습니다. 예를 들어, NEW, ESTABLISHED, RELATED 상태를 확인할 수 있습니다.
새로운 연결을 허용하고, 이미 연결된 상태의 패킷은 허용하는 규칙
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
--mac-source
패킷의 MAC 주소를 확인할 수 있습니다. 예를 들어, 특정 MAC 주소를 가진 패킷을 차단할 수 있습니다.
MAC 주소가 00:11:22:33:44:55인 패킷을 거부하는 규칙
iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP
TCP 패킷의 특정 속성을 확인할 수 있습니다. 예를 들어, 특정 포트를 사용하는 TCP 패킷을 차단할 수 있습니다.
TCP 포트 80을 사용하는 패킷을 거부하는 규칙
iptables -A INPUT -p tcp -m tcp --dport 80 -j DROP
ICMP 패킷의 특정 속성을 확인할 수 있습니다. 예를 들어, 특정 ICMP 유형을 사용하는 패킷을 차단할 수 있습니다.
ICMP 유형 8(Ping 요청)을 사용하는 패킷을 거부하는 규칙
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
패킷이 규칙과 일치할 때 취하는 동작을 지정합니다.
ACCEPT: 패킷을 수신자로 전달합니다.
DROP: 패킷을 버립니다. 전송된 패킷에 대한 응답은 없습니다.
REJECT: 패킷을 거부합니다. 전송된 패킷에 대한 ICMP "port unreachable"와 같은 응답이 전송됩니다.
LOG: 패킷을 로그합니다. 로깅된 패킷은 시스템 로그에 기록됩니다.
SNAT: 출발지 IP 주소를 변경합니다.
DNAT: 목적지 IP 주소를 변경합니다.
REDIRECT: 로컬 네트워크에서의 패킷을 다른 포트로 리디렉션 수행합니다.
MASQUERADE: 출발지 IP 주소를 변경 합니다.
사용자 정의 TARGET : 사용자 정의로 만들어진 TARGET을 사용 할 수 있습니다.
사용자 정의 체인을 만들 때 와 다르게 간접적으로 생성하여 사용 가능
iptables -N NEWDROP 새로운 사용자 정의 체인 생성
iptables -A NEWDROP -j DROP 체인에 대한 규칙 생성
iptables -I INPUT 1 -s 10.1.0.169 -j NEWDROP 생성된 체인을 타겟으로 호출 하여 사용
타겟에 대한 확장 옵션 입니다.
--to-source
--to-source는 iptables에서 NAT 작업 중 SNAT(Source NAT)을 수행할 때 사용되는 옵션입니다.
이 옵션은 패킷의 출발지 IP 주소를 변경하는 데 사용됩니다.
Example usage:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
--to-destination
--to-destination은 iptables에서 NAT 작업 중 DNAT(Destination NAT)을 수행할 때 사용되는 옵션입니다.
이 옵션은 패킷의 목적지 IP 주소를 변경하는 데 사용됩니다.
또한, --to-destination 옵션은 DNAT 외에도 REDIRECT 작업에도 사용됩니다.
이 경우, ipaddr 대신 --to-destination :port와 같이 입력하여 IP 주소 대신 포트 번호를 변경할 수 있습니다.
Example usage:
#iptables -t nat -A PREROUTING -i eth0 -d 203.0.113.10 -j DNAT --to-destination 192.168.1.10
--log-prefix
--log-prefix는 LOG 규칙에서 로그 파일에 추가할 접두어를 지정하는 데 사용됩니다. 예를 들어, --log-prefix "SSH Connection Attempt: "와 같이 사용하면 SSH 연결 시도에 대한 로그 파일의 각 줄 앞에 "SSH Connection Attempt: "가 추가됩니다.
Example usage:
#iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Connection Attempt: "
--to-ports
--to-ports 옵션을 사용하여 출발지 포트를 변경할 수 있습니다.
Example usage:
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE --to-ports 1024-65535
--to-ports
--to-ports 옵션을 사용하여 출발지 포트를 변경할 수 있습니다.
Example usage:
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
--reject-with
--reject-with 옵션을 사용하면 어떤 종류의 응답 패킷을 보낼지 지정할 수 있습니다.
icmp-net-unreachable: 목적지 네트워크가 도달할 수 없음을 나타내는 ICMP 패킷을 전송합니다.
icmp-host-unreachable: 목적지 호스트가 도달할 수 없음을 나타내는 ICMP 패킷을 전송합니다.
icmp-port-unreachable: 목적지 포트가 도달할 수 없음을 나타내는 ICMP 패킷을 전송합니다.
icmp-proto-unreachable: 목적지 프로토콜이 지원되지 않음을 나타내는 ICMP 패킷을 전송합니다.
icmp-admin-prohibited: 방화벽 규칙이 패킷 거부를 명시했음을 나타내는 ICMP 패킷을 전송합니다.
icmp-host-prohibited: 방화벽 규칙이 목적지 호스트 거부를 명시했음을 나타내는 ICMP 패킷을 전송합니다.
icmp-net-prohibited: 방화벽 규칙이 목적지 네트워크 거부를 명시했음을 나타내는 ICMP 패킷을 전송합니다.
tcp-reset: TCP 연결을 종료하는 RST 패킷을 전송합니다.
Example usage:
#iptables -A INPUT -s 192.168.1.1 -p tcp --dport 22 -j REJECT --reject-with tcp-reset
패킷 필터링(Packet filtering): 패킷 필터링은 Linux 운영 체제에서 모든 네트워크 트래픽을 검사하고, 시스템 보안에 영향을 미치는 모든 패킷을 필터링하여 차단할 수 있습니다. 이를 통해 불필요한 패킷을 제거하고 보안을 강화할 수 있습니다.
패킷 필터링은 filter 테이블 에서 이루어 지며 들어오거나(incoming) 나가는(outgoing) 패킷의 허용/거부 여부를 결정하는 방화벽의 역할을 수행합니다.
패킷 조작(Packet manipulation): 패킷 조작은 Linux 운영 체제에서 모든 네트워크 패킷을 검사하고, 특정한 패킷 헤더 정보를 변경하거나 패킷을 리디렉션하는 등의 조작을 할 수 있습니다. 이를 통해 특정한 네트워크 서비스를 제공하는 서버를 설정할 수 있습니다.
패킷 조작은 mangle 테이블에서 이루어 지며 주로 QoS(품질 서비스)나 네트워크 보안 등의 목적으로 사용됩니다.
패킷의 TOS(Type of Service)나 TTL(Time to Live) 등을 수정하거나,
IP 주소나 포트 번호를 변경하는 등의 작업이 이루어집니다.
리디렉션(Redirection)은 컴퓨터 네트워크에서 클라이언트가 요청한 웹 페이지나 파일 등의 리소스를 다른 위치로 보내는 기술입니다.
다른 말로는 리다이렉션(Redirection)이라고도 합니다
NAT(Network Address Translation): NAT는 사설 IP 주소와 공인 IP 주소 간의 트래픽을 변환하는 데 사용됩니다. Linux에서 NAT는 iptables를 사용하여 구현됩니다. 이를 통해 인터넷에 연결된 여러 대의 호스트가 하나의 공인 IP 주소를 사용할 수 있습니다.
로깅(Logging): iptables는 네트워크 트래픽을 로그로 기록하는 데 사용됩니다. 이를 통해 보안 관련 문제를 파악하고, 시스템의 문제점을 분석할 수 있습니다.
연결 추적(Connection tracking): iptables는 특정한 프로토콜에 대한 연결 추적을 지원합니다. 이를 통해 연결 상태 정보를 확인하고, 네트워크 보안을 더욱 강화할 수 있습니다.
패킷 카운팅(Packet counting): iptables는 각 룰에 대한 패킷 수를 추적할 수 있습니다. 이를 통해 시스템의 사용량을 파악하거나, 네트워크 성능을 모니터링할 수 있습니다.
10.1.0.169 에서 10.1.0.119 로 ping test 경우 응답이 잘 오는 것을 알 수 있습니다.
iptables -A INPUT -s 10.1.0.169 -j DROP
iptables FILTER TABLE (기본) 에 출발지(Source) IP 주소가 10.1.0.169인 패킷을 차단(DROP)하는 규칙을 추가(-A)하는 명령어입니다.
ping test 결과 응답이 없는 것을 확인 할 수 있습니다.
즉, ip 169 에서 ip 119 로 패킷을 보낼 때 169 에서 보내는 패킷의 헤더의 값을 규칙에 있는
-s 10.1.0.169 라는 출발지(Source) IP 주소 를 비교 하여 들어오는 모든 패킷을 차단 합니다.
iptables FILTER TABLE (기본) 에 출발지(Source) IP 주소가
10.1.0.169인 패킷을 차단(DROP)하는 규칙이 7번 째 위치에 존재 하고 5번째 위치에 통과(ACCEPT) 규칙을 설정 했을때
통과(ACCEPT) 규칙을 차단(DROP) 규칙 보다 앞에 설정을 하고 핑테스트를 했을때 응답이 잘 되는것을 알 수 있습니다.