레이블이 qmail인 게시물을 표시합니다. 모든 게시물 표시
레이블이 qmail인 게시물을 표시합니다. 모든 게시물 표시

2017년 11월 21일 화요일

qmail 큐(queue) 체크 스크립트.

계정의 패스워드가 노출되었거나, 사용자의 pc가 해킹 당했을 경우
해당 계정을 통해서 스팸 메일 발송이 자주 일어난다.

이렇게 되면 큐가 1000개는 기본으로 넘어가게 되어 정상적인 메일도
같이 안나게 된다.

정상적인 메일서버면 큐개수가 많아야 20~30개이므로
큐가 100개를 넘어가면 경고 메일을 보내도록 하였다.

아래 스크립트는 큐메일 용도이다.
#!/bin/sh
# Send an email when there are more then 1000 messages in the mail queue
# This is counted by the amount of lines in the qmail-qread output, so it's an indication...

show=$1
qread="/var/qmail/bin/qmail-qread"
qreadIDs=`/var/qmail/bin/qmail-qread | awk '{print $6}' | sed 's/#//' | grep -v '^$' | uniq`
len=`$qread | wc -l`
SUBJECT="WARNING: There are $len messages in the mail queue!----Country Check Version"
EMAIL="your@mail.com"
EMAILMESSAGE="/tmp/emailmessage.txt"
echo "" > $EMAILMESSAGE
chmod 777 $EMAILMESSAGE


if [ $len -gt 100 ]; then

for id in $qreadIDs
do
case "$id" in
"0.0.0.0"|"127.0.0.1"|"8.8.8.8")
continue;;
*)
#find /var/qmail/queue/mess/ -name 1449183 | xargs cat | grep mysolution-remoteip | awk '{print $2}' | xargs geoiplookup
queueFile=`find /var/qmail/queue/mess/ -name $id`
IP=`cat $queueFile | grep mysolution-remoteip | awk '{print $2}'`
# FROM=`cat $queueFile | grep From:`
# Subject=`cat $queueFile | grep Subject:`
countryChk=`geoiplookup $IP`
receiveChk=`cat $queueFile | grep Received:`

echo "Queue ID : $id --------------" >> $EMAILMESSAGE
echo "$IP : $countryChk" >> $EMAILMESSAGE
echo $FROM >> $EMAILMESSAGE
echo $Subject >> $EMAILMESSAGE
echo "$receiveChk" >> $EMAILMESSAGE
echo "-----------------------------" >> $EMAILMESSAGE
echo "" >> $EMAILMESSAGE

if [ 1 -eq $# ]; then

if [ $show = "show" ]; then
cat $EMAILMESSAGE
fi
fi
esac
done

MESSAGE=$(cat $EMAILMESSAGE)
# send an email using /bin/mail
#mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
printf "To: ${EMAIL}\nSubject: ${SUBJECT}\n\n $MESSAGE" | /var/qmail/bin/qmail-inject
rm -rf $EMAILMESSAGE

fi

2016년 10월 12일 수요일

vpopmail(pop3) brute force 공격 차단

qmail vpopmail 을 쓰고 있다.

서버 점검 중 pop3로 접속시도를 하는 로그를 발견했다.

없는 아이디로 계속 시도하는 것과 계정은 있지만 패스워드를 계속 틀리게 입력하는 유형 2가지.
Oct 11 11:27:54 mail vpopmail[27836]: vchkpw-pop3: vpopmail user not found admin12@domain.com:109.104.203.62

Oct 11 15:02:11 mail vpopmail[15277]: vchkpw-pop3: password fail (pass: 'e603f6c507b3993651f0439553584c50') acount@domain.com:110.70.15.59

한두개가 아니라 같은 아이피가 계정만 바꿔서 계속 시도하고 있다.
fail2ban으로 vpopmail 차단을설정하면 좋은데, 실 운영서버라 fail2ban 설치하기가 쉽지 않다.

그래서 스크립트 작성.
#/bin/bash


help()
{
echo ""
echo "/var/log/maillog is default"
echo "iptable apply is not default"
echo "banCount 100 is default"
echo "-a : iptable applied"
echo "-f : maillog FILE PATH"
echo "-c : ban count"
echo ""
echo "Usae : $0 -a -c 100 -f /var/log/maillog "
exit 0
}


ignoreIPs=("222.222.222.222" "111.111.111.111")
maillog="/var/log/maillog"
banCount=100
fw=false


while getopts ac:f: opt
do
case $opt in
a)
fw=true
;;
c)
banCount=$OPTARG
;;
f)
maillog=$OPTARG
;;
*)
help
exit 0
;;
esac
done


banIPs=`grep -E 'user not found|password fail' ${maillog} | awk -F: '{print $NF}' | sort | uniq -dc | awk '{if ($1 > '"${banCount}"') print $NF}'`

for banIP in $banIPs
do
for ignoreIP in ${ignoreIPs[@]}
do
if [ $ignoreIP == $banIP ]
then
# echo "ignore IP: ${ignoreIP}"
# echo "ban IP : $banIP"
break
fi
done

echo "ban IP : $banIP ,whois : $(geoiplookup $banIP)"
if [ $fw = true ] ; then
iptables -A INPUT -s ${banIP}/24 -j DROP
fi

done


if [ $fw = true ] ; then
#remove duplicate iptables rules
#http://www.krazyworks.com/remove-duplicate-iptables-rules/
/sbin/service iptables save
/sbin/iptables-save | awk '!x[$0]++' > /tmp/iptables.conf
/sbin/iptables -F
/sbin/iptables-restore < /tmp/iptables.conf
/sbin/service iptables save
/sbin/service iptables restart
if [ -f /tmp/iptables.conf ] ; then /bin/rm -f /tmp/iptables.conf ; fi
fi


 

1. banCount 는 같은 IP가 해당 값이상일 경우만 가져온다.
실제사용자가 실패할 경우도 있기 때문에 100정도면 적당한 것 같다.

2. ignoreIPs는 차단하지 않을 IP를 적어준다.

3. iptable에 적용하는 데, 중복으로 계속 적용된다.
마지막 부분이 중복을 없애고 다시 설정하는 부분이다.

maillog 파일의 생성을 살펴보면 매일 오전 4시 마다 rotate 되고 있다
cron으로 4시 30분 부터 실행되게끔 걸어주면 되겠다.

2016년 9월 29일 목요일

vpopmail 설치시 에러

문경윤(디지문)님이 제작한 스크립트로 설치 중 vpopmail 설치 도중에러 발생.

환경은

centos 6.8 32bit 이며 mysql은

yum install mysql mysql-server

를 통해 'mysql  5.1.73'를 설치



에러 1.

configure: error: Unable to find your MySQL inc dir, specify --enable-incdir.

해결.
yum -y install mysql-devel



에러2.

gcc -I. -I/var/lib/mysql/ -I. -I. -I. -fPIC -g -O2 -Wall -c -o libvpopmail_a-vauth.o `test -f 'vauth.c' || echo './'`vauth.c
vauth.c:33:19: error: mysql.h: 그런 파일이나 디렉터리가 없습니다

해결.

mysql.h 파일은 mysql-devel을 설치하면 만들어지는 데 find 명령으로 찾아보니 그 위치가 /var/user/include/mysql 이다.
[root@localhost src]# find / -name mysql.h
/usr/include/mysql/mysql.h

근데 실제 mysqld은 /var/lib/mysql에 설치되어 있으니 거기서 mysql.h를 찾고 있다. 당연히 없지. 아래의 옵션으로 lib위치를 추가 해 주면 된다.

configure 옵션에 libdir=/var/user/include/mysql 추가

2016년 7월 15일 금요일

dns_txt.c:(.text+0x35): undefined reference to `__res_query'

qmail 설치시 에러 발생

gcc -DBIND_8_COMPAT -O2 -o dktest dktest.o -L. -ldomainkeys -lcrypto `cat dns.lib`
./libdomainkeys.a(dns_txt.o): In function `dns_text':
dns_txt.c:(.text+0x35): undefined reference to `__res_query'
dns_txt.c:(.text+0xcf): undefined reference to `__dn_expand'
dns_txt.c:(.text+0x147): undefined reference to `__dn_expand'
collect2: ld returned 1 exit status
해결
yum install bind-libs

2016년 5월 11일 수요일

qmailanalog 설치 및 사용 시 에러

qmailanalog를 설치 하려고 다운 받았다.

make 했더니 오류가 난다.
/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in strerr.a(strerr_sys.o)
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status

위와같은 오류발생시 error.h파일에 extern int errno; 이줄 삭제 #include <errno.h> 그위치에 이줄 추가한다.
출처
cat /var/log/maillog | awk '{$1="";$2="";$3="";$4="";$5="";print}' > /tmp/qmailLogTmp
cat /tmp/qmailLogTmp | /usr/local/qmailanalog/bin/matchup | /usr/local/qmailanalog/bin/zoverall > /tmp/qmailLog

위와 같이 했더니, 오류 발생.
matchup: fatal: unable to write fd 5: file descriptor not open

나눠져 있는 로그 파일을 합치라고 하면서 아래와 같이 코드를 적어 놨음.
(무려 중국 블로그)
<log.1 matchup >out.1 5>pending.2
cat pending.2 log.2 | matchup >out.2 5>pending.3
cat pending.3 log.3 | matchup >out.3 5>pending.4

왜 이렇게 하는 지 모르겠음.

그냥 이렇게 하니까 된다.
cat /var/log/maillog* | awk '{$1="";$2="";$3="";$4="";$5="";print}' > /tmp/qmailLogTmp
cat /tmp/qmailLogTmp | /usr/local/qmailanalog/bin/matchup | /usr/local/qmailanalog/bin/zoverall > /tmp/qmailLog

/tmp/qmailLog 내용을 보면

[root@mail qmailanalog-0.70]# cat /tmp/qmailLog
Basic statistics

qtime is the time spent by a message in the queue.

ddelay is the latency for a successful delivery to one recipient---the
end of successful delivery, minus the time when the message was queued.

xdelay is the latency for a delivery attempt---the time when the attempt
finished, minus the time when it started. The average concurrency is the
total xdelay for all deliveries divided by the time span; this is a good
measure of how busy the mailer is.

Completed messages: 18684
Recipients for completed messages: 24230
Total delivery attempts for completed messages: 24458
Average delivery attempts per completed message: 1.30903
Bytes in completed messages: 5.20127e+09
Bytes weighted by success: 1.00912e+10
Average message qtime (s): 15.4838

Total delivery attempts: 24458
success: 24060
failure: 170
deferral: 228
Total ddelay (s): 158313.276733
Average ddelay per success (s): 6.579937
Total xdelay (s): 169514.560113
Average xdelay per delivery attempt (s): 6.930843
Time span (days): 7.42548
Average concurrency: 0.264222

잘 나온다.

근데 내가 원하는 내용이 아니다. ㅠㅠ

2015년 10월 8일 목요일

qmail SMTP 접속이 느려지는 현상

메일 보내기가 제대로 되지 않는 현상이 발생.
exec /usr/local/bin/softlimit -m 100000000 \
/usr/local/bin/tcpserver -v -H -R -l0 -c200 -x /etc/tcp.smtp.cdb -u $Q_UID -g $Q_GID 0 25 \
/usr/local/bin/rblsmtpd -t 30 -b -r spamlist.or.kr \
/var/qmail/bin/qmail-smtpd $HOSTNAME /home/vpopmail/bin/vchkpw /bin/true 2>&1

이런 식으로 KISA RBL을 사용하고 있었는데,  해당 spamlist.or.kr 이 문제가 있는 것 같음.

전화해 봤더니, 문제없다고만 하고...

일단 제거로 문제 해결.

2014년 7월 11일 금요일

gmail에서 보낸 메일이 안 들어 올 때

gmail 보낸 메일이 들어 오지 않는다.

메일서버의 로그를 확인 해 봤도, 받았다는 로그가 보이지 않는다.

한 하루 반정도 지나니까 리턴메일이 왔다.
This is an automatically generated Delivery Status Notification

THIS IS A WARNING MESSAGE ONLY.

YOU DO NOT NEED TO RESEND YOUR MESSAGE.

Delivery to the following recipient has been delayed:

     test@test.com

Message will be retried for 2 more day(s)

Technical details of temporary failure:
Google tried to deliver your message, but it was rejected by the server for the recipient domain xxxxxxxxxxxxxx. [xxx.xxx.xxx].

The error that the other server returned was:
454 TLS missing certificate: error:0200100D:system library:fopen:Permission denied (#4.3.0)

----- Original message -----

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;

...

검색해 보니 TLS 셋팅 안되어 있어서 발생한 문제.

아마도 저번에 587 포트를 열어 놓은 적이 있는 데, 아마도 그 때문인 것 같다.
이것은 받는 메일서버에 tls 세팅이 제대로 되지 않은경우이다.
qmail 의 경우 아래와 같이 해결한다.
1. 모듈확인
#ldd /var/qmail/bin/qmail-smtpd  (명령으로 ssl 모듈이 추가되어 있는지 확인후 )
2. 키를 생성한다.
#openssl req -newkey rsa:1024 -x509 -nodes -days 3650 -out /var/qmail/control/servercert.pem -keyout /var/qmail/control/servercert.pem
키 생성시 Common Name 은 도메인명을 정확히 기록한다.

#위의 명령어 실행시 나오는 내용
Country Name (2 letter code) [GB]:KR
State or Province Name (full name) [Berkshire]:Seoul
Locality Name (eg, city) [Newbury]:Jungu
Organization Name (eg, company) [My Company Ltd]:Company
Organizational Unit Name (eg, section) []:QnA Team
Common Name (eg, your name or your server's hostname) []:서버의 설정된 도메인 명.
Email Address []:관리자 이메일


3. 권한변경
#chmod 640 /var/qmail/control/servercert.pem
4. 소유자/그룹변경
#chown vpopmail.vchkpw /var/qmail/control/servercert.pem => 혹은 (qmaild.qmail)
5. 복사
#ln -s /var/qmail/control/servercert.pem /var/qmail/control/clientcert.pem
6. ciphers 만들어주기...
#openssl ciphers > /var/qmail/control/tlsclientciphers
#openssl ciphers > /var/qmail/control/tlsserverciphers

pem 파일 내용 확인은 아래와 같다.
#openssl x509 -text -noout -in servercert.pem

메일서버를 테스트는...
#openssl s_client -crlf -starttls smtp -connect localhost:25
에러 없으면 된다...
아래도 해보자.
#telnet localhost 25
ehlo localhost
starttls

gmail에서 다시 발송 후 도착 여부 확인.
출처

2014년 7월 2일 수요일

qmail submission 추가

qmail submission 추가

외국에서 메일을 사용시 아웃룩에서 이런 에러 메시지가 발생.

outlook cannot connect to your outgoing smtp email server

검색해 보니, 외국같은 경우 25번 포트를 차단하는 경우가 많다고 한다.

그래서  부득이하게 587 포트를 열게 됬다.
cd /var/qmail/supervise

#submission 용 디렉토리 생성
mkdir qmail-smtpd-sub
mkdir qmail-smtpd-sub/log

#권한 추가
chmod +t qmail-smtpd-sub
cp ./qmail-smtpd/run ./qmail-smtpd-sub/
cp ./qmail-smtpd/log/run ./qmail-smtpd-sub/log
cp /var/qmail/bin/qmail-smtpd /var/qmail/bin/qmail-smtpd-sub

새로만든 qmail-smtpd-sub/run에 25번 포트를 587로 변경해 준다.
vi /var/qmail/supervise/qmail-smtpd-sub/run

...
/etc/tcp.smtp.cdb -u $Q_UID -g $Q_GID 0 25 \
...

/etc/tcp.smtp.cdb -u $Q_UID -g $Q_GID 0 587 \

 

서비스에 추가
ln -s /var/qmail/supervise/qmail-smtpd-sub/ /service/

이렇게 셋팅 하면 qmail을 재시작 안해도 자동으로 587 포트가 열려있다.
아웃룩에서 smtp 포트를 587 로 변경하고 테스트 해 보면 잘 된다.

참고

2014년 4월 24일 목요일

qmail 발송 테스트 (qmail-inject example)

qmail 이 정상적으로 동작하는 지 테스트 해 보기.
$ /var/qmail/bin/qmail-inject <<EOM 
To: test@test.com
Subject: Test

This is a test message
EOM


printf 'To: test@test.com\nSubject: Test\n\nThis is a test message' | /var/qmail/bin/qmail-inject


위와 같이 하면 발송은 제대로 하나 스팸으로 분류될 가능성이 높다.
스팸 분류함을 한번 뒤져 보자.

2012년 9월 21일 금요일

qmHandler 작동 문제

qmHandler 실행시 Calling system script to terminate qmail... 부분에서 더이상 진행이 안되는 현상이 있다.

확인 결과 qmail-remote 가 qmail stop 명령어로는 정지 되지 않는다.

killall qmail-remote 후 실행하자.

2012년 9월 10일 월요일

qmail queue 주기적 정리,삭제 기능.

 


많은 양의 메일이 큐에 쌓일경우 아래와 같이 설정해주시면
매번 큐를 삭제하지 않고도 주기적으로 큐 정리가 가능해집니다.

#touch /var/qmail/control/queuelifetime ->> 파일 생성
 #echo "86400" > /var/qmail/control/queuelifetime       -> 큐 대기시간 하루
/etc/init.d/qmail reload     --> qmail 재로드
/var/qmail/bin/qmail-showctl  | grep life   --> 확인

 

queuelifetime 시간에 따른 재발송 회수

86400은 대략 6회정도.






How often does qmail retry to send email?

 

Each message has its own retry schedule. The longer a message remains undeliverable, the less frequently qmail tries to send it. The retry schedule is not configurable. The following table shows the retry schedule for a message that's undeliverable to a remote recipient until it bounces. Local messages use a similar, but more frequent, schedule.


















































































































































































































Delivery AttemptSecondsD-HH:MM:SS
100-00:00:00
24000-00:06:40
316000-00:26:40
436000-01:00:00
564000-01:46:40
6100000-02:46:40
7144000-04:00:00
8196000-05:26:40
9256000-07:06:40
10324000-09:00:00
11400000-11:06:40
12484000-13:26:40
13576000-16:00:00
14676000-18:46:40
15784000-21:46:40
16900001-01:00:00
171024001-04:26:40
181156001-08:06:40
191296001-12:00:00
201444001-16:06:40
211600001-20:26:40
221764002-01:00:00
231936002-05:46:40
242116002-10:46:40
252304002-16:00:00
262500002-21:26:40
272704003-03:06:40
282916003-09:00:00
293136003-15:06:40
303364003-21:26:40
313600004-04:00:00
323844004-10:46:40
334096004-17:46:40
344356005-01:00:00
354624005-08:26:40
364900005-16:06:40
375184006-00:00:00
385476006-08:06:40
395776006-16:26:40
406084007-01:00:00

2012년 4월 6일 금요일

qmail rbl 적용

회원가입 안 하고 무료로 사용가능 한 것만 적용.


[root@mail smtpd]# cat /var/qmail/supervise/qmail-smtpd/run
#!/bin/sh
QMAILQUEUE="/var/HMAIL/Core/hanbiroServer"
export QMAILQUEUE

export MALLOC_CHECK_=0
Q_UID=`id -u vpopmail`
Q_GID=`id -g vpopmail`
exec /usr/local/bin/softlimit -m 10000000 \
/usr/local/bin/tcpserver -v -H -R -l0 -c200 -x /etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 /usr/local/bin/rblsmtpd -t 30 -b -r bl.spamcop.net \
-r spamlist.or.kr \
-r dnsbl.sorbs.net \
/var/qmail/bin/qmail-smtpd $HOSTNAME \
/home/vpopmail/bin/vchkpw /bin/true 2>&1