Sun Java System Messaging Server 6.3 관리 설명서

19장 MeterMaid를 사용하여 받는 연결 억제

MeterMaid는 IP 주소 SMTP 봉투 주소 모니터링 등을 통해 연결과 트랜잭션의 중앙 집중식 측정 및 관리를 수행할 수 있는 서버입니다. 기능적으로 MeterMaid는 특정 IP 주소가 MTA와 연결 가능한 빈도를 제한할 때 사용할 수 있습니다. 특정 IP 주소와의 연결을 제한하는 기능은 서비스 거부 공격에 사용되는 과도한 연결을 방지하는 데 유용합니다. MeterMaid는 conn_throttle.so와 비슷한 기능을 제공하면서 이를 대체하지만 Messaging Server 설치 전체에 걸쳐 그 기능을 확장합니다. conn_throttle.so의 기능을 새롭게 향상시킬 계획은 없으며, MeterMaid로 대체하는 것이 더 효과적입니다.

이 절은 다음과 같은 하위 절로 구성되어 있습니다.

19.1 기술 개요

conn_throttle.so는 특정 IP가 최근에 너무 자주 연결되어 잠시 무시할 필요가 있는 시점을 확인하기 위해 받는 연결의 메모리 내장 테이블을 사용하는 MTA 매핑 테이블의 콜아웃으로 쓰이는 공유 라이브러리입니다. 메모리 내장 테이블을 사용하면 성능에 도움이 되지만, 각 서버의 개별 프로세스가 자체 테이블을 유지하기 때문에 비용이 커집니다.

대부분의 경우 conn_throttle.so 콜아웃은 각 시스템의 단일 프로세스인 디스패처에서 액세스하는 PORT_ACCESS 매핑으로 수행됩니다. 서버 당 별도의 테이블이 있는 것 외에는 비용이 없습니다.

MeterMaid로 인해 주로 향상된 부분은 Messaging Server 환경의 모든 시스템과 프로세스에서 액세스할 수 있는 단일 억제 정보 저장소를 MeterMaid가 유지한다는 점입니다. MeterMaid는 계속해서 메모리 내장 데이터베이스에 데이터를 저장하여 성능을 극대화합니다. MeterMaid를 다시 시작하면 이전에 저장한 정보가 모두 손실되지만 보통 데이터의 수명이 매우 짧기 때문에 다시 시작하는 경우(거의 수행되지 않음)에 발생하는 비용은 매우 적습니다.

19.2 작동 원리

MeterMaid의 구성은 msg.conf에 저장되며 configutil에서 유지 관리됩니다.

MTA에서 check_metermaid.so를 사용하면 매핑 테이블 콜아웃을 통해 MeterMaid에 액세스할 수 있습니다. 이 기능은 어느 *_ACCESS 테이블에서나 호출할 수 있습니다. PORT_ACCESS 테이블에서 호출한 경우에는 연결의 IP 주소를 기반으로 제한을 확인하는 데에 사용할 수 있습니다. 이 방법은 오래된 conn_throttle.so를 대체하여 MeterMaid를 구현하는 경우에 가장 흔히 사용되는 방법입니다. 다른 *_ACCESS 테이블에서 호출하는 경우 MeterMaid는 봉투 발신 또는 봉투 수신 주소와 IP 주소 등의 다른 데이터를 제한하는 데에도 사용할 수 있습니다.

check_metermaid.so에는 시작점이 하나만 정의됩니다. throttle 루틴에서는 MeterMaid에 연결하고 쉼표로 구분된 두 후속 인수를 제공합니다. 첫 인수는 데이터 검사 기준으로 사용할 테이블의 이름이며, 둘째 인수는 검사할 데이터입니다.

검사 결과 확인된 특정 데이터가 해당 테이블에서 할당량을 초과한 것이 밝혀지면 check_metermaid.so에서 매핑 엔진이 입력을 계속 처리할 수 있도록 "success"를 반환합니다. 그 후에 항목의 나머지 부분을 사용하여 할당량을 초과한 이 연결을 처리합니다.


PORT_ACCESS

  *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E
  *|*|*|*|* $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,tablename,$3]$N421$ \
Connection$ declined$ at$ this$ time$E
  *          $YEXTERNAL

매핑 테이블 항목에서 check_metermaid.so 호출 앞에 있는 $:A 플래그 테스트에 주의하십시오. 디스패처에서 검사에 A 플래그를 설정하면서 PORT_ACCESS를 확인할 때 MeterMaid 검사만 수행하기 위한 것입니다.

19.3 MeterMaid의 Configutil 매개 변수

MeterMaid의 구성은 msg.conf에 저장되며 configutil에서 유지 관리됩니다. 다음은 현재 MeterMaid에서 지원하는 설정입니다. 기본값은 괄호 안에 있습니다. MeterMaid 매개 변수의 전체 목록은 Sun Java System Messaging Server 6.3 Administration Referenceconfigutil Parameters를 참조하십시오.

이 설정은 check_metermaid 클라이언트에서 사용됩니다.

마지막으로, 억제 테이블은 표시된 것과 같이 msg.conf에도 정의됩니다. 각 구성 매개 변수에 있는 *는 정의되는 특정 테이블의 이름을 나타냅니다. 예를 들어, internal이라는 테이블의 경우 첫 매개 변수는 metermaid.table.internal.data_type이 됩니다.

19.4 과도한 IP 주소 연결을 Metermaid를 사용하여 제한—예

이 예에서는 MeterMaid를 사용하여 분당 10개 연결로 IP 주소를 억제합니다. 참고로, 매핑 파일에서 이와 동일한 conn_throttle.so 설정은 다음과 같습니다.


PORT_ACCESS
   *|*|*|*|*  $C$|INTERNAL_IP;$3|$Y$E
   *|*|*|*|*  $C$[/opt/SUNWmsgsr/lib/conn_throttle.so,throttle,$3,10]\
$N421$ Connection$ declined$ at$ this$ time$E
   *          $YEXTERNAL

PORT_ACCESS 매핑 테이블은 외부 연결의 경우 분당 10개 이하의 속도로 제한하도록 conn_throttle.so를 구현합니다.

두 기술의 근본적인 차이점 중 하나는 MeterMaid가 억제를 위해 속도 제한과 같은 세부 정보를 직접 매핑 테이블에 구성하지 않고 configutil 매개 변수를 이 설정에 사용한다는 것입니다. 이 예에 대해서는 아래에서 설명합니다.

  1. 시스템 중 하나를 MeterMaid 서버 호스트로 지정합니다.

    이 시스템에서 다음 configutil 매개 변수를 설정합니다.


    local.metermaid.enable -v TRUE 

    클라이언트와 MeterMaid 서버 간의 통신을 확인하는 데 사용되는 인증 비밀번호를 설정합니다.


    configutil -o metermaid.config.secret -v password
    
  2. 억제 테이블을 정의합니다.

    MeterMaid의 억제 동작은 작동 특성을 정의하는 명명된 억제 테이블에 의해 결정됩니다. 분당 10개 연결의 속도로 억제하는 테이블을 정의하려면 다음 매개 변수를 설정합니다.


    configutil -o metermaid.table.ext_throttle.data_type -v ipv4
    configutil -o metermaid.table.ext_throttle.quota -v 10

    ext_throttle은 억제 테이블의 이름입니다. ipv4는 데이터 유형 Internet Protocol 버전 4 주소 표현입니다. 10은 할당량(연결 한도)입니다.

  3. MeterMaid 시스템에서 MeterMaid를 시작합니다.


    # start-msg metermaid
  4. MTA가 MeterMaid를 사용하여 억제를 수행하는 시스템에서 MeterMaid 호스트와 비밀번호를 지정합니다.

    이는 필수 항목입니다.


    configutil -o metermaid.config.secret -v MeterMaid_Password
    configutil -o metermaid.config.serverhost -v name_or_ipaddress_of_MetermaidHost
    
  5. MeterMaid PORT_ACCESS 테이블을 설정합니다.

    이 테이블은 동등한 conn_throttle.so 설정과 비슷합니다.


    PORT_ACCESS
    
       *|*|*|*|*  $C$|INTERNAL_IP;$3|$Y$E
       *|*|*|*|*  $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,\
    ext_throttle,$3] $N421$ Connection$ declined$ at$ this$ time$E
       *          $YEXTERNAL

    첫 번째 행은 연결을 시도하는 IP 주소가 내부 주소인지 확인합니다. 내부 주소인 경우 연결을 허용합니다. 두 번째 행은 MeterMaid를 통해 IP 주소를 실행하며, 너무 자주 연결한 경우 연결을 거부합니다. 세 번째 행은 그 밖의 다른 연결을 허용하지만 EXTERNAL이라는 플래그를 지정합니다.

    check_metermaid.so에 대한 이 호출은 conn_throttle.so에 대한 콜아웃과 유사합니다. check_metermaid.so의 함수가 동일합니다. throttle과 해당 인수는 단지 metermaid.tabletablename을 사용하여 구성한 테이블 이름과 검사할 IP 주소($3)입니다. conn_throttle.so처럼 이 함수도 metermaid.table.ext_throttle.quota에서 지정한 한도에 도달하면 success를 반환합니다. 따라서 매핑 항목 행의 나머지가 처리될 수 있으며, 원격 SMTP 클라이언트에게 메시지(421 SMTP 코드, 임시 부정 완료, 이 시점에 허용되지 않는 연결)가 보내지고 디스패처는 연결 종료를 지시받습니다.

    $:A 때문에 이 행은 디스패처로부터 호출되는 경우에만 처리됩니다. 이 설정이 없으면 check_metermaid.so에 대한 호출은 PORT_ACCESS 매핑 테이블 검사도 수행하는 tcp_smtp_server프로세스의 컨텍스트에서도 발생합니다. 따라서 MeterMaid는 받는 연결 각각을 두 번씩 계산합니다.

이는 conn_throttle.so를 대체하도록 MeterMaid를 설정하는 기본 구성입니다. 이 항목에 대한 자세한 내용은 10.3.2 매핑 작업 18.3.4 PORT_ACCESS 매핑 테이블을 참조하십시오.

19.4.1 기타 유용한 MeterMaid 옵션

경우에 따라서는 두 가지 추가 구성 옵션이 유용할 수 있습니다. conn_throttle.so 공유 라이브러리에는 throttle_p 함수도 있습니다. 이 함수는 기본 60초를 넘은 기간 동안 결과를 적용하여 한도를 초과한 연결을 축소합니다. MeterMaid에서도 MeterMaid 서버 시스템에 다음 옵션을 구성하여 이와 동일한 동작을 사용할 수 있습니다.


configutil -o metermaid.table.ext_throttle.options -v penalize

그러면 metermaid.table.ext_throttle.quota에 설정된 값을 초과하는 연결 시도에 대해 연결을 축소할 수 있도록 ext_throttle 테이블의 동작이 변경됩니다.

또 다른 옵션은 많은 수의 연결을 수신하는 시스템과 관련 있습니다. MeterMaid는 분산 MTA 환경 전반에 걸쳐 연결 추적이 가능하므로, MeterMaid의 내부 메모리 내장 데이터베이스에 보존되는 연결 수 제한이 MTA 환경의 전체 볼륨에 충분하지 않을 수 있습니다. 기본값은 테이블당 1000개 항목이지만, MTA 환경 전체에 걸쳐 분당 연결 1000개를 초과할 것으로 예상된다면 다음 구성 옵션을 통해 이 값을 늘릴 수 있습니다.


configutil -o metermaid.table.ext_throttle.max_entries -v max_entries

60초 동안 max_entries에 도달하더라도 MeterMaid는 가장 오래되고 덜 쓰인 항목을 자동 삭제합니다. 따라서 더 자주 연결되는 시스템은 MeterMaid 테이블에 남아 계산에 포함되므로 효과적인 억제를 수행하기에 충분한 정보가 유지됩니다.