iptables 규칙 설명

iptables 규칙 설명

나는 DoS 공격으로부터 어느 정도 보호를 제공할 웹 서버의 iptables를 업데이트하기를 바라고 있습니다.

1) 네트워크 트래픽과 관련하여 제가 찾은 iptables 규칙은 다음과 같습니다.

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT

처음 두 규칙을 이해할 수 있습니다. 누군가 마지막 두 규칙을 명확히 할 수 있습니까? 마지막 2개의 규칙을 적용하면 규칙 1은 분당 50개의 새 연결만 허용한다는 의미입니까? 익스트림 버스트의 기능은 무엇인가요? 나는 그것에 대해 읽으려고 노력합니다. 그러나 내가 명확하게 이해하고 있는지 확신할 수 없습니다. 이는 분당 200개의 새 연결을 허용하면 분당 50개의 새 연결로만 제한된다는 의미입니까? 추가 새 연결 요청은 삭제됩니다. 200개의 새로운 요청 폭증은 언제 다시 허용됩니까?

자, 마지막 규칙은 무엇을 의미합니까? 초당 50명의 사용자만 내 웹 서버에 연결할 수 있습니까? 여기서 버스트 횟수가 왜 다시 동일한 50인가요? 마지막 두 규칙을 기반으로 일부 합법적인 트래픽을 삭제하는 것이 가능합니까?

2) 포트 스캔을 차단하기 위해 여러 곳에서 참조되는 다음과 같은 규칙 세트를 발견했습니다. 맞는 것 같나요? 이것이 무엇인지 설명할 수 있는 사람이 있나요? 마지막 4개 규칙의 논리와 dport가 139인 이유에 대해 잘 모르겠습니다.

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

답변1

limit확장은 토큰 버킷 메커니즘을 구현합니다. 일반적으로 netfilter는 규칙이 일치할 때 제공된 대상( ACCEPT이 경우)으로 점프합니다. 확장을 삽입하면 limitnetfilter는 점프가 허용되기 전에 규칙의 "버킷"에서 "토큰"을 제거해야 합니다. 이 확장은 규칙이 일치하더라도 버킷에 토큰이 없으면 netfilter가 점프하는 것을 방지합니다.

--limit 50/minute #tells netfilter to add 50 tokens per minute to the bucket
--limit-burst 200 #tells netfilter to use a bucket which holds up to 200 tokens

분당 50개 이상의 연결 요청이 있는 경우 서버는 분당 50개의 새로운 연결을 허용합니다. 1분당 요청이 50개 미만인 경우 버킷이 채워집니다(실제로는 처음부터 가득 차게 됩니다). 즉, 1분에 요청이 몇 개만 있어도 다음 분에는 서버가 50개 이상의 새 요청을 수락합니다. 이를 통제할 수 없게 되는 것을 방지하기 위해 버킷이 보유할 수 있는 토큰 수에 제한이 있습니다. 이 경우에는 200입니다. 버킷이 가득 차면 서버는 동시에 서버에 액세스하더라도 다음 200개의 수신 연결을 수락합니다. 50개가 넘으므로 허용되는 연결 수가 원하는 50개를 넘어 급증하는 것을 버스트라고 부릅니다.평균.

두 번째 규칙은 netfilter가 인식하는 흐름에 속하는 한 시스템이 추가 조사 없이 즉시 50개의 IP 패킷을 수락한다는 것을 의미합니다. 이 규칙의 효과를 측정하려면 전체 체인(및 참조하는 모든 체인과 참조하는 모든 체인)을 살펴봐야 합니다. 하지만 제가 드릴 수 있는 말씀은 다음과 같습니다.

  1. Netfilter는 TCP 연결 개시자의 ACK를 데이터 패킷으로 처리하여 핸드셰이크를 완료합니다 RELATED. 분당 50개의 성공적으로 설정된 연결은 문제의 두 번째 규칙을 완전히 충족합니다.

  2. 가장 일반적인 TCP 구현은 포기하기 전에 4번의 연결 시도를 합니다. 50개의 성공적인 연결이 설정된 후 최악의 경우 200개의 연결 요청을 받게 됩니다.

  3. 엔드포인트가 특정 연결 요청을 얼마나 자주 하는지는 중요하지 않으며 단지 합리적인 시간 내에 연결이 성공적으로 설정되면 됩니다. 대부분의 구현에서는 합리적인 기본 시간으로 60초를 사용합니다.

마지막 규칙이 라면 50/minute이 네 가지 규칙은 정말 멋진 DoS 보호 프레임워크의 일부가 될 수 있습니다. --dport 80필터가 없기 때문에 50/second다음과 같이 추측할 수 있습니다.

a) 이 문장을 문맥에서 완전히 벗어나서 취하셨으며 처음 세 문장과 직접적인 관련이 없습니다.

b) 이는 트래픽 속도 저하에 대한 일반적인 상한선입니다.

c) 이것은 실수입니다. 그러나 그래야 합니다 50/minute.

d) 이는 DoS 공격으로부터 서버를 보호하는 것과 DoS 공격 도중 및 이후에 서비스 액세스를 유지하는 것 사이의 균형입니다.

recent두 번째 코드 조각을 이해하려면 먼저 확장 프로그램이 소스 IP 주소에 대한 지식을 사용하고 유지하는 방법을 확실히 이해해야 합니다 .

확장 recent프로그램은 지식을 목록으로 관리합니다. 기본 목록은 이름이 지정되며 DEFAULT다른 목록이 제공되지 않는 경우 사용됩니다. 하나는 를 사용하여 또 다른 목록을 제공합니다 --name.

portscan따라서 처음 두 규칙은 "소스 IP가 지난 86400초 내에 목록에 있었던 경우 이 패킷을 삭제합니다"를 의미합니다.

마지막 두 규칙은 "이 IP 주소를 목록에서 제거 portscan"를 의미합니다. 이 규칙은 이전 규칙이 일치하지 않는 경우에만 평가됩니다. 이 규칙은 목록을 portscan짧게 유지하기 위해 존재합니다. 목록이 길수록 검색 시간도 길어집니다.

마지막 네 가지 규칙은 소스 IP를 portscan목록에 넣고 IP와 DROP패킷을 기록합니다. --dport 139이 동작은 이 경우에만 필요하기 때문입니다. 나는 이러한 규칙이 문맥상 더 의미가 있다고 확신합니다. 왜냐하면 이것은 포트 스캔을 방지하기 위한 완전한 규칙 세트가 아니기 때문입니다.

관련 정보