[server] UFW로 속도 제한 : 설정 한계

UFW의 매뉴얼 페이지는 iptables 속도 제한을 설정할 수 있다고 언급합니다.

ufw는 연결 속도 제한을 지원하여 무차별 대입 로그인 공격을 방지하는 데 유용합니다. IP 주소가 지난 30 초 동안 6 개 이상의 연결을 시도한 경우 ufw는 연결을 거부합니다. 자세한 내용은 http://www.debian-administration.org/articles/187 을 참조하십시오. 일반적인 사용법은 다음과 같습니다.

     ufw limit ssh/tcp

불행히도 이것은 내가 찾을 수있는 모든 문서입니다. 나는 UFW를 고수하고 더 복잡한 iptables 명령을 사용하지 않기를 원합니다 ( “복잡한”상태를 유지하기 위해).

ufw를 사용하여 포트 80에서 들어오는 모든 트래픽을 30 초마다 20 개에서 20 개의 연결로 제한하려면 어떻게해야합니까? 포트 30000 ~ 30005에 대해 속도 제한을 어떻게 비활성화합니까? 모든 포트에 기본적으로 속도 제한이 활성화되어 있습니까?



답변

UFW는 “단순화”되도록 설계되었으므로이 경우 연결이 제한되는 속도의 세부 사항을 제어 할 수 없습니다. UFW의 Python 소스를 파고 싶다면 그것을 조정하는 방법을 찾을 수 있습니다. 적절한 정보는 (Ubuntu 10.04 시스템)에 있습니다./usr/share/pyshared/ufw/backend_iptables.py

따라서 타이밍 문제를 제쳐두고 다음은 신속한 질문에 대한 답변입니다.

  1. 10.10.10.0/24가 로컬 네트워크라고 가정하면 기본 제한 규칙이 포트 80 / tcp 수신에 적용됩니다.

    ufw limit proto tcp from any port 80 to 10.10.10.0/24
    
  2. 3. 속도 제한은 기본적으로 켜져 있지 않습니다. 원하는 범위를 제외한 모든 (대상) 포트에 추가하려면이 규칙을 사용하십시오. 규칙 (범위 포함)은 원자 단위이며 분할 할 수 없습니다. 예를 들어, 포트에 대한 규칙을 추가 한 다음 delete특정 범위에 대한 (존재하지 않는) 규칙을 추가하여 제거 할 수 없습니다. limit에 대한 인수도 허용되지 않습니다 ufw default.

    ufw limit from any to any port 0:29999,30006:65535
    

답변

이전 게시물에서 언급했듯이 user.rules를 사용자 정의 할 수 있습니다. 6 초 동안 최대 12 개의 연결로 SMTP 연결 속도 제한이 필요합니다. 먼저 아래 표시된 규칙을 추가했습니다. 참고 : 기본적으로 30 초에 6을 허용하는 제한 규칙이 추가됩니다.

ufw limit smtp

그리고 아래와 같이 /lib/ufw/user.rules를 편집했습니다 (이 파일의 사용자 정의 사본을 다른 많은 조정과 함께 유지합니다) …

### tuple ### limit tcp 25 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --set
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --update --seconds 6 --hitcount 12 -j ufw-user-limit
-A ufw-user-input -p tcp --dport 25 -j ufw-user-limit-accept


답변

/lib/ufw/user.rules에있는 ufw 규칙 파일에서 속도 제한을 변경할 수 있습니다. 기본적으로 모든 포트에 대해 사용 가능한 제한이 없습니다. 모든 포트를 수동으로 추가하거나 user.rules 파일을 편집하여 추가해야합니다.


답변

ufw의 LIMIT 기능을 사용하여 의도하지 않은 결과를 지적하는 것이 좋습니다.

첫 번째 ufw 규칙으로 포트 22 / tcp에 블랭킷 제한을 설정했다고 가정합니다.

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     LIMIT IN    Anywhere
...

ufw 규칙을 따르고 마지막으로 “deny (들어오는)”의 기본 정책에 따라 제한 아래에서 작동하는 모든 연결을 필터링 할 수 있다고 가정합니다.

적어도 ufw 0.35의 경우 그 가정은 틀릴 것입니다. 실제로 LIMIT IN 로직은 한계 기준에 의해 거부되지 않은 입력을 즉시 받아들입니다.

의사 코드에서 LIMIT 논리는

if CONDITION then DENY else ACCEPT

다른 ufw 규칙에는 논리가있는 것처럼 보입니다.

if CONDITION then (DENY|ACCEPT) else continue to next rule.

나는 개인적으로 ufw LIMIT의 예기치 않은 동작이라는 것을 알았습니다. 시스템 로그 파일에서 다른 ufw 규칙에 의해 필터링되어 발생해서는 안되는 많은 포트 22 로그인 시도를 예기치 않게 발견하여 발견했습니다.

행동 확인의 세부 사항

ufw가 삽입 한 관련 iptables 코드 행은 다음과 같습니다.

-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit
-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT

위 목록은

iptables -S | grep ufw-user-limit

처음 두 줄은 연속되어 ufw-user-input있습니다.

iptables -S | grep ufw-user-input


답변