[Linux] 리눅스 방화벽 도구(1) – iptables

netfilter를 언급하지 않고 리눅스에서 방화벽을 논할 수가 없습니다. netfilter는 패킷 필터링, 네트워크 주소 변환, 포트 변환 등과 같은 네트워크 기능을 처리하는 데 사용되는 Linux 커널의 프레임워크입니다. 즉, netfilter의 기능 자체가 방화벽을 설명하는 것이며, netfilter는 iptables, firewalld 또는 nftables 방화벽 도구를 통해 관리할 수 있습니다.
firewall tools of netfilter
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]
  1. [-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에서 사용하는 접근 제어 규칙을 적용
  2. [action] : 전체 체인에 대한 액션
    • -N : 새로운 체인 생성
    • -X : 비어있는 체인 제거(기본 체인인 INPUT, OUTPUT, FORWARD는 제거 불가)
    • -L : 현재 정책 체인 목록 출력(--list), --line-numbers 옵션과 함께 사용하면 줄 맨앞에 라인번호 출력
    • -F : 설정된 모든 정책 삭제하여 초기화(--flush)
    • -C : 패킷 테스트
    • -P : 지정한 chain의 기본 정책 적용(ACCEPT/DROP)
    • -Z : 체인 내의 모든 규칙들의 패킷과 바이트 카운트를 “0”으로 설정
  3. [action] : 체인 내부에 대한 액션
    • -A : 마지막에 chain 규칙 추가
    • -I line_number: 지정한 라인번호 앞에 chain 규칙 삽입
    • -R line_number: 지정한 라인번호의 chain 규칙 교환
    • -D line_number: 지정한 라인번호의 chain 규칙 제거
  4. [chain]
    • filter: INPUT, OUTPUT, FORWARD
    • nat: PREROUTING, POSTROUTING, OUTPUT
    • mangle: PREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING
    • raw: PREROUTING, OUTPUT
    • security: INPUT, OUTPUT, FORWARD
  5. [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과 동일)
    • ! : 지정한 설정을 제외하는 등 뒤에 따라 오는 규칙은 제외
  6. [-j target] : 규칙을 만족할 경우 처리하는 방식 지정
    • ACCEPT : 해당 패킷을 허용
    • REJECT : 패킷을 버리고 동시에 ICMP 에러 메세지로 응답 패킷을 전송, 거절/전송
    • DROP : 패킷 전송이 없었던 것처럼 패킷을 버리고 어떤 처리도 하지 않음, 거절/패기
    • LOG : 패킷을 syslog에 전달하여 기록. 일반적으로 /var/log/messges에 저장. --log-prefix 함께 사용
    • RETURN : 호출 체인 내에서 패킷 처리를 지속, 룰 연계
    • SNAT : -t nat -A POSTROUTING과 함께 출발지 주소 변경
    • DNAT : -t nat -A PREROUTING과 함께 목적지 주소 변경
  7. [-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 :최대값 – 최대값 이하가 되는 패킷 필터링
2. iptables에 등록된 정책 출력하기
-L 옵션: 정책 출력
-n: IP주소 및 포트번호를 숫자로 표시
-v: 자세히 출력
--line-numbers : 등록된 정책 앞에 번호 표시
[root@centos8 ~]# iptables -L -n -v --line-numbers
Chain 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 -F
[root@centos8 ~]# iptables -X
[root@centos8 ~]# iptables -L -n -v --line-numbers
Chain 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
4. filter 테이블에 정책 추가하기
-A 옵션: 등록된 정책을 맨 뒤에 추가
-s 옵션: 출발지 주소 지정(source)
[root@centos8 ~]# iptables -A INPUT -s 192.168.56.107 -j DROP
[root@centos8 ~]# iptables -A INPUT -s 192.168.56.108 -j ACCEPT
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
Chain 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
5. filter 테이블에 정책 삽입하기
-I 옵션: 지정한 정책 번호 앞에 신규 정책 삽입
[root@centos8 ~]# iptables -I INPUT 2 -s 192.168.56.109 -j REJECT
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
Chain 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
6. filter 테이블에 정책 변경하기
-R 옵션: 지정한 정책의 규칙을 변경
[root@centos8 ~]# iptables -R INPUT 3 -s 192.168.56.110 -j ACCEPT
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
Chain 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
7. filter 테이블에 정책 삭제하기
-D 옵션: 지정된 정책 번호나 특정한 정책을 삭제
[root@centos8 ~]# iptables -D INPUT 2
[root@centos8 ~]# iptables -D INPUT -s 192.168.56.110 -j ACCEPT
[root@centos8 ~]# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.56.107 0.0.0.0/0
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.3
[root@centos8 ~]# iptables -t nat -L -n --line-numbers
Chain 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
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:80
[root@centos8 ~]# iptables -t nat -L -n --line-numbers
Chain 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
10. iptables 정책을 저장하고 불러오기
$ iptables-save > /path/to/iptables.rules
$ iptables-restore < /path/to/iptables.rules
이제부터는 다양한 시나리오를 가지고 iptables로 정책을 추가해 보겠습니다.
  1. 모든 패킷 차단
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    
  2. 유입되는 패킷만 차단
    -- state 값: NEW, ESTABLISHED, RELATED, INVALID
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
    
  3. 사설 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)
    
  4. ICMP 프로토콜을 제외한 모든 프로토콜을 거부
    iptables -A INPUT !-p icmp -j DROP
    
  5. TCP 3-way handshake 연결 시 첫 번째 bit가 syn이 아닐 경우 거부
    iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP
    
  6. 유효하지 않은 패킷은 거부
    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
    
  7. 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
    
  8. 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
    
  9. 기본 정책으로 들어오는 모든 패킷을 거부하고 특정 IP주소만 허용
    iptables -P INPUT DROP
    iptables -A INPUT -s 192.168.56.1 -j ACCEPT
    
  10. TCP 10~100번 포트는 거부하나 HTTP 서비스만 허용(중복된 정책이 있을 경우 먼저 등록된 정책 적용)
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 10:100 -j DROP
    
  11. 초당 허용 접속 개수(100/s)를 제한하여 TCP Flooding 공격에 대응
    iptables -A INPUT -p tcp --dport 80 --syn -m limit --limit 100/s -j ACCEPT
    
  12. 에코 요청/응답의 연결 테스트 허용(초당 2개까지)
    – 사용 가능한 ICMP 타입: echo-request, echo-request, destination-unreachable, time-exceeded
    iptables -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
    
  13. 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
    
  14. 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
    
  15. SSH 연결 허용
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
    
  16. 같은 IP 주소에서 60초 동안에 5번까지만 ssh 접속 시도 허용
    iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/m --limit-burst 5 -j ACCEPT
    
  17. 같은 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: "
    
  18. 특정 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
    
  19. 클라이언트 당 서버에 동시 ssh 접속 수를 3개까지 허용
    iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
    
  20. 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
    
  21. 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
    
  22. 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
    
  23. 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
    
  24. SYN flag와 FIN flag가 동시에 설정된 비정상 패킷 필터링
    비정상 패킷은 IDS/IPS의 탐지를 우회하영 공격 또는 스캔닝을 위한 목적으로 자주 사용되므로 이를 탐지 및 차단해야 한다
    iptables -A OUTPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP
    

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다