작성 중
iptables는 리눅스의 방화벽이나 proxy 기능을 제공하는 패킷필터링 도구로서 커널 2.4부터 도입되었고 netfilter라고 부르기도 함
iptables로 패킷 검사 조건과 조건에 일치했을 때 수행할 처리방법을 규칙으로 등록할 수 있음
- table, rule list
- chain
- built-in chain
- for filter
- INPUT: 들어오는 패킷에 적용
- OUTPUT: 나가는 패킷에 적용
- FORWARD: 지나가는 패킷에 적용
- nat
- PREROUTING: 처음 전달받은 패킷을 처리
- OUTPUT: POSTROUTING 전에 처리
- POSTROUTING: 시스템을 떠나기 직전에 처리
- mangle
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
- target
- ACCEPT: 패킷을 허용하고 이후 규칙 체크를 건너뜀
- DROP: 패킷을 거부하고 응답을 보내지 않음
- REJECT: 패킷을 거부하고 응답을 보냄
- QUEUE: 패킷을 사용자 공간으로 전달함
- LOG: syslog에 기록함
iptables [-t 테이블명] 체인옵션 체인명 일치조건... 타깃옵션 타깃명
- filter/nat/mangle/raw/security
- 기본 테이블은 filter
- 규칙을 추가하거나 삭제
- -A 새로운 규칙을 맨아래 추가
- -C 패킷을 체크
- -D 규칙 삭제
- -L 규칙 목록 출력
- -N 새로운 체인 생성
- -X 비어있는 체인 삭제
- -P 기본 정책 변경
- -F 체인의 모든 규칙 삭제
- -I 새로운 규칙을 맨위에 추가
- -R 새로운 규칙을 기존 것과 교체
- -S
- -Z
- -E
- -s 출발지 주소
- -d 목적지 주소
- --sport 출발지 포트번호, 8080:8090처럼 :으로 묶으면 대역 지정 가능함
- --dport 목적지 포트번호, 8080:8090처럼 :으로 묶으면 대역 지정 가능함
- -p 프로토콜
- -i 들어오는 인터페이스(NIC)
- -o 나가는 인터페이스(NIC)
- -f 조각난(fragmented) 패킷
- --tcp-flags TCP 플래그가 켜져있는지 꺼져있는지 확인함
- ACK/FIN/PSH/RST/SYN/URG/ALL/NONE
- 공백으로 구분된 두 개의 아규먼트를 가지며 첫번째 아규먼트는 검사할 플래그 리스트이고 두번째 아규먼트는 켜져있어야 할 플래그 리스트임
- ex) --tcp-flags ACK,FIN,SYN SYN # SYN은 켜져있어야 하고 ACK, FIN은 꺼져있어야 함
iptables -L
iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
iptables -D 체인명 행번호
iptables -D INPUT -s 출발지주소 --sport 출발지포트번호 -d 목적지주소 --dport 목적지포트번호 -j 처리방법(target)
iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
- 특정 IP에서 들어오는 ssh 접속만 허용하고 나머지는 차단
iptables -A INPUT -p tcp -s 192.168.1.3 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
service iptables save
- SYN 플래그만 켜져 있고 RST, ACK 플래그가 꺼져 있으면 DROP
iptables -A INPUT -p TCP --tcp-flags SYN,RST,ACK SYN -j DROP
- 동일한 IP에서 SYN 패킷이 초당 100회 이상 인입되면 거부
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 1 --hitcount 100 -j DROP
- libnetfiter_queue 패키지를 추가로 설치하면 NFQUEUE 처리방법(target)을 사용할 수 있음
- NFQUEUE target은 유저공간의 소프트웨어로 패킷을 처리하는 기능이며 패킷을 변조하기 용이함
apt install libfilter-queue-dev
sysctl -w net.ipv4.ipforward=1 # /etc/sysctl.conf에 적어둬야 영구 반영됨
- libnetfilter_queue를 링크하여 빌드한 프로그램(유저공간 소프트웨어)이 iptables 규칙에 일치한 패킷을 0번 큐에 추가함
iptables -A INPUT -j NFQUEUE --queue-num 0
유저공간 소프트웨어는 패킷에 대한 평결(verdict)을 내림
들어온 순서와 상관없이 평결 순서를 임의로 정할 수 있음
https://home.regit.org/netfilter-en/using-nfqueue-and-libnetfilter_queue/