약 1 백만 개의 IP 주소를 블랙리스트에 IPtables 또는 null route를 사용합니까?


22

클라이언트가 1 백만 개 미만의 개별 IP 주소 (서브넷 없음) 집합을 블랙리스트에 추가해야하는 상황을 겪어 왔으며 네트워크 성능이 중요합니다. IPTables 규칙이 경로보다 성능에 미치는 영향은 적다고 추측하지만 추측에 불과합니다.

누구든지 긴 IP 주소 목록을 블랙리스트에 올리는 솔루션으로 IPTables 또는 null 라우팅을 선호한다는 확실한 증거 나 다른 근거가 있습니까? 이 경우 모든 것이 자동화되므로 사용 편의성은 실제로 중요하지 않습니다.

26 년 11 월 11 일 수정

일부 테스트 및 개발 후 이러한 옵션 중 어느 것도 실행 가능한 것으로 보이지 않습니다. 경로 조회와 iptables 모두 규칙 세트를 통해 선형 검색을 수행하고이 많은 규칙을 처리하는 데 너무 오래 걸리는 것 같습니다. 최신 하드웨어에서 iptables 블랙리스트에 1M 항목을 넣으면 서버가 초당 약 12 ​​개의 패킷으로 느려집니다. 따라서 IPTables 및 null 경로가 없습니다.

ipset, 지미 헤드 먼 (Jimmy Hedman)이 추천 한대로 세트에서 65536 개가 넘는 주소를 추적 할 수 없다는 점을 제외하고는 훌륭 할 것입니다.

이 많은 IP를 차단하는 유일한 솔루션은 응용 프로그램 계층에서 인덱스 조회를 수행하는 것입니다. 그렇지 않습니까?


추가 정보 :

이 인스턴스의 사용 사례는 IP 주소의 "알려진 범죄자"목록이 웹 서버의 정적 컨텐츠에 액세스하는 것을 차단합니다. FWIW, Apache를 통한 차단 Deny from은 선형 스캔과 마찬가지로 느리게 진행됩니다.


참고 : 최종 작업 솔루션은 버클리 DB 맵과 함께 apache의 mod_rewrite를 사용하여 블랙리스트에 대한 조회를 수행하는 것이 었습니다. 버클리 DB의 인덱스 특성으로 인해 목록은 O (log N) 성능으로 확장 될 수있었습니다.


5
ipset ( ipset.netfilter.org )이 이러한 유형의 문제를 처리하도록 설계 되지 않았 습니까?
지미 헤드 먼

@JimmyHedman : 그 대답을해야합니다. 그리고이 모든 3 가지 방법 :)하고 벤치 마크에 대한 제안을 추가
MikeyB

해결하려는 문제에 대해 조금 더 자세한 정보를 제공 할 수 있는지 궁금합니다. 1M IP 주소를 차단하는 것이 문제를 해결하는 방법이 아닐까요?
SpacemanSpiff

이 많은 주소를 차단하려는 이유를 알고 INPUT 또는 FORWARD 트래픽을 필터링하려는 경우 많은 도움이됩니다.
Juliano

여기서 ipset이 iptables 규칙을 일반 iptables 규칙보다 약 11 배 빠르게 만드는 방법을 확인할 수 있습니다. daemonkeeper.net/781/mass-blocking-ip-addresses-with-ipset 이 도움이 되길 바랍니다.
Alien Torres

답변:


15

iptables를 사용하고 다중 레벨 트리를 작성하여 조회 수를 줄이십시오.

iptables -N rules_0_0_0_0_2
iptables -N rules_64_0_0_0_2
iptables -N rules_128_0_0_0_2
iptables -N rules_192_0_0_0_2
iptables -N rules_0_0_0_0_4
iptables -N rules_16_0_0_0_4

iptables -A INPUT -p tcp --dport 80 -s 0.0.0.0/2 -j rules_0_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 64.0.0.0/2 -j rules_64_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 128.0.0.0/4 -j rules_128_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 192.0.0.0/4 -j rules_192_0_0_0_2

iptables -A rules_0_0_0_0_2 -s 0.0.0.0/4 -j rules_0_0_0_0_4
iptables -A rules_0_0_0_0_2 -s 16.0.0.0/4 -j rules_16_0_0_0_4

등등-중첩 수준 추가; 분명히 규칙을 작성하는 자동 방법이 필요하며 하나 이상의 위반자가있는 네트워크에 대해서만 체인을 가져야합니다. 이러한 방식으로 상당히 많이 수행해야하는 조회 수를 줄일 수 있으며 실제로 작동합니다.


이것은 마치 방화벽 규칙 조회의 시간 복잡성을 O (n)에서 O (log n)으로 효과적으로 줄여서 iptables에 검색 트리를 효과적으로 구축하는 것처럼 작동합니다.
폰 Zweigbergk 당

이 경로를 사용하기로 결정한 경우 일부 알고리즘을 사용하여 IP 주소 목록에서 균형 잡힌 이진 검색 트리를 만든 다음 해당 검색 트리의 구조를 IPtables 규칙 집합으로 덤프하는 것이 유용 할 것입니다.
당 폰 Zweigbergk에

@Per von Zweigbergk-실제로 ... 또는 더 깊이 조회 할 필요가없는 초기에 나무를 정리합니다. 불경건 한 규칙을로드하는 데 많은 시간이 걸립니다.
pQd

이것은 매우 좋은 접근 방법입니다. 분명히 유지하려면 약간의 처리가 필요하지만 올바른 생각이라고 생각합니다.
tylerl

3
iptables 등의 이전 실패 후 @ pQd, Berkeley 데이터베이스와 함께 RewriteMap 을 사용하여 아파치에서 솔루션을 구현했습니다 . 그러나 루프에서 iptables를 사용하는 가장 빠른 메커니즘은 초당 약 100 규칙을로드하는 반면 iptables-restore는 전체 세트를 약 4 초 안에 수행했습니다. 이것은 최고의 데스크탑 컴퓨터에 있습니다. RewriteMap 메커니즘은 감지 할 수 없을 정도로 성능에 영향을 미칩니다.
tylerl

11

이것은 정확히 무엇 ipset을위한 것입니다.

웹 사이트 http://ipset.netfilter.org/에서 :

원한다면

  • 여러 IP 주소 또는 포트 번호를 저장하고 한 번에 iptables로 수집과 일치시킵니다.
  • 성능 저하없이 IP 주소 또는 포트에 대해 iptables 규칙을 동적으로 업데이트합니다.
  • 하나의 단일 iptables 규칙으로 복잡한 IP 주소 및 포트 기반 규칙 세트를 표현하고 IP 세트 속도의 이점

그러면 ipset이 적절한 도구 일 수 있습니다.

netfilter 핵심 팀 멤버 인 Jozsef Kadlecsik (REJECT 목표를 쓴 사람)이 작성했기 때문에 이것이 내가 생각할 수있는 최선의 선택입니다.

최신 커널에도 포함되어 있습니다.


내가 본 한 ipset은 65k IP 주소에서 최고입니다. 1M 항목을 처리 할 수있는 세트 유형이 있습니까?
tylerl

7
hash : ip 세트 유형을 사용하면 매우 많은 수의 주소를 가질 수 있습니다. 나는 1000000을 시도했고 성능은 꽤 좋았습니다. 세트를 확인하기 전에 -m state --state ESTABLISHED 규칙을 설정하면 많은 수의 패킷을 처리 할 때 성능을 향상시키는 새 연결에서만 세트를 확인할 수 있습니다.
Matthew Ife

1M 주소를 가진 ipset의 메모리 사용량이 커지기 시작한다고 언급 할 가치가 있습니다. netfilter 메일 링리스트의이 게시물에 따르면 ipset 해시 크기에 대한 현재 2015 공식 H * 40byte + (N/4 + N%4) * 4 * element size은 1.5m 슬롯 해시에서 1M 주소의 경우 약 64MB입니다. apache / berkdb 솔루션을 사용하면 데이터가 디스크에 저장되고 활성 주소의 페이지 만로드됩니다.
M Conrad

5

나는 이것을 직접 테스트하지는 않았지만 문제 설명을 들었을 때 나는 즉시 pfOpenBSD에서와 같이 " " 라고 생각했다 .

pf당신이 찾고있는 주소 테이블 의 개념을 가지고 있습니다.

내가 한 매우 객관적인 연구 에 따르면 이것이보다 확장 가능성이 더 큰 것 같습니다 ipset. 런타임 옵션에 대한 PF FAQ의 장에 따르면 튜닝없이 즉시 pf는 총 1,000 개의 테이블을 지원하며 기본적으로 모든 테이블에서 총 200,000 개의 항목을 지원합니다. (시스템에 100MB 미만의 실제 메모리가있는 경우 10 만). 이것은 어떤 종류의 유용한 수준에서 작동하는지 확인하기 위해 이것을 테스트하는 것이 좋습니다.

물론 Linux에서 서버를 실행한다고 가정하므로 OpenBSD 또는 FreeBSD와 같은 pf로 일부 OS를 실행하는 별도의 방화벽 상자가 있어야합니다. 모든 종류의 상태 저장 패킷 필터링을 제거하여 처리량을 향상시킬 수도 있습니다.


클라이언트의 서버 아키텍처를 BSD로 변환하는 것은 실제로 옵션이 아닙니다. 그래도 상자 밖에서 생각하기.
tylerl

2
전체 서버 아키텍처를 BSD로 변환하지 않아도 실제 서버 앞에 방화벽을 구축하는 것으로 충분합니다. (VM에서 할만 큼 쉬움.)
당 Zweigbergk에

2

FIB_HASH 대신 FIB_TRIE를 사용하여 조사한 적이 있습니다.

FIB_TRIE는 접두사 수에 비해 훨씬 확장 성이 좋아야합니다. (/ 32s null 경로는 여전히 접두사이며 매우 구체적입니다)

커널을 사용하려면 커널을 컴파일해야하지만 도움이됩니다.

FIB_TRIE 노트


2

후손의 경우 : ipset문서 에 따라 세트의 기본 크기는 65536이며 옵션으로 변경할 수 있습니다.

maxelem이 매개 변수는 모든 해시 유형 세트의 작성 명령에 유효합니다. 기본 65536 세트에 저장할 수있는 최대 요소 수를 정의합니다. 예 :ipset create test hash:ip maxelem 2048.

아직 댓글을 달 수 없기 때문에 여기에 넣었습니다.


1

앞으로이 문제를 우연히 발견하는 사람을위한 유용한 참고 사항 :

우선, 필요하지 않은 트래픽은 분석하지 마십시오. 예를 들어 TCP 트래픽을 차단하는 경우 SYN 패킷 만 필터링하면 연결 당 한 번만 필터에 도달합니다. -m state원하는 경우 사용할 수 있지만 연결 추적에는 자체 오버 헤드가 있으므로 성능에 문제가있는 경우 피할 수 있습니다.

둘째, iptables에 백만 개의 규칙을 적용하는 데 시간이 오래 걸립니다. 몇 분. 많은 엔티티를 추적해야하는 경우 아마도 netfliter에서 멀리하는 것이 가장 좋습니다. 규칙 세트의 크기가 큰 차이를 만듭니다.

셋째, 목표는 선형 스캔을 피하는 것입니다. 그러나 불행히도 iptables와 iproute2는 본질적으로 선형입니다. 이진 트리 스타일로 규칙을 여러 체인으로 나눌 수 있으므로 상담해야 할 규칙의 수를 제한 할 수 있지만 iptables는 이러한 규모의 문제에 적합하지 않습니다. 그것은 작동 하지만, 귀중한 자원의 낭비입니다.

넷째, 가장 중요한 것은 워크로드를 사용자 공간으로 푸시하는 것은 나쁜 생각이 아닙니다. 이를 통해 고유 한 코드를 작성하거나 문제 세트에 맞게 조정 된 상용 솔루션을 사용할 수 있습니다. 언급 한 바와 같이이 문제에 대한 나의 해결책은 아파치의 mod_rewrite 시스템을 통해 트리거 된 BDB 조회를 사용하는 것이 었습니다. 세션 당 하나의 조회 만 트리거 할 수 있고 유효한 요청이 제출 된 후에 만 ​​추가 이점이 있습니다. 이 경우 성능이 매우 빨랐으며 차단 목록 비용은 거의 무시할 수있었습니다.

-j QUEUE와 함께 대상 을 사용하여 iptables로 유사한 사용자 공간 조작을 수행 할 수 있습니다 libnetfilter_queue. 이 도구는 강력하고 단순하며 문서화가 잘되어 있지 않습니다. 공식 문서의 일부가 아닌 웹에 많은 흥미로운 자료가 흩어져 있기 때문에 가능한 한 많은 자료를 최대한 많이 읽는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.