일상의 정리

IPtables를 이용한 DDoS 방어: 궁극의 가이드

리눅스/해킹


DDoS Protection With IPtables: The Ultimate Guide 글을 번역한 내용입니다.

원본 글: https://javapipe.com/ddos/blog/iptables-ddos-protection/


iptables에 대한 자체 DDoS 방지 규칙을 작성하는 여러 가지 방법이 있습니다.

우리는 이 포괄적 인 튜토리얼에서 가장 효과적인 iptables DDoS 보호 방법을 논의 할 것입니다.


이 가이드는 다음을 수행하는 방법을 알려줍니다.

DDoS 공격을 막기 위한 iptables 테이블과 체인을 선택
DDoS 공격의 영향을 줄이기 위한 커널 설정 조정
iptables를 사용하여 대부분의 TCP 기반 DDoS 공격 차단
iptables SYNPROXY를 사용하여 SYN 플러드를 차단하기


이 글은 리눅스 서버를 매일 다루는 전문가를 대상으로 작성되었습니다.

온라인 애플리케이션을 DDoS 공격으로부터 보호하려는 경우 원격 보호, DDoS 보호 기능이있는 VPS 또는 DDoS로 보호 된 베어 메탈 (Bare Metal) 서버를 사용할 수 있습니다.
iptables로 DDoS 공격을 차단할 수는 있지만 대규모 DDoS 플러드를 탐지하고 차단하기 위한 실제 하드웨어 방화벽 (최근에 DDoS 완화를 위해 하드웨어를 검토 한 방법)을 대체할 수는 없습니다.
그러나 iptables를 사용하여 회선 속도로 대부분의 불량 트래픽을 필터링하는 것은 불가능하지 않습니다!
우리는 TCP 기반 공격으로부터만 보호할 것입니다. 대부분의 UDP 기반 공격은 모든 공통 서버의 네트워크 인터페이스 카드를 소모하는 증폭된 반사 공격입니다.
이러한 유형의 공격에 대처하는 유일한 완화 접근법은 에지 네트워크 또는 코어 네트워크 또는 캐리어에서 미리 차단하는 것입니다.

우리는 현재 일리노이 주 시카고와 루마니아의 부카레스트에서 측정되지 않은 대역폭과 DDoS 보호 기능을 갖춘 VPS를 제공하고 있다는 것을 알고 계셨습니까?
그들이 서버에 연결할 수 있다면 DDoS로 보호되는 네트워크로 이동하는 것을 제외하고는 다중 Gbit / s 공격에 대해 할 수있는 일이 많지 않습니다.

IPtables 란?
netfilter iptables (곧 nftables로 대체)는 netfilter에서 개발 한 커널 패킷 필터링 규칙을 구성하는 사용자 공간 명령행 유틸리티입니다.
리눅스 시스템의 기본 방화벽 관리 유틸리티입니다. 리눅스 시스템을 사용하는 모든 사람들은 익숙하거나 적어도 들어 봤어야 합니다.
iptables는 특정 패킷을 필터링하고, 소스 또는 대상 포트 및 IP 주소를 차단하고, NAT를 통해 패킷을 전달하고 다른 많은 것들을 사용할 수 있습니다.
가장 일반적으로 대상 포트와 소스 IP 주소를 차단하는 데 사용됩니다.


왜 IPtables Anti-DDoS 규칙일까?

현재 iptables가 DDoS 공격을 막는 규칙을 이해하는 이유를 알아보기 위해 iptables의 작동 방식을 먼저 이해해야 합니다.

iptables는 IP 패킷 필터 규칙 테이블을 설정하고 제어하는 ​​데 사용되는 명령행 도구입니다. 목적에 따라 다른 테이블이 있습니다.

IPtables 테이블

Filter : Filter 테이블은 -t (-table) 옵션을 사용하지 않으면 규칙이 사용하는 가장 일반적으로 사용되는 기본 테이블입니다.

Nat :이 테이블은 NAT(Network Address Translation:네트웍 주소 전달)에 사용됩니다. 패킷이 새로운 연결을 생성하면 nat 테이블에 규칙이 있는지 검사합니다(역주: 쉽게 설명하자면 인터넷 공유기 역할).

Mangle : mangle 테이블은 패킷과 헤더 정보를 수정하거나 표시하는 데 사용됩니다.

Raw :이 테이블의 목적은 주로 NOTRACK 대상을 사용하는 연결 추적에서 특정 패킷을 제외하는 것입니다.

위에서 보듯이 표준이 아닌 커널 모듈이 로드되지 않은 일반 Linux 시스템에는 네 가지 테이블이 있습니다. 이 테이블 각각은 iptables 체인의 다른 세트를 지원합니다.


IPtables Chains

PREROUTING: raw, nat, mangle

  • 네트워크 인터페이스 카드 (NIC)에 들어가는 패킷에 적용됩니다.

INPUT: filter, mangle

  • 로컬 소켓을 대상으로하는 패킷에 적용됩니다.

FORWARD: filter, mangle

  • 서버를 통해 라우팅되는 패킷에 적용됩니다.

OUTPUT: raw, filter, nat, mangle

  • 서버가 전송하는 패킷 (로컬에서 생성 된 패킷)에 적용됩니다.

POSTROUTING: nat, mangle

  • 서버에서 나가는 패킷에 적용됩니다.


차단하거나 수정할 패킷의 종류에 따라 특정 iptables 테이블과 선택한 테이블이 지원하는 체인을 선택합니다.

물론, 우리는 여전히 iptables 타겟 (ACCEPT, DROP, REJECT 등)에 대한 설명을 하지 않고 있지만 이 기사를 읽는다면 이미 iptables를 다루는 방법을 알고 있다고 가정하고 있습니다.

우리는 왜 iptables 규칙이 DDoS를 멈추고, iptables 사용법을 가르쳐주지 않는지 설명 할 것입니다. 다시 생각해 봅시다.

iptables로 DDoS 공격을 차단하려면 iptables 규칙의 성능이 매우 중요합니다. 대부분의 TCP 기반 DDoS 공격 유형은 높은 패킷 전송률을 사용합니다. 즉, 초당 패킷 수는 서버가 다운되는 원인입니다.

따라서 가능한 한 초당 많은 패킷을 처리하고 차단할 수 있는지 확인해야합니다.

iptables를 사용하여 DDoS 공격을 차단하는 방법에 대한 대부분의 지침은 전부는 아니지만 대부분의 경우 DDoS 방지 규칙에 필터 테이블과 INPUT 체인을 사용합니다.

이 접근 방식의 문제점은 INPUT 체인이 PREROUTING 및 FORWARD 체인 후에만 ​​처리되므로 패킷이 이 두 체인 중 하나와 일치하지 않는 경우에만 적용된다는 것입니다.

이로 인해 자원을 소비하는 패킷의 필터링이 지연됩니다. 결론적으로 우리는 규칙을 최대한 효과적으로 만들기 위해서는 우리의 anti-DDoS 규칙을 가능하면 체인까지 멀리 옮겨야합니다.

패킷에 적용 할 수있는 첫 번째 체인은 PREROUTING 체인이므로 이상적으로 이 체인의 잘못된 패킷을 필터링해야합니다.

그러나 필터 테이블은 PREROUTING 체인을 지원하지 않습니다. 이 문제를 해결하기 위해 안티 DDoS iptables 규칙에 필터 테이블 대신 mangle 테이블을 사용하면됩니다.

필터 테이블이 지원하는 모든 규칙은 아니지만 대부분의 iptables 체인을 지원합니다.


그래서 iptables DDoS 보호 규칙이 왜 엉망이되는지 알고 싶습니까? 불량 패킷을 차단하기 위해 필터 테이블과 INPUT 체인을 사용하기 때문입니다!

iptables 규칙의 성능을 극적으로 향상시키고 따라서 필터링 할 수있는 (TCP) DDoS 공격 트래픽의 양을 극적으로 증가시키는 최상의 솔루션은 mangle 테이블과 PREROUTING 체인을 사용하는 것입니다!


DDoS를 완화하는 최고의 Linux 커널 설정

또 다른 일반적인 실수는 사람들이 DDoS 공격의 효과를 더 잘 완화하기 위해 최적화된 커널 설정을 사용하지 않는다는 것입니다.

이 가이드는 CentOS 7을 선택한 운영 체제로 중점적으로 설명합니다. CentOS 7에는 iptables의 최신 버전과 새로운 SYNPROXY 대상 지원 기능이 포함되어 있습니다.

iptables로 DDoS를 효과적으로 완화하기 위해 조정해야하는 모든 단일 커널 설정은 다루지 않습니다.

대신 CentOS 7 커널 설정을 제공합니다. 아래의 내용을 /etc/sysctl.conf 파일에 넣고 sysctl -p와 함께 설정을 적용하십시오.


Anti-DDoS Kernel Settings (sysctl.conf)

kernel.printk = 4 4 1 7 
kernel.panic = 10 
kernel.sysrq = 0 
kernel.shmmax = 4294967296 
kernel.shmall = 4194304 
kernel.core_uses_pid = 1 
kernel.msgmnb = 65536 
kernel.msgmax = 65536 
vm.swappiness = 20 
vm.dirty_ratio = 80 
vm.dirty_background_ratio = 5 
fs.file-max = 2097152 
net.core.netdev_max_backlog = 262144 
net.core.rmem_default = 31457280 
net.core.rmem_max = 67108864 
net.core.wmem_default = 31457280 
net.core.wmem_max = 67108864 
net.core.somaxconn = 65535 
net.core.optmem_max = 25165824 
net.ipv4.neigh.default.gc_thresh1 = 4096 
net.ipv4.neigh.default.gc_thresh2 = 8192 
net.ipv4.neigh.default.gc_thresh3 = 16384 
net.ipv4.neigh.default.gc_interval = 5 
net.ipv4.neigh.default.gc_stale_time = 120 
net.netfilter.nf_conntrack_max = 10000000 
net.netfilter.nf_conntrack_tcp_loose = 0 
net.netfilter.nf_conntrack_tcp_timeout_established = 1800 
net.netfilter.nf_conntrack_tcp_timeout_close = 10 
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10 
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20 
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20 
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20 
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20 
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10 
net.ipv4.tcp_slow_start_after_idle = 0 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.ip_no_pmtu_disc = 1 
net.ipv4.route.flush = 1 
net.ipv4.route.max_size = 8048576 
net.ipv4.icmp_echo_ignore_broadcasts = 1 
net.ipv4.icmp_ignore_bogus_error_responses = 1 
net.ipv4.tcp_congestion_control = htcp 
net.ipv4.tcp_mem = 65536 131072 262144 
net.ipv4.udp_mem = 65536 131072 262144 
net.ipv4.tcp_rmem = 4096 87380 33554432 
net.ipv4.udp_rmem_min = 16384 
net.ipv4.tcp_wmem = 4096 87380 33554432 
net.ipv4.udp_wmem_min = 16384 
net.ipv4.tcp_max_tw_buckets = 1440000 
net.ipv4.tcp_tw_recycle = 0 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_max_orphans = 400000 
net.ipv4.tcp_window_scaling = 1 
net.ipv4.tcp_rfc1337 = 1 
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_synack_retries = 1 
net.ipv4.tcp_syn_retries = 2 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_timestamps = 1 
net.ipv4.tcp_sack = 1 
net.ipv4.tcp_fack = 1 
net.ipv4.tcp_ecn = 2 
net.ipv4.tcp_fin_timeout = 10 
net.ipv4.tcp_keepalive_time = 600 
net.ipv4.tcp_keepalive_intvl = 60 
net.ipv4.tcp_keepalive_probes = 10 
net.ipv4.tcp_no_metrics_save = 1 
net.ipv4.ip_forward = 0 
net.ipv4.conf.all.accept_redirects = 0 
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.all.accept_source_route = 0 
net.ipv4.conf.all.rp_filter = 1

이 sysctl.conf 설정은 DDoS 하에서 서버의 성능을 최대화하는 것은 물론이 가이드에서 제공 할 iptables 규칙의 효과를 돕습니다.


실제 IPtables Anti-DDoS 규칙

DDoS 공격의 영향을 완화하기 위해 최적화 된 커널 설정뿐만 아니라 mangle 테이블과 PREROUTING 체인을 사용해야한다는 사실을 알았으므로 대부분의 TCP DDoS 공격을 완화하기위한 몇 가지 예제 규칙으로 이동합니다.

DDoS 공격은 복잡합니다.

DDoS에는 여러 가지 유형이 있으며 모든 서비스에 대해 서명 기반 규칙을 유지하는 것은 거의 불가능합니다.

다행히도 연결 추적 (nf_conntrack 커널 모듈)이라는 것이 있습니다. 이는 합법적인 것으로 보이는 SYN 패킷을 사용하지 않는 거의 모든 TCP 기반 DDoS 공격을 완화하는 데 도움이 될 수 있습니다.

여기에는 가짜 TCP 플래그를 사용하는 모든 유형의 ACK 및 SYN-ACK DDoS 공격과 DDoS 공격이 포함됩니다.

우리는 이미 5 개의 간단한 iptables 규칙으로 시작하여 많은 TCP 기반 DDoS 공격을 차단할 것입니다.


잘못된 패킷 차단

iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP

이 규칙은 SYN 패킷이 아니며 설정된 TCP 연결에 속하지 않는 모든 패킷을 차단합니다.


SYN이 아닌 새 패킷 차단

iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
이렇게하면 새 패킷 (설정된 연결에 속하지 않음)이 모두 차단되고 SYN 플래그는 사용되지 않습니다. 이 규칙은 "잘못된 패킷 차단" 규칙과 유사하지만 다른 패킷이 포착하지 않는 패킷을 발견합니다.

흔하지 않은 MSS 값 차단
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
위의 iptables 규칙은 공통적이지 않은 TCP MSS 값을 사용하는 새로운 패킷을 차단합니다 (SYN 패킷 만 이전 두 규칙에 따라 새 패킷이 될 수 있음). 이렇게 하면 벙어리 SYN 플러드를 차단하는 데 도움이됩니다.

가짜 TCP 플래그가있는 패킷 차단

iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

위의 룰셋은 가짜 TCP 플래그(합법적인 패킷이 사용하지 않는 TCP 플래그)를 사용하는 패킷을 차단합니다.

개인 서브넷의 패킷 차단 (스푸핑)

iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
이러한 규칙은 개인 (로컬) 서브넷에서 생성 된 스푸핑 된 패킷을 차단합니다. 공용 네트워크 인터페이스에서 일반적으로 개인 원본 IP로부터 패킷을 수신하지 않으려 고합니다.

이 규칙은 루프백 인터페이스가 127.0.0.0/8 IP 공간을 사용한다고 가정합니다.

이 다섯 가지 규칙만으로도 매우 높은 패킷 속도에서 많은 TCP 기반 DDoS 공격을 차단할 수 있습니다.

위에서 언급 한 커널 설정과 규칙을 사용하면 회선 속도로 ACK 및 SYN-ACK 공격을 필터링 할 수 있습니다.

추가 규칙

iptables -t mangle -A PREROUTING -p icmp -j DROP

이렇게하면 모든 ICMP 패킷이 삭제됩니다. ICMP는 호스트가 아직 살아 있는지를 핑 (ping)하는 데에만 사용됩니다. 일반적으로 필요하지 않으며 공격자가 악용 할 수있는 또 다른 취약점만을 나타 내기 때문에 Ping of Death (ping flood), ICMP flood 및 ICMP fragmentation flood를 완화하기 위해 모든 ICMP 패킷을 차단합니다.

iptables -A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset

이 iptables 규칙은 연결 공격에 도움이됩니다. 연결이 80 개 이상인 호스트의 연결을 거부합니다. 문제가 발생할 경우 제한을 늘려야합니다. 이는 많은 수의 TCP 연결을 설정하는 합법적 인 클라이언트에게 문제를 일으킬 수 있기 때문입니다.

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP

클라이언트가 초당 설정할 수있는 새로운 TCP 연결을 제한합니다. 이것은 연결 공격에 유용 할 수 있지만 일반적으로 SYN 홍수에 대해서는 그다지 많지 않습니다. 왜냐하면 일반적으로 끝없이 다른 스푸핑 된 소스 IP를 사용하기 때문입니다.

iptables -t mangle -A PREROUTING -f -j DROP

이 규칙은 단편화 된 패킷을 차단합니다. 일반적으로 UDP는 필요하지 않으며 UDP 단편화를 완화합니다. 하지만 대부분의 시간 동안 UDP 조각화는 네트워크 카드의 용량을 소모 할 수있는 많은 양의 대역폭을 사용합니다.이 규칙은 선택 사항이며 아마도 가장 유용하지는 않습니다.

iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP

이것은 들어오는 TCP RST 패킷을 제한하여 TCP RST 플러드를 완화합니다. 이 규칙의 효과는 의문의 대상입니다.


SYNPROXY로 SYN 홍수를 완화하십시오

SYNPROXY는 Linux 커널 버전 3.12 및 iptables 1.4.21에 추가 된 iptables의 새로운 대상입니다. CentOS 7은이 기능을 백 포트하고 3.10 기본 커널에서 사용할 수 있습니다.

SYNPROXY의 목적은 SYN 패킷을 보낸 호스트가 실제로 전체 TCP 연결을 설정하는지 또는 SYN 패킷을 보낸 후에 아무 것도 수행하지 않는지 확인하는 것입니다.

아무것도 수행하지 않으면 성능에 미치는 영향을 최소화하면서 패킷을 버립니다.

위에서 제공 한 iptables 규칙은 대부분의 TCP 기반 공격을 차단하지만 SYN 홍수만큼 정교 해지면 여전히 공격 유형을 통과 할 수 있습니다.

패킷 길이 (-m 길이), TOS (-m tos), TTL (-m ttl) 또는 문자열과 같이 차단할 특정 패턴이나 서명을 발견하면 규칙의 성능이 항상 향상된다는 점에 유의해야합니다 및 16 진수 값 (고급 사용자의 경우 -m 문자열 및 -m u32)

그러나 드물기는하지만 가능하지 않거나 달성하기가 쉽지 않은 경우도 있습니다. 따라서 이러한 경우 SYNPROXY를 사용할 수 있습니다.

다음은 다른 규칙을 우회하는 SYN 플러드를 완화하는 데 도움이되는 iptables SYNPROXY 규칙입니다.

SYNPROXY IPtables 규칙
아래 단추 중 하나를 사용하여 SYNPROXY 규칙의 잠금을 해제하십시오.
처럼
짹짹
+1
오류

이 규칙은 모든 포트에 적용됩니다. 활성화 된 특정 TCP 포트에서만 SYNPROXY를 사용하려면 (권장 - 또한 mangle 테이블과 PREROUTING 체인을 사용하여 사용하지 않는 모든 TCP 포트를 차단해야 함) 각 규칙에 -dport 80을 추가하면됩니다 포트 80에서만 SYNPROXY를 사용하려는 경우.

SYNPROXY가 작동하는지 확인하려면 -n1 cat / proc / net / stat / synproxy 명령을 사용하십시오. SYNPROXY를 사용하는 포트에 대해 새 TCP 연결을 설정할 때 값이 변경되면 작동합니다.


The Complete IPtables Anti-DDoS Rules

이 기사에서 설명한 각 단일 규칙을 복사하여 붙여 넣지 않으려면 Linux 서버의 기본 DDoS 보호를 위해 아래의 규칙 집합을 사용할 수 있습니다.

### 1: Drop invalid packets ### 
/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP  

### 2: Drop TCP packets that are new and are not SYN ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP 
 
### 3: Drop SYN packets with suspicious MSS value ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP  

### 4: Block packets with bogus TCP flags ### 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP 
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP  

### 5: Block spoofed packets ### 
/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP  

### 6: Drop ICMP (you usually don't need this protocol) ### 
/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP  

### 7: Drop fragments in all chains ### 
/sbin/iptables -t mangle -A PREROUTING -f -j DROP  

### 8: Limit connections per source IP ### 
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset  

### 9: Limit RST packets ### 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

### 10: Limit new TCP connections per second per source IP ### 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP  

### 11: Use SYNPROXY on all ports (disables connection limiting rule) ### 
# Hidden - unlock content above in "Mitigating SYN Floods With SYNPROXY" section

Bonus Rules

다음은 Linux 서버의 전반적인 보안을 향상시키는 데 유용한 iptables 규칙입니다.

### SSH brute-force protection ### 
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set 
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP  

### Protection against port scanning ### 
/sbin/iptables -N port-scanning 
/sbin/iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN 
/sbin/iptables -A port-scanning -j DROP

결론

이 튜토리얼은 iptables를 사용하여 DDoS 공격을 막는 가장 강력하고 효과적인 방법을 보여줍니다.

우리는 iptables 규칙을 사용하여 초당 수백만 패킷으로 정점에 도달 한 DDoS 공격을 성공적으로 완화했습니다.

우리가 조사한 동일한 주제에 대한 모든 가이드는 DDoS 트래픽을 막을 수있는 비효율적 인 방법이나 iptables 규칙의 제한된 수를 제공했습니다.

정확하게 사용된다면, iptables는 1GigE NIC의 회선 속도와 10GigE NIC의 회선 속도에 가까운 DDoS 공격을 차단할 수있는 매우 강력한 도구입니다.

iptables의 힘을 과소 평가하지 마십시오!







DNS 트래픽이 유난히 높을 때

리눅스/해킹

Cent-OS 6.4 를 새로 설치하고 테스트 하던 중

Out-bound traffic 이 주기적으로 높아지는 걸  발견

iftop (또는 iptraf)로 트래픽의 주범을 찾아 보니 UDP 53번 포트 (DNS)

DNS  Attack 의 일종이다.

막는 방법은 아래와 같다.


IPTables 에 다음 라인을 추가한다.

-I INPUT -p udp --dport 53 -m string --from 40 --to 51 --algo bm --hex-string '|04706b7473046173696100|' -j DROP -m comment --comment "DROP DNS Q pkts.asia"

-A INPUT -p udp -m udp --dport 53 -m state --state NEW -m recent --set --name DEFAULT --rsource

-A INPUT -p udp -m udp --dport 53 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 --name DEFAULT --rsource -j DROP




/tmp 디렉토리 suid 불가능하도록 마운트 하기

리눅스/해킹
이번 해킹 사건으로 더 이상 해킹에 대해 무관심 해서는 안될 거 같다는 교훈을 ...

찾아 보니 /tmp 는 아무나 쓰기 권한이 있으므로 해킹 임시 파일 저장고로 주로 이용된다.

따라서 이 디렉토리에 suid 권한이 없도록 마운트 할 것을 권장한단다.
 

아래는 기존 시스템에 /tmp 를 nosuid 로 마운트 하는 법
 

190Mb partition을 생성
#cd /dev/; dd if=/dev/zero of=tmpMnt bs=1024 count=200000
파티션을 포맷

#mke2fs /dev/tmpMnt

기존 데이터를 백업

#cp -Rp /tmp /tmp_backup

새로운 파티션을 마운트

#mount -o loop,noexec,nosuid,rw /dev/tmpMnt /tmp
권한 설정
#chmod 0777 /tmp
기존 데이터를 다시 리턴
#cp -Rp /tmp_backup/* /tmp/

다음 부팅 때를 위하여 /etc/fstab 에 다음 라인 추가

/dev/tmpMnt /tmp ext2 loop,noexec,nosuid,rw 0 0

 
/var/tmp 디렉토리를 삭제하고 심볼릭 링크를 걸어 줌

#rm -rf /var/tmp/
#ln -s /tmp/ /var/

완료...

이제 백업된 디렉토리를 지워 주자

#rm -rf /tmp_backup


제로보드 보안 취약성 때문에 Eggdrop 이 설치 되었을 때

리눅스/해킹


10년 된 리눅스 서버가 해킹을 당해서 루트킷 설치까지 되어 버렸는 지라...

워낙 오래된 녀석이라...해결 방안이 막막해서

 

CentOS 5.2 로 다시 설치

 

운영하고 2주 정도 지나니 다시 해킹당해 버렸다는...

다행이 OS 자체의 보안까지 뚫린 건 아니어서...

 

증상은 /tmp 에 cmdtemp 파일이 만들어 지고 perl 스크립트가 계속 실행이 되는 증상

 

일단 제로보드 보안 취약성 패치를 찾아서 lib.php 를 비롯 취약성을 패치 하고

아래 명령으로 변경된 파일을 찾아 보았다.

 

find . -name "__zbSessionTMP" -prune -o -name "*.php" -exec egrep 'cmdtemp'  -l {} \;

 

찾아 보니 제로보드의 결함을 뚫고 view_list_main.php 라는 파일을 만들고

이 파일을 호출하면 이 파일이 /tmp/cmdtemp 를 만들어

perl 스크립트를 실행하는 구조로 되어 있었음..

 

일단 위 파일도 지우고 로그에서 위 파일을 호출하는 IP대역을 막아서 더 이상 접근 불가능하게 처리

IP를 찾아 보니 인도네시아 여서 아예 범위로 차단하기 위해서

/etc/sysconfig/iptables 파일에 아래 라인 차단

-A INPUT -p all -m iprange --src-range 114.58.0.0-114.58.255.255 -j DROP

 

이제 안심해도 되려는 지....