MeterMaid는 IP 주소 SMTP 봉투 주소 모니터링 등을 통해 연결과 트랜잭션의 중앙 집중식 측정 및 관리를 수행할 수 있는 서버입니다. 기능적으로 MeterMaid는 특정 IP 주소가 MTA와 연결 가능한 빈도를 제한할 때 사용할 수 있습니다. 특정 IP 주소와의 연결을 제한하는 기능은 서비스 거부 공격에 사용되는 과도한 연결을 방지하는 데 유용합니다. MeterMaid는 conn_throttle.so와 비슷한 기능을 제공하면서 이를 대체하지만 Messaging Server 설치 전체에 걸쳐 그 기능을 확장합니다. conn_throttle.so의 기능을 새롭게 향상시킬 계획은 없으며, MeterMaid로 대체하는 것이 더 효과적입니다.
이 절은 다음과 같은 하위 절로 구성되어 있습니다.
conn_throttle.so는 특정 IP가 최근에 너무 자주 연결되어 잠시 무시할 필요가 있는 시점을 확인하기 위해 받는 연결의 메모리 내장 테이블을 사용하는 MTA 매핑 테이블의 콜아웃으로 쓰이는 공유 라이브러리입니다. 메모리 내장 테이블을 사용하면 성능에 도움이 되지만, 각 서버의 개별 프로세스가 자체 테이블을 유지하기 때문에 비용이 커집니다.
대부분의 경우 conn_throttle.so 콜아웃은 각 시스템의 단일 프로세스인 디스패처에서 액세스하는 PORT_ACCESS 매핑으로 수행됩니다. 서버 당 별도의 테이블이 있는 것 외에는 비용이 없습니다.
MeterMaid로 인해 주로 향상된 부분은 Messaging Server 환경의 모든 시스템과 프로세스에서 액세스할 수 있는 단일 억제 정보 저장소를 MeterMaid가 유지한다는 점입니다. MeterMaid는 계속해서 메모리 내장 데이터베이스에 데이터를 저장하여 성능을 극대화합니다. MeterMaid를 다시 시작하면 이전에 저장한 정보가 모두 손실되지만 보통 데이터의 수명이 매우 짧기 때문에 다시 시작하는 경우(거의 수행되지 않음)에 발생하는 비용은 매우 적습니다.
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 검사만 수행하기 위한 것입니다.
MeterMaid의 구성은 msg.conf에 저장되며 configutil에서 유지 관리됩니다. 다음은 현재 MeterMaid에서 지원하는 설정입니다. 기본값은 괄호 안에 있습니다. MeterMaid 매개 변수의 전체 목록은 Sun Java System Messaging Server 6.3 Administration Reference의 configutil Parameters를 참조하십시오.
local.metermaid.enable Watcher에서 MeterMaid를 시작하고 제어할 수 있도록 MeterMaid 데몬을 실행하는 시스템에서 이 설정을 yes로 설정해야 합니다.
logfile.metermaid.*. 이 설정은 IMAP, POP 및 기타 서비스에서 사용되는 것과 같습니다. 기본적으로 MeterMaid는 msg-svr-base/data/log/metermaid에 로그 파일을 기록합니다.
metermaid.config.listenaddr(INADDR_ANY ). MeterMaid를 바인드할 주소입니다. 대부분의 시스템에서는 기본값을 변경할 필요가 없지만, 홈이 여럿인 시스템이나 HA 시스템의 경우에는 여기에 적절한 주소를 지정하는 것이 좋습니다.
metermaid.config.maxthreads(20). MeterMaid 서버는 다중 스레드이며 작업을 예약하는 스레드 풀을 유지 관리합니다. 이 값은 MeterMaid에서 사용되는 스레드의 최대 수를 설정합니다. CPU가 5개 이상인 시스템에서 이 값을 늘리면 전체 처리량이 늘어납니다.
metermaid.config.port(63837). MeterMaid에서 연결을 수신하며 MeterMaid 클라이언트가 연결하는 포트입니다.
metermaid.config.secret(기본값 없음, 값 입력 필요). MeterMaid는 받는 연결을 인증하기 위해 클라이언트가 MeterMaid에 연결한 후 보내는 공유 비밀을 사용합니다.
metermaid.config.serverhost(기본값 없음, 값 입력 필요). 클라이언트가 연결하는 호스트 이름 또는 IP 주소입니다. metermaid.config.listenaddr와 같은 수도 있지만 Messaging Server 환경에 있는 특정 시스템 하나로 클라이언트를 보내는 특정 값이 있는 경우가 많습니다.
이 설정은 check_metermaid 클라이언트에서 사용됩니다.
metermaid.mtaclient.connectfrequency (15) connectfrequency 초마다 연결을 시도합니다. MeterMaid와 연결할 필요가 있는 클라이언트는 MeterMaid가 사용 불가능한 상태에서 계속 연결이 시도되지 않도록 이를 내부 억제로 사용합니다. 클라이언트가 MeterMaid와 통신할 수 없는 경우에는 MeterMaid가 이 연결을 차단하지 않은 것을 알리는 MTA 매핑 엔진에 "fail" 상태를 반환합니다.
예를 들어, check_metermaid.so가 MeterMaid와의 연결을 시도하지만 어떤 이유로 실패한 경우 metermaid.mtaclient.connectfrequency 에서 지정한 대로 다음 N초간은 추가적인 시도가 이루어지지 않습니다. MeterMaid가 작동하지 않는 경우, check_metermaid.so가 너무 자주 MeterMaid와의 연결을 시도하지 않게 해줍니다.
metermaid.mtaclient.connectwait(5). 클라이언트가 MeterMaid와의 연결을 기다리는 경우(초기 연결 또는 이미 설정된 연결 재사용), connectwait 초간 기다린 후에 "fail" 상태를 반환하고 이 연결이 계속되도록 허용합니다.
metermaid.mtaclient.debug(no). 이 옵션이 활성화되어 있으면 서버나 SMTP 서버의 스레드별 로그 파일에 클라이언트의 디버깅 정보가 출력됩니다.
metermaid.mtaclient.maxconns(3). 다중 스레드 서버를 지원하기 위해 클라이언트에서 MeterMaid에 대한 연결 풀을 유지 관리할 수 있습니다. 그러면 통신 중의 동시 처리를 늘릴 수 있습니다. 하지만 MeterMaid에서 수행되는 내부 잠금 때문에 특정 테이블에 대한 액세스는 한 번에 하나의 요청으로 제한되므로, 한 프로세스에서 여러 연결을 사용할 경우 이점이 제한될 수 있습니다.
metermaid.mtaclient.readwait(10). MeterMaid와 통신할 때 클라이언트는 readwait초간 기다린 다음 fail 상태를 반환하고 이 연결이 계속되도록 허용합니다.
마지막으로, 억제 테이블은 표시된 것과 같이 msg.conf에도 정의됩니다. 각 구성 매개 변수에 있는 *는 정의되는 특정 테이블의 이름을 나타냅니다. 예를 들어, internal이라는 테이블의 경우 첫 매개 변수는 metermaid.table.internal.data_type이 됩니다.
metermaid.table.*.data_type(string). MeterMaid는 테이블에서 문자열과 ipv4라는 두 가지 데이터를 지원할 수 있습니다. 문자열 데이터는 항목 당 255바이트로 제한되며 대소문자를 구분하거나 구분하지 않는 함수를 사용하여 비교할 수 있습니다(아래 metermaid.table.*.options 참조).
metermaid.table.*.max_entries(1000). MeterMaid에서 각 테이블을 초기화할 때 이만큼의 항목을 미리 할당합니다. MeterMaid는 오래된 항목이 만료되지 않은 경우에도 자동으로 리사이클합니다. 새 연결을 받은 경우 MeterMaid는 가장 오래 전에 액세스한 항목을 다시 사용합니다. 사이트에서 quota_time 중에 받은 연결을 캐시하기에 충분하도록 높은 값을 지정해야 합니다.
metermaid.table.*.options는 테이블의 동작 또는 특성을 정의하는 키워드를 포함하는, 쉼표로 분리된 목록입니다. 유효한 키워드는 다음과 같습니다.
nocase — 데이터 작업에서 모든 비교는 대소문자를 구분하지 않는 비교 함수를 통해 이루어집니다. (문자열 데이터의 경우에만 이 옵션이 유효합니다.)
penalize — quota_time초가 지나면 일반적으로 억제에서 연결 수를 0으로 재설정하지만, 축소 옵션을 사용하는 경우 억제에서는 quota_time동안 추가 연결 시도가 축소되도록 연결 수를 할당량만큼 줄입니다(0보다 작지는 않음). 예를 들어, 할당량이 5이고 quota_time이 60인 경우 시스템에서 처음 1분간 12개의 연결 시도를 받으면 처음 5개의 연결은 승인하고 나머지 7개의 연결은 거부합니다. 60초가 지난 후 특정 주소에 대한 연결 수는 7개로 줄지만 할당량보다는 높은 값으로 유지되어 연결 시도는 거부됩니다. 다시 60초가 지나는 동안 새로운 연결 시도가 이루어지지 않으면 연결 수는 다시 2로 줄며 MeterMaid에서 다시 연결 시도를 허용하게 됩니다.
metermaid.table.*.quota(100). 연결을 받으면 할당량을 기준으로 수를 계산합니다. quota_time초 동안 받은 연결의 수가 이 값을 초과하면 MeterMaid에서 연결을 거부합니다. (받는 연결에 미치는 실제 효과는 매핑 테이블에서 제어하며 결과는 추가 조사, 지연 또는 연결 거부 등이 될 수 있습니다.)
metermaid.table.*.quota_time(60). 이 값은 quota를 기준으로 연결 수를 계산하는 시간(초)을 지정합니다. 이 시간이 지나고 나면 이 테이블의 type에 따라 받는 주소에 대해 계산된 연결 수가 감소합니다.
metermaid.table.*storage(hash). MeterMaid에서는 hash와 splay의 두 가지 저장 방법을 사용할 수 있습니다. 기본 해시 테이블 방법을 사용하는 것이 좋지만 경우에 따라 스프레이 트리에서 더 빠른 조회를 제공할 수도 있습니다.
metermaid.table.*.type (throttle). 현재 MeterMaid에서 지원되는 유일한 테이블 유형은 throttle입니다. 이 테이블 유형에서는 데이터(보통 IP 주소)를 추적하여 quota_time초 동안 받는 연결을 quota개로 억제합니다.
이 예에서는 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 매개 변수를 이 설정에 사용한다는 것입니다. 이 예에 대해서는 아래에서 설명합니다.
시스템 중 하나를 MeterMaid 서버 호스트로 지정합니다.
이 시스템에서 다음 configutil 매개 변수를 설정합니다.
local.metermaid.enable -v TRUE |
클라이언트와 MeterMaid 서버 간의 통신을 확인하는 데 사용되는 인증 비밀번호를 설정합니다.
configutil -o metermaid.config.secret -v password |
억제 테이블을 정의합니다.
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은 할당량(연결 한도)입니다.
MeterMaid 시스템에서 MeterMaid를 시작합니다.
# start-msg metermaid |
MTA가 MeterMaid를 사용하여 억제를 수행하는 시스템에서 MeterMaid 호스트와 비밀번호를 지정합니다.
이는 필수 항목입니다.
configutil -o metermaid.config.secret -v MeterMaid_Password configutil -o metermaid.config.serverhost -v name_or_ipaddress_of_MetermaidHost |
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 매핑 테이블을 참조하십시오.
경우에 따라서는 두 가지 추가 구성 옵션이 유용할 수 있습니다. 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 테이블에 남아 계산에 포함되므로 효과적인 억제를 수행하기에 충분한 정보가 유지됩니다.