netfilter
netfilter란 Kernel에 존재하는 Network 관련 Framework로써 원하는 지점에서 Packet 제어를 위한 다섯 가지 Hook(지점)을 제공합니다.
다섯 가지 Hook은 지점에 따라 PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING 으로 불립니다.
각각의 Hook에 대한 간단한 설명은 다음과 같습니다.
PREROUTING
Network Interface를 통해 들어온 Packet을 가장 먼저 처리하는 Hook
외부 주소(IP)로 도착한 Packet을 내부 주소(IP)로 변경하기 위해 DNAT(Destination NAT) 사용 가능
INPUT
Network Interface를 통해 들어온 Packet 중 실제 처리가 필요한 Packet을 처리하는 Hook
OUTPUT
Network Applications에서 처리 후 밖으로 나가는 Packet을 처리하는 Hook
FORWARD
다른 Host로 전달되는 Packet을 처리하는 Hook
POSTROUTING
Network Interface를 통해 Packet이 빠져나가기 직전에 처리하는 Hook
내부 주소(IP)를 외부 주소(IP)로 변경하기 위해 SNAT(Source NAT)과 MASQUERADE 사용 가능
※ SNAT과 MASQUERADE는 동일한 역할을 하지만, IP를 명시해줘야 하는 SNAT과 달리 MASQUERADE는 IP를 명시하지 않더라도 Network Interface를 통해 자동으로 IP를 할당함
iptables
iptables란 Linux에서 주로 사용되는 방화벽 도구로 Linux Kernel의 Networking Stack에서 netfilter를 이용하여 Packet을 제어할 수 있도록 도와줍니다.
구조
$ sudo iptables [-t Table] [Action] [Chain] [Match] [-j Target]
Table
filter (Default) : Rule에 따라 Packet을 걸러내거나 통과시키는 역할을 함.
※ INPUT, FORWARD, OUTPUT 사용 가능
nat : 외부 주소를 내부 주소로 변경하는 역할(SNAT) 또는 내부 주소를 외부 주소로 변경하는 역할(DNAT)을 함.
※ POSTROUTING, PREROUTING, OUTPUT 사용 가능
mangle : Packet 내 특정 값(TTL) 또는 TOS 값을 변경하는 역할을 함.
※ POSTROUTING, PREROUTING, INPUT, FORWARD, OUTPUT 사용 가능
raw : Netfilter의 Connection Tracking System과 독립적으로 동작하는 역할을 함.
※ PREROUTING, OUTPUT 사용 가능
Action
-A : 정책 추가 (Append)
-I : 정책 삽입 (Insert)
-D : 정책 삭제 (Delete)
-R : 정책 교체 (Replace)
-F : 모든 정책 삭제 (Flush)
-L : 정책 확인 (List)
Chain
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
Match
-s : Source 매칭
-d : Destination 매칭
-p : Protocol 매칭 (ex: TCP, UDP)
-i : 입력 Interface 지정
-o : 출력 Interface 지정
Target
ACCEPT : Packet 허용
DROP : Packet 버리기
REJECT : Packet을 버린 뒤, 적절한 응답 패킷 전송
LOG : Packet을 syslog에 기록
SNAT --to [주소] : Source IP를 [주소]로 변환
DNAT --to [주소] : Destination IP를 [주소]로 변환
RETURN : 호출 체인 내에서 Packet을 처리
MASQUERADE : POSTROUTING Chain의 nat Table에서만 사용 가능하며, 동적으로 IP 주소 매핑
자주 사용되는 예제
정책 목록 및 번호 확인
$ sudo iptables -L --line-numbers
INPUT Chain의 1번째 정책 삭제
$ sudo iptables -D INPUT 1
INPUT Chain 정책 전체 삭제
$ sudo iptables -F INPUT
특정 IP로부터 들어오는 Packet 허용 정책
$ sudo iptables -I INPUT -s xxx.xxx.xxx.xxx -j ACCEPT
특정 IP로부터 들어오는 Packet 차단 정책
$ sudo iptables -A INPUT xxx.xxx.xxx.xxx -j DROP
eth1 Network interface로 나가는 Packet에 MASQUERADE 사용
$ sudo iptables -n nat -A POSTROUTING -o eth1 -j masquerade
기타 명령어 참조
'Hack > Network' 카테고리의 다른 글
[Netfilter] IP Spoofing With netfilter_queue (0) | 2022.08.28 |
---|---|
[Netfilter] netfilter_queue 사용 방법 (0) | 2022.08.28 |
[Python Scapy] 3Way Handshake 시 RST를 자동으로 보내는 문제 해결 (0) | 2022.08.23 |
Dummy Virtual Network Interface 생성하는 법 (0) | 2022.08.22 |
[Python Scapy] ARP Spoofing 구현 (0) | 2022.08.21 |
댓글