✔️ iptables란 ?
- 커널의 IP 패킷 필터링 기능(Packet Filtering)을 하는 Netfilter에 규칙을 설정, 관리하는 도구
- 체인(Chain)이라고 불리는 방향성을 가진 규칙을 연결한 테이블이다.
- 광범위한 프로토콜 상태 추적, 패킷 어플리케이션 계층 검사, 속도 제한, 필터링 정책을 명시하기 위해 사용한다.
- 커널 상에서의 netfilter 패킷 필터링 기능을 사용자 공간에서 제어하는 수준으로 사용할 수 있다.
✔️ Packet Filtering (패킷 필터링)
네트워크를 통과하는 모든 패킷들은 패킷 헤더에 출발지와 목적지 그리고 어떤 프로토콜을 이용하는지에 대한 정보를 담고 있다.
이러한 패킷의 헤더 정보를 보고 위에서부터 차례로(규칙에 우선순위 존재) 각 규칙에 대해 호스트로 들어오는 INPUT 패킷, 나가는 OUPUT 패킷, 통과하는 FORWARD 패킷등을 검사해 불필요한 패킷이나 잘못된 패킷을 폐기(DROP)하고 규칙과 일치하는 패킷만 허용(ACCEPT)한다.
일치하는 규칙에 대해 처리하면 체인의 다른 규칙은 수행하지 않는다.
패킷이 체인의 모든 규칙과 매치하지 않아 최하위 규칙에 도달하면 정해진 기본 정책이 수행된다.
기본 정책은 policy ACCEPT, policy DROP 으로 설정할 수 있다.
일반적으로 기본 정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP 주소 등에 대해서만 ACCEPT를 수행하게 만든다.
패킷 필터링 설정 순서
체인의 기본 동작(허용할지 거부할지)을 설정
패킷을 검사할 규칙을 체인에 추가
✔️ iptables 용어
테이블(tables)
iptables에는 테이블이라는 광범위한 범주가 있는데 이 테이블은 filter, nat, mangle, raw 4개의 테이블로 구성되며 이 중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.
체인(chain)
iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD이다.
이 체인들은 어떤 네트워크 트래픽(IP 패킷)에 대해 정해진 규칙들을 수행한다.
들어오는 패킷들에 대해 ACCEPT, REJECT, DROP 등을 결정한다.
- INPUT : 호스트 컴퓨터를 향한 모든 패킷
- OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
- FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷
매치(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) : 특정 모듈과의 매치
타겟(target)
iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.
- ACCEPT : 패킷을 받아들인다.
- DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
- LOG : 패킷을 syslog에 기록한다.
- RETURN : 호출 체인 내에서 패킷 처리를 계속한다.
REJECT vs DROP
REJECT는 서비스에 접속하려는 사용자의 액세스를 '거부'하고 connection refused라는 오류 메세지를 보여주는 반면 DROP은 talnet 사용자에게 어떠한 경고 메세지도 보여주지 않은 채 패킷을 '드롭'한다.
사용자의 접근을 완전 방지하려면 REJCET를 사용하는 것이 좋다.
연결 추적(Connection Tracking)
iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.
- NEW : 새로운 연결을 요청하는 패킷, 예. HTTP 요청
- ESTABLISHED : 기존 연결의 일부인 패킷
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
- INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷
상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다.
UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.
명령어(commond)
명령 | 설명 |
-A (--append) | 새로운 규칙을 추가한다. |
-D (--delete) | 규칙을 삭제한다. |
-C (--check) | 패킷을 테스트한다. |
-R (--replace) | 새로운 규칙으로 교체한다. |
-I (--insert) | 새로운 규칙을 삽입한다. |
-L (--list) | 규칙을 출력한다. |
-F (--flush) | chain으로부터 규칙을 모두 삭제한다. |
-Z (--zero) | 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다. |
-N (--new) | 새로운 chain을 만든다. |
-n (--numeric source) | numeric source와 dst의 IP와 포트를 숫자로 출력 |
-X (--delete-chain) | chain을 삭제한다. |
-P (--policy) | 기본정책을 변경한다. |
설정
기본설명 | 기능 | 체인 | 출발지ip | 목적지ip | 프로토콜 | 포트 | 매칭 | 동작 |
iptables | -A(추가) | INPUT | -s | -d | -p | -dport | -j | ACCEPT |
-D(삭제) | OUTPUT | tcp | 0~65535 | DROP | ||||
-I(삽입) | FORWARD | udp,icmp | REJECT |
✔️ iptables 사용법
✔️ iptables 출력
iptables 기본 출력
[root@iptables ~]# iptables -L
iptables 룰셋 확인 (상세한 네트워크 정보까지 모두 출력)
[root@iptables ~]# iptables -nL
iptables 룰셋 및 적용 순서까지 확인
[root@iptables ~]# iptables -nL --line-numbers
적용된 룰셋을 통한 INPUT 패킷의 bytes 출력
[root@iptables ~]# iptables -L -v
✔️ iptables 설정
기본 설정
# iptables -P INPUT REJECT // INPUT 체인에 대한 기본 정책을 REJECT로 변경
# iptables -P INPUT ACCEPT // OUTPUT 체인에 대한 기본정책을 ACCEPT로 변경
# iptables -P FORWAD DROP // FORWAD 체인에 대한 기본정책을 DROP으로 변경
체인에 정의된 모든 규칙 삭제
# iptables -F
# iptables -F INPUT // INPUT 체인의 모든 규칙 삭제
# iptables -F OUTPUT // OUTPUT 체인의 모든 규칙 삭제
# iptables -F FORWAD // FORWAD 체인의 모든 규칙 삭제
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
외부에서 모든 목적지의 tcp/80 포트로의 접근을 허용
iptables -A INPUT -d 192.168.10.10 -p tcp –dport 22 -j DROP
외부 모든 출발지에서 내부 192.168.10.10 목적지 서버의 tcp/80 포트로의 접근을 차단
iptables -A INPUT -s 222.111.222.111 -d 192.168.10.10 -p tcp –dport 53 -j ACCEPT
222.111.222.111 출발지 에서 내부 192.168.10.10 목적지 서버의 tcp/53번 포트로의 접근을 허용
iptables -A OUTPUT -s 192.168.10.10 -d 222.222.222.222 -p tcp –dport 80 -j ACCEPT
내부IP 192.168.10.10에서 222.222.222.222 목적지 IP로 tcp/80번 포트로의 접근을 허용
규칙 삽입
일반적으로 방화벽의 규칙은 위에서 아래의 순서로 적용되기 때문에 순서가 매우 중요하며, 실제로 정책 추가 만큼 삽입도 자주 이용되는 생성 방식이다.
iptables -I INPUT 1 -s 111.111.111.111 -p tcp –dport 2000 -j ACCEPT
INPUT 체인의 1번째 위치에 출발지 111.111.111.111에서 내부 모든 목적지의 tcp/2000를 오픈하는 규칙
규칙 삭제
# iptables -D INPUT 4
4번째 라인의 규칙을 삭제
# iptables -D INPUT -p –dport 443 -j ACCEPT
INPUT 체인에 내부 모든 서버의 tcp/443을 허용한 정책을 삭제
기본 정책을 ACCEPT로 설정
[root@iptables ~]# iptables -P INPUT ACCEPT
체인에 정의된 모든 규칙 삭제
[root@iptables ~]# iptables -P INPUT ACCEPT
INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용 추가
[root@iptables ~]# iptables -A INPUT -i lo -j ACCEPT
INPUT 체인에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가
[root@iptables ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
→ INPUT 체인의 접속에 속하는 패킷(응답 패킷을 가진 것)과 기존의 접속 부분은 아니지만 연관성을 가진 패킷(ICMP 에러나 ftp 데이터 접속을 형성하는 패킷)을 허용하는 규칙이다.
INPUT 체인에 프로토콜이 tcp이며 목적지 포트가 22번인 패킷에 대해 허용 추가
[root@iptables ~]# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
→ 이제부터 SSH 접속이 허용된다. talnet의 경우는 목적지 포트가 23번이다.
INPUT 체인에 대한 기본 정책을 DROP으로 변경
[root@iptables ~]# iptables -P INPUT DROP
FORWARD 체인에 대한 기본 정책을 DROP으로 변경
[root@iptables ~]# iptables -P FORWARD DROP
OUTPUT 체인에 대한 기본 정책을 허용으로 변경
[root@iptables ~]# iptables -P OUTPUT ACCEPT
설정 확인
그 밖의 다양한 사용 예제를 확인하고 싶다면 ..!
✔️ iptables 스크립트 파일
스크립트 파일을 작성해 자주 사용하는 iptables를 작성해 자동으로 실행할 수 있다.
iptables-save
iptable에 내용을 저장할 수 있다. save라는 명령어지만 내부에 저장되지는 않아 output을 다른 파일로 저장해야 한다. 만약 /etc/iptables.rules를 바로 수정했으면 다음 명령어는 필요없다.
[root@iptables ~]# /sbin/iptables-save > /etc/iptables.rules
iptables-restore
iptable-sava로 저장된 파일을 불러와서 iptables 내용을 다시 셋팅해준다.
[root@iptables ~]# /sbin/iptables-restore < /etc/iptables.rules
🔗참고
'Linux' 카테고리의 다른 글
[Linux] 명령 실행 (&& and ||) (0) | 2022.05.12 |
---|---|
[Linux] curl 명령어 (0) | 2022.04.05 |
[Linux] PXE 설치 서버 구현 (2) | 2022.03.21 |
[Linux] PXE, Kickstart (0) | 2022.03.21 |
[Linux] Proxy 서버 (0) | 2022.03.21 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!