[Linux] 리눅스 방화벽 도구(1) – iptables
netfilter를 언급하지 않고 리눅스에서 방화벽을 논할 수가 없습니다. netfilter는 패킷 필터링, 네트워크 주소 변환, 포트 변환 등과 같은 네트워크 기능을 처리하는 데 사용되는 Linux 커널의 프레임워크입니다. 즉, netfilter의 기능 자체가 방화벽을 설명하는 것이며, netfilter는 iptables, firewalld 또는 nftables 방화벽 도구를 통해 관리할 수 있습니다.
iptables 도구는 Linux에서 방화벽을 관리하는 데 매우 일반적인 도구입니다. 그것은 오랫동안 존재해왔고 앞으로도 그럴 가능성이 매우 높습니다. 그러나 Red Hat 7 및 CentOS 7과 같은 일부 Linux 배포판은 이제 기본적으로 firewalld를 사용합니다. 실제로 iptables는 Red Hat 8 및 CentOS 8과 같은 일부 Linux 배포판에서 더 이상 사용되지 않고, netfilter를 관리하는 데 사용되는 방화벽 도구는 이제 firewalld 및 nftables입니다. firewalld는 non-advanced 방화벽 규칙을 구성하는 데 사용할 수 있는 반면, nftables는 매우 고급 방화벽 규칙을 구성하는 데 사용됩니다. iptables, firewalld 그리고 nftables 방화벽 도구의 사용법을 순서대로 정리해 보겠습니다. 이 번 글은 리눅스 방화벽 도구 중 iptables에 대해 다뤄보겠습니다.
1. 명령어 기본 구문: iptables [-t table] [action] [chain] [match] [-j target]
- [-t table] : 주로 생략하거나(filter), nat를 많이 사용
- filter(default): iptables의 기본 테이블로 패킷 필터링 기능을 담당
- nat: Network Address Translation, 즉 IP주소 및 포트를 변환하고 관리(체인: PREROUTING, POSTROUTING, REDIRECT, OUTPUT, INPUT)
- mangle : 성능 향상을 위한 TOS(Type of Service) 설정과 같이 “패킷 헤더 데이터를 변경”하는 특수 규칙을 적용
- raw : netfilter의 연결 추적(Connection tracking) 시스템과 독립적으로 동작해야 하는 규칙을 설정, 연결을 추적하지 않는 패킷의 처리에 사용되는 테이블
- security : SELinux에서 사용하는 접근 제어 규칙을 적용
- [action] : 전체 체인에 대한 액션
- -N : 새로운 체인 생성
- -X : 비어있는 체인 제거(기본 체인인 INPUT, OUTPUT, FORWARD는 제거 불가)
- -L : 현재 정책 체인 목록 출력(--list), --line-numbers 옵션과 함께 사용하면 줄 맨앞에 라인번호 출력
- -F : 설정된 모든 정책 삭제하여 초기화(--flush)
- -C : 패킷 테스트
- -P : 지정한 chain의 기본 정책 적용(ACCEPT/DROP)
- -Z : 체인 내의 모든 규칙들의 패킷과 바이트 카운트를 “0”으로 설정
- [action] : 체인 내부에 대한 액션
- -A : 마지막에 chain 규칙 추가
- -I line_number: 지정한 라인번호 앞에 chain 규칙 삽입
- -R line_number: 지정한 라인번호의 chain 규칙 교환
- -D line_number: 지정한 라인번호의 chain 규칙 제거
- [chain]
- filter: INPUT, OUTPUT, FORWARD
- nat: PREROUTING, POSTROUTING, OUTPUT
- mangle: PREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING
- raw: PREROUTING, OUTPUT
- security: INPUT, OUTPUT, FORWARD
- [match] 패킷을 처리하기 위해 점검할 조건 지정(대표적인 것만 나열)
- -p protocol: 프로토콜(tcp, udp, icmp 등)
- -s IP주소 --sport 포트: 출발지IP 출발지Port (–source)
- -d IP주소 --dport 포트: 도착지IP 도착지Port (–destination)
- -i NIC: 입력 네트워크 interface 선택(chain: INPUT, FORWARD, PREROUTING)
- -o NIC: 출력 네트워크 interface 선택(chain: OUTPUT, FORWARD, POSTROUTING)
- -p icmp --icmp-type 타입 : echo-request(8), echo-reply(0), destination-unreachable(3), time-exceeded
- -m : 특정 모듈과 매칭
- --tcp-flags 플래그 : SYN, ACK, RIN, RST, URG 등 TCP flag 지정
- --syn : TCP flag로 SYN만 가진 것 지정(--tcp-flags ALL SYN과 동일)
- ! : 지정한 설정을 제외하는 등 뒤에 따라 오는 규칙은 제외
- [-j target] : 규칙을 만족할 경우 처리하는 방식 지정
- ACCEPT : 해당 패킷을 허용
- REJECT : 패킷을 버리고 동시에 ICMP 에러 메세지로 응답 패킷을 전송, 거절/전송
- DROP : 패킷 전송이 없었던 것처럼 패킷을 버리고 어떤 처리도 하지 않음, 거절/패기
- LOG : 패킷을 syslog에 전달하여 기록. 일반적으로 /var/log/messges에 저장. --log-prefix 함께 사용
- RETURN : 호출 체인 내에서 패킷 처리를 지속, 룰 연계
- SNAT : -t nat -A POSTROUTING과 함께 출발지 주소 변경
- DNAT : -t nat -A PREROUTING과 함께 목적지 주소 변경
- [-m module] : 확장 모듈 사용
- state : 트래픽의 상태를 기반으로 필터링 기능 수행
- --state 상태[,상태]: 상태을 “,”로 구분하여 나열
- NEW: 새로운 연결을 시작하는 패킷, TCP의 경우 SYN 플래그가 설정된 패킷이 여기에 해당합니다.
- ESTABLISHED: 이미 설정된 연결의 패킷, 양방향 트래픽이 성공적으로 이루어진 상태입니다.
- RELATED: 이미 설정된 연결과 관련된 새로운 연결을 시작하는 패킷, FTP 데이터 연결은 기존 FTP 제어 연결과 관련이 있습니다.
- INVALID: 유효하지 않은 패킷, 연결 상태를 추적할 수 없는 패킷이나 잘못된 패킷이 여기에 해당합니다.
- conntrack : state 모듈보다 강력하고 유연한 연결 추적을 제공하며, state 모듈의 모든 기능을 포함하고 더 많은 기능을 제공
- --ctstate 상태[,상태]: 상태값을 “,”로 구분하여 나열
- NEW: 새로운 연결을 시작하는 패킷
- ESTABLISHED: 이미 설정된 연결의 패킷
- RELATED: 이미 설정된 연결과 관련된 새로운 연결을 시작하는 패킷
- INVALID: 유효하지 않은 패킷
- UNTRACKED: 연결 추적 시스템에 의해 추적되지 않는 패킷
- connlimit : 동일한 IP주소 또는 네트워크 주소의 동시 연결 개수 제한, DDoS 공격에 효과적으로 대응
- --connlimit n : 동시 연결 수를 정확히 n개로 제한
- --connlimit-above n : 동시 연결 수가 n개를 초과할 때 새로운 연결을 차단
- --connlimit-mask <0~32> : subnet mask값을 지정하여 동일한 네트워크 주소에 대한 동시 연결 제한(default값 : 0, 동일 IP주소의 동시 연결 수를 제한하려면 32 지정)
- limit : 초(s)/분(m)/시(h)/일(d) 단위로 유입되는 패킷 수 제한
- --limit 숫자/단위 : 초(s)/분(m)/시(h)/일(d) 단위로 유입되는 패킷 수 제한
- --limit-burst 숫자 : 초기 대응에 사용되는 최대 허용 패킷 수
- recent : 동적으로 출발지 IP목록을 생성하여 이를 기반으로 지정한 시간 범위 내 동일 출발지 IP의 연결 요청 개수에 대한 제한
- --name 목록이름 : 목록 이름을 지정
- --set : 해당 목록에 새로운 엔트리 추가 또는 업데이트
- --rcheck : 해당 목록에 패킷의 출발지 IP가 있는지 체크
- --update : rcheck와 동일하게 해당 목록에 패킷의 출발지 IP가 있는지 체크하고, 있으면 “last seen” timestamp 갱신
- --seconds n : --rcheck/--update 옵션과 함께 사용되며, 해당 엔트리의 “last seen” timestamp가 지정한 초 범위 내에 있는지 체크
- --hitcount n : --rcheck/--update 옵션과 함께 사용되며, 해당 엔트리의 hit count가 지정한 값 이상인지 체크
- length : 데이터(헤더+페이로드)의 길이(바이트)에 따라 패킷을 필터링, Ping of Death나 NTP DRDoS 공격 대응
- --length 최소값:최대값 – 최소값과 최대값 사이에 있는 패킷 필터링
- --length 최소값: – 최소값 이상이 되는 패킷 필터링
- --length :최대값 – 최대값 이하가 되는 패킷 필터링
- state : 트래픽의 상태를 기반으로 필터링 기능 수행
2. iptables에 등록된 정책 출력하기
-L 옵션: 정책 출력
-n: IP주소 및 포트번호를 숫자로 표시
-v: 자세히 출력
--line-numbers : 등록된 정책 앞에 번호 표시[root@centos8 ~]# iptables -L -n -v --line-numbersChain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 58574 238M LIBVIRT_INP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 LIBVIRT_FWX all -- * * 0.0.0.0/0 0.0.0.0/0 2 0 0 LIBVIRT_FWI all -- * * 0.0.0.0/0 0.0.0.0/0 3 0 0 LIBVIRT_FWO all -- * * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 35690 11M LIBVIRT_OUT all -- * * 0.0.0.0/0 0.0.0.0/0 Chain LIBVIRT_INP (1 references) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 2 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 3 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 4 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain LIBVIRT_OUT (1 references) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:53 2 0 0 ACCEPT tcp -- * virbr0 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 3 0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68 4 0 0 ACCEPT tcp -- * virbr0 0.0.0.0/0 0.0.0.0/0 tcp dpt:68 Chain LIBVIRT_FWO (1 references) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 2 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain LIBVIRT_FWI (1 references) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED 2 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain LIBVIRT_FWX (1 references) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
3. iptables에 등록된 모든 정책 초기화 및 빈 체인 삭제하기
-F 옵션: 모든 정책 삭제(flushing)
-X 옵션: 빈 체인 삭제[root@centos8 ~]# iptables -FChain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
[root@centos8 ~]# iptables -X
[root@centos8 ~]# iptables -L -n -v --line-numbers
4. filter 테이블에 정책 추가하기
-A 옵션: 등록된 정책을 맨 뒤에 추가
-s 옵션: 출발지 주소 지정(source)[root@centos8 ~]# iptables -A INPUT -s 192.168.56.107 -j DROPChain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.56.107 0.0.0.0/0 2 ACCEPT all -- 192.168.56.108 0.0.0.0/0
[root@centos8 ~]# iptables -A INPUT -s 192.168.56.108 -j ACCEPT
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
5. filter 테이블에 정책 삽입하기
-I 옵션: 지정한 정책 번호 앞에 신규 정책 삽입[root@centos8 ~]# iptables -I INPUT 2 -s 192.168.56.109 -j REJECTChain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.56.107 0.0.0.0/0 2 REJECT all -- 192.168.56.109 0.0.0.0/0 reject-with icmp-port-unreachable 3 ACCEPT all -- 192.168.56.108 0.0.0.0/0
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
6. filter 테이블에 정책 변경하기
-R 옵션: 지정한 정책의 규칙을 변경[root@centos8 ~]# iptables -R INPUT 3 -s 192.168.56.110 -j ACCEPTChain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.56.107 0.0.0.0/0 2 REJECT all -- 192.168.56.109 0.0.0.0/0 reject-with icmp-port-unreachable 3 ACCEPT all -- 192.168.56.110 0.0.0.0/0
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
7. filter 테이블에 정책 삭제하기
-D 옵션: 지정된 정책 번호나 특정한 정책을 삭제[root@centos8 ~]# iptables -D INPUT 2Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.56.107 0.0.0.0/0
[root@centos8 ~]# iptables -D INPUT -s 192.168.56.110 -j ACCEPT
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
8. nat 테이블에 패킷의 출발지 주소 변경(SNAT)
-s 옵션: ip.addr.x.x-ip.addr.y.y 형식으로 IP주소 범위 지정 가능[root@centos8 ~]# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j SNAT --to 203.247.50.3Chain PREROUTING (policy ACCEPT) num target prot opt source destination Chain INPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1 SNAT all -- 192.168.56.0/24 0.0.0.0/0 to:203.247.50.3 Chain OUTPUT (policy ACCEPT) num target prot opt source destination
[root@centos8 ~]# iptables -t nat -L -n --line-numbers
9. nat 테이블에 패킷의 도착지 주소 변경(DNAT)
[root@centos8 ~]# iptables -t nat -A PREROUTING -p tcp -d 203.247.12.22 --dport 80 -i eth0 -j DNAT --to 192.168.56.106:80Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 DNAT tcp -- 0.0.0.0/0 203.247.12.22 tcp dpt:80 to:192.168.56.106:80 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1 SNAT all -- 192.168.56.0/24 0.0.0.0/0 to:203.247.50.3 Chain OUTPUT (policy ACCEPT) num target prot opt source destination
[root@centos8 ~]# iptables -t nat -L -n --line-numbers
10. iptables 정책을 저장하고 불러오기
$ iptables-save > /path/to/iptables.rules $ iptables-restore < /path/to/iptables.rules
이제부터는 다양한 시나리오를 가지고 iptables로 정책을 추가해 보겠습니다.
- 모든 패킷 차단
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
- 유입되는 패킷만 차단
-- state
값: NEW, ESTABLISHED, RELATED, INVALIDiptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
- 사설 IP주소 및 특수 목적 IP주소로 유입되는 모든 패킷 거부
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth1 -s 224.0.0.0/4 -j DROP (Multicast) iptables -A INPUT -i eth1 -s 240.0.0.0/5 -j DROP (Experimental) iptables -A INPUT -i eth1 -s 127.0.0.0/8 -j DROP (Loopback)
- ICMP 프로토콜을 제외한 모든 프로토콜을 거부
iptables -A INPUT !-p icmp -j DROP
- TCP 3-way handshake 연결 시 첫 번째 bit가 syn이 아닐 경우 거부
iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP
- 유효하지 않은 패킷은 거부
iptables -A INPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP
- TCP XMAS 패킷과 TCP NULL 패킷 거부
iptables -A INPUT -p tcp -m tcp --tcp-flags ALL ALL -j DROP iptables -A INPUT -p tcp -m tcp --tcp-flags ALL NONE -j DROP
- TCP RST 패킷을 처음에는 최대 10개를 즉시 허용하고, 이후에는 초당 2개의 속도로 RST 패킷을 허용합니다.
– 급격한 트래픽 증가에 더 빠르게 대응하고 싶다면 –limit-burst 값을 낮게 설정하는 것이 좋고, 초기 트래픽을 좀 더 유연하게 처리하고 싶다면 기본값(5)을 사용하는 것이 좋습니다. TCP RST 패킷은 TCP 연결을 중단하는 데 사용되므로 동시에 많은 RST 패킷을 볼 수는 없습니다.--tcp-flags RST RST
: RST 플래그만을 검사해서 RST 플래그가 설정된 패킷 탐지, 다른 플래그들이 설정되어 있어도 패킷 탐지--tcp-flags ALL RST
: 모든 플래그들을 검사해서 RST 플래그만 설정된 패킷 탐지, 다른 플래그들이 설정되지 않은 경우에만 패킷 탐지iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 10 -j ACCEPT
- 기본 정책으로 들어오는 모든 패킷을 거부하고 특정 IP주소만 허용
iptables -P INPUT DROP iptables -A INPUT -s 192.168.56.1 -j ACCEPT
- TCP 10~100번 포트는 거부하나 HTTP 서비스만 허용(중복된 정책이 있을 경우 먼저 등록된 정책 적용)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 10:100 -j DROP
- 초당 허용 접속 개수(100/s)를 제한하여 TCP Flooding 공격에 대응
iptables -A INPUT -p tcp --dport 80 --syn -m limit --limit 100/s -j ACCEPT
- 에코 요청/응답의 연결 테스트 허용(초당 2개까지)
– 사용 가능한 ICMP 타입: echo-request, echo-request, destination-unreachable, time-exceedediptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp -m limit --limit 2/second -j ACCEPT
- ICMP Smurf Attack 대응
iptables -A INPUT -p icmp --icmp-type address-mask-request -j DROP iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP iptables -A INPUT -p icmp --icmp-type router-solicitation -j DROP
- SYN Flood Attack 대응
iptables -A INPUT -p tcp -m state --state NEW -m limit --limit 50/second --limit-burst 50 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -j DROP iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- SSH 연결 허용
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
- 같은 IP 주소에서 60초 동안에 5번까지만 ssh 접속 시도 허용
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/m --limit-burst 5 -j ACCEPT
- 같은 IP 주소에서 60초 동안에 5번 이상 ssh 접속을 시도하면 로그 기록(/var/log/messages)
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/m --limit-burst 5 -j LOG --log-prefix "IP_SPOOF A: "
- 특정 MAC 주소로부터 온 트래픽을 통제
iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
- 클라이언트 당 서버에 동시 ssh 접속 수를 3개까지 허용
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
- DNS/NTP 증폭 DRDoS공격에 이용당하는 것을 방지하기 위해 일정 크기 이상의 응답 패킷을 차단하기
– DNS의 경우, 512 byte의 이상의 데이터는 TCP를 이용하여 전송iptables -A OUTPUT -p udp --sport 53 -m length --length 100: -j DROP iptables -A OUTPUT -p tcp --sport 53 -m length --length 512: -j DROP iptables -A OUTPUT -p udp --sport 123 -m length --length 100: -j DROP
- SSH Brute Force/Dictionary 공격을 차단하기
– 출발지 IP를 기준으로 연결 요청이(–state NEW) 60초 이내에(–seconds 60) 5번 이상(–hitcount 5) 들어오면 이를 차단(-j DROP)iptables -F INPUT iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCETP iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --name SSH_DROP --set iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j LOG --log-prefix "[SSH Brute Force Drop]" iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j DROP iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
- TCP 80포트 요청에 대하여 동일 출발지 IP의 동시 연결 개수를 5개 초과 시 차단(Slow HTTP POST/HEAD DoS 공격 대응)
<비상태 기반 설정> iptables -A OUTPUT -p tcp --dport 80 --syn -m connlimit --connlimit-above 5 -j DROP <상태 기반 설정> iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -m connlimit --connlimit-above 5 -j DROP
- 2초 동안 80번 포트에 동일 출발지 IP에서 30번 이상의 SYN 패킷이 들어오면 이를 차단(TCP SYN Flooding 공격 대응)
<비상태 기반 설정> iptables -A OUTPUT -p tcp --dport 80 --syn -m recent --name SYN_FLOODING --update --seconds 2 --hitcount 30 -j DROP <상태 기반 설정> iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -m recent --name SYN_FLOODING --update --seconds 2 --hitcount 30 -j DROP
- SYN flag와 FIN flag가 동시에 설정된 비정상 패킷 필터링
비정상 패킷은 IDS/IPS의 탐지를 우회하영 공격 또는 스캔닝을 위한 목적으로 자주 사용되므로 이를 탐지 및 차단해야 한다iptables -A OUTPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP