Code: Select all
/* HELO 스트링과 원격 호스트네임 일치여부 체크 */
int helohostchecks()
{
stralloc sa = {0};
ipalloc ia = {0};
unsigned int random;
int j;
int k;
random = now() + (getpid() << 16);
dns_init(0);
stralloc_copys(&sa, helohost.s);
if (!stralloc_0(&sa)) die_nomem();
j = dns_mxip(&ia,&sa,random);
if (remotehost != "unknown") {
k = str_diff(helohost.s, remotehost);
if (j < 0 || k != 0) return 1;
}
else {
return k;
}
return 0;
}
EHLO/HELO 스트링은 SMTP 클라이언트가 SMTP 서버로 연결시 투명성을 보장하기 위한 인증 수단으로 활용된다고 기술되어 있습니다.
그 조건은 namespace 상에 존재하는 유일한 FQDN 이어야 한다고.. 이하 중략.. -_-;;
spamcontrol 의 $HELODNSCHECK 변수가 helo 스트링이 존재하느냐 안하느냐만 체크한다면,,
$HELOHOSTCHECK 변수는 접속하는 클라이언트의 IP주소와 일치하는지의 여부까지 체크합니다.
애초에 계획했었던..
PTR룩업이 이루어지지 않는 클라이언트들을 위한 배려까지 하려 했지만..
저의 집중력과 인내심의 한계(사실 머리가 안따라줘서.. 흐흑..)로 마무리를 못했습니다.
소스코드에서 보시다시피..
remotehost 값을 가져와서.. helo 스트링과 일치하는가를 비교합니다.
만약,
remotehost(PTR룩업후의 호스트네임) 값이 없다면 // if (remotehost == "unknown")
가차없이 reject 됩니다.. ㅡㅡ;
지금 왜 맹글었을까 하고.. 엄청 후회를 하고 있습니다.. -_-;;
테스트 방법은 패치하고나서..
/etc/tcp.smtp 에 $HELOHOSTCHECK 변수를 집어넣으면 됩니다.
ex)
127.0.0.1:allow,RELAYCLIENT=""
:allow,HELOHOSTCHECK=""
아래에 제가 테스트한 결과를 인용합니다.
// 클라이언트에서 텔넷으로 패치된 원격 SMTP 서버에 연결하는 모습..
...
220 izb.knu.ac.kr ESMTP
ehlo stoneport.math.uic.edu
250-izb.knu.ac.kr
250-PIPELINING
250 8BITMIME
mail from:<bh@ulsan.linux.or.kr>
250 ok
rcpt to:<bh@izb.knu.ac.kr>
560 sorry, Host name is not match with your ip (#5.7.1)
...
// 패치된 서버의 smtpd/current 로그..
@40000000406c1a0a0a181d34 qmail-smtpd: pid 81492 from 210.103.86.160 Bogus HELO/EHLO greeting! HELO: 'stoneport.math.uic.edu' FQDN hostname: 'ulsan.linux.or.kr' MAIL from: <bh@ulsan.linux.or.kr> RCPT to: <bh@izb.knu.ac.kr>