Избавляем exim от спама

1
vi /etc/exim/exim.conf
vi /etc/exim/exim.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
acl_check_data:
 
# Аутентифицированым везде у нас дорога
# Аутентифицированым везде у нас почет
#
# Приемлимо, если есть уверенность в отсутствии вирусни у юзеров, дабы не рассылали.
# Я юзаю на виндовых клиентах Thunderbird и никакого Бата или Некрофост Аутглюков (Экспресс)
#
accept authenticated = *
 
# Проверяем наличие RFC даты
# Немного спам-ботов балуют правильно оформленной датой. Режем.
#
defer
message = RFC compliant date required.
condition = ${if !match\
{$h_date:}\
{\N[0-9]\N}\
{yes}{no}}
 
# Проверяем наличие RFC To
# Немного спам-ботов балуют правильно оформленным полем To. Режем.
#
defer
message = RFC compliant to required.
condition = ${if !match\
{$h_to:}\
{\N.+\N}\
{yes}{no}}
 
# Проверяем наличие не ASCII символов, за исключением UTF-8
# Немного спам-ботов балуют правильно оформленной кодировкой. Режем.
#
# Тут надо с некоторой оглядкой - некоторые форумы и прочие самоделки рассылают как попало, без соблюдения кодировки.
#
defer
message = Message headers contain non ASCII chars.
condition = ${if !match\
{${lc:$h_content-type:}}\
{\Nutf-?8\N}\
{yes}{no}}
condition = \
${if \
or {\
{match{$rh_bcc:}{\N[\x80-\xff]\N}}\
{match{$rh_cc:}{\N[\x80-\xff]\N}}\
{match{$rh_date:}{\N[\x80-\xff]\N}}\
{match{$rh_from:}{\N[\x80-\xff]\N}}\
{match{$rh_reply-to:}{\N[\x80-\xff]\N}}\
{match{$rh_sender:}{\N[\x80-\xff]\N}}\
{match{$rh_subject:}{\N[\x80-\xff]\N}}\
{match{$rh_to:}{\N[\x80-\xff]\N}}\
}\
{yes}{no}}
 
# Домен не может быть localhost или localdomain
# На "дурака" не проканает. Режем.
#
defer
message = ${domain:$h_from:} is a wrong domain.
hosts = ! : !+relay_from_hosts
condition = ${if match\
{${domain:$h_from:}}\
{\N^(localhost|localhost\.local(domain)?|local(domain)?)$\N}\
{yes}{no}}
 
# Не принимаем почту с "голых" IP-адресов (RFC 1918)
# С "голых" IP посылаем нахуй. Это 100% спам!
#
deny hosts = !+relay_from_hosts
message = RFC 1918 IP address in HELO.
condition = ${if match\
{$sender_helo_name}\
{\N^(\[)?(10\.[0-9]{1,3}|172\.(1[6-9]|2[0-9]|31)|192\.168)\.[0-9]{1,3}\.[0-9]{1,3}(\])?$\N}\
{yes}{no}}
 
# Удаленный хост должен резольвиться
# Не резольвишься? Иннах, спам-бот!
#
deny hosts = !+relay_from_hosts
message = HELO should be hostname.
condition = ${if !match\
{$sender_helo_name}\
{\N.*[A-Za-z].*\N}\
{yes}{no}}
 
# Удаленный хост должен иметь FQDN
# Резольвишься как попало? Иннах, спам-бот!
#
deny hosts = !+relay_from_hosts
message = HELO should be Fully Qualified Domain Name Host.Domain.Tld See RFC821
condition = ${if !match\
{$sender_helo_name}\
{\N.*[A-Za-z].*\..*[A-Za-z].*\N}\
{yes}{no}}
 
# Поврежденные аттачи - фтопку!
# Кривой MIME нам не нужен! Иннах, спам-бот!
#
deny
message = This message contains malformed MIME $demime_reason.
condition = ${if >\
{$demime_errorlevel}{2}\
{1}{0}}
 
# Виндово-исполняемое говно - фтопку!
# Иннах, инфицированя тачка и/или тупой юзер!
#
deny
message = Attachment has unsupported file format .$found_extension. try text, PDF or ODF instead.
demime = bat:btm:cmd:com:cpl:dat:dll:exe:lnk:msi:pif:prf:reg:scr:vb:vbs:url
 
# Проверяем на вирусы
# У меня подкдючен avast.
# Не забываем включить опцию demime в src/EDITME при сборке exim
#
deny
message = Message contains a virus or other harmful content ($malware_name)
demime = *
malware = *
acl_check_data:

# Аутентифицированым везде у нас дорога
# Аутентифицированым везде у нас почет
#
# Приемлимо, если есть уверенность в отсутствии вирусни у юзеров, дабы не рассылали.
# Я юзаю на виндовых клиентах Thunderbird и никакого Бата или Некрофост Аутглюков (Экспресс)
#
accept authenticated = *

# Проверяем наличие RFC даты
# Немного спам-ботов балуют правильно оформленной датой. Режем.
#
defer
message = RFC compliant date required.
condition = ${if !match\
{$h_date:}\
{\N[0-9]\N}\
{yes}{no}}

# Проверяем наличие RFC To
# Немного спам-ботов балуют правильно оформленным полем To. Режем.
#
defer
message = RFC compliant to required.
condition = ${if !match\
{$h_to:}\
{\N.+\N}\
{yes}{no}}

# Проверяем наличие не ASCII символов, за исключением UTF-8
# Немного спам-ботов балуют правильно оформленной кодировкой. Режем.
#
# Тут надо с некоторой оглядкой - некоторые форумы и прочие самоделки рассылают как попало, без соблюдения кодировки.
#
defer
message = Message headers contain non ASCII chars.
condition = ${if !match\
{${lc:$h_content-type:}}\
{\Nutf-?8\N}\
{yes}{no}}
condition = \
${if \
or {\
{match{$rh_bcc:}{\N[\x80-\xff]\N}}\
{match{$rh_cc:}{\N[\x80-\xff]\N}}\
{match{$rh_date:}{\N[\x80-\xff]\N}}\
{match{$rh_from:}{\N[\x80-\xff]\N}}\
{match{$rh_reply-to:}{\N[\x80-\xff]\N}}\
{match{$rh_sender:}{\N[\x80-\xff]\N}}\
{match{$rh_subject:}{\N[\x80-\xff]\N}}\
{match{$rh_to:}{\N[\x80-\xff]\N}}\
}\
{yes}{no}}

# Домен не может быть localhost или localdomain
# На "дурака" не проканает. Режем.
#
defer
message = ${domain:$h_from:} is a wrong domain.
hosts = ! : !+relay_from_hosts
condition = ${if match\
{${domain:$h_from:}}\
{\N^(localhost|localhost\.local(domain)?|local(domain)?)$\N}\
{yes}{no}}

# Не принимаем почту с "голых" IP-адресов (RFC 1918)
# С "голых" IP посылаем нахуй. Это 100% спам!
#
deny hosts = !+relay_from_hosts
message = RFC 1918 IP address in HELO.
condition = ${if match\
{$sender_helo_name}\
{\N^(\[)?(10\.[0-9]{1,3}|172\.(1[6-9]|2[0-9]|31)|192\.168)\.[0-9]{1,3}\.[0-9]{1,3}(\])?$\N}\
{yes}{no}}

# Удаленный хост должен резольвиться
# Не резольвишься? Иннах, спам-бот!
#
deny hosts = !+relay_from_hosts
message = HELO should be hostname.
condition = ${if !match\
{$sender_helo_name}\
{\N.*[A-Za-z].*\N}\
{yes}{no}}

# Удаленный хост должен иметь FQDN
# Резольвишься как попало? Иннах, спам-бот!
#
deny hosts = !+relay_from_hosts
message = HELO should be Fully Qualified Domain Name Host.Domain.Tld See RFC821
condition = ${if !match\
{$sender_helo_name}\
{\N.*[A-Za-z].*\..*[A-Za-z].*\N}\
{yes}{no}}

# Поврежденные аттачи - фтопку!
# Кривой MIME нам не нужен! Иннах, спам-бот!
#
deny
message = This message contains malformed MIME $demime_reason.
condition = ${if >\
{$demime_errorlevel}{2}\
{1}{0}}

# Виндово-исполняемое говно - фтопку!
# Иннах, инфицированя тачка и/или тупой юзер!
#
deny
message = Attachment has unsupported file format .$found_extension. try text, PDF or ODF instead.
demime = bat:btm:cmd:com:cpl:dat:dll:exe:lnk:msi:pif:prf:reg:scr:vb:vbs:url

# Проверяем на вирусы
# У меня подкдючен avast.
# Не забываем включить опцию demime в src/EDITME при сборке exim
#
deny
message = Message contains a virus or other harmful content ($malware_name)
demime = *
malware = *

 

Авторство

Имя отправителя. Функция mail() PHP Vesta

1. Редактируем

1
 vi /home/user/conf/web/httpd.conf
 vi /home/user/conf/web/httpd.conf

,

где user — это име пользователя в Весте

2. Для нужного нам VirtualHost (см. ServerName) добавляем:

1
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@domain.ru
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@domain.ru

теперь мы в Return-Path и прочих заголовках имеем webmaster@domain.ru

swap файл в Centos

По умолчанию в CenOS на digitalocean’e нет своп раздела. Что при нехватке оперативной памяти негативно сказывается на работе OS.

Проверяем наличие свопа

1
swapon -s
swapon -s

Создаем файл размером 1024Мб.

1
2
3
dd if=/dev/zero of=/swapfile bs=1M count=1000
mkswap /swapfile
swapon /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=1000
mkswap /swapfile
swapon /swapfile

Проверяем:

1
swapon -s
swapon -s
1
2
Filename                                Type            Size    Used    Priority
/swapfile                               file            1023992 0       -1
Filename                                Type            Size    Used    Priority
/swapfile                               file            1023992 0       -1

Подключаем своп файл при загрузке:

1
vi /etc/fstab
vi /etc/fstab

добавляем строчку

1
/swapfile          swap            swap    defaults        0 0
/swapfile          swap            swap    defaults        0 0

Права на файл

1
2
chown root:root /swapfile 
chmod 0600 /swapfile
chown root:root /swapfile 
chmod 0600 /swapfile

ionCube centos 6 x64

Берём подходящий лоадер здесь: http://www.ioncube.com/loaders.php

1
2
3
wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar zxf ioncube_loaders_lin_x86-64.tar.gz
mv ioncube /usr/local
wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar zxf ioncube_loaders_lin_x86-64.tar.gz
mv ioncube /usr/local

теперь в конфиг php (в моём случае /etc/php.ini) вставим с блок [Zend] строки:

1
2
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.4.so
zend_extension_ts = /usr/local/ioncube/ioncube_loader_lin_5.4_ts.so
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.4.so
zend_extension_ts = /usr/local/ioncube/ioncube_loader_lin_5.4_ts.so

для php 5.4, обратите снимание на последние цифры so-шки, они должны соответствовать версии php.

Проверяем:

1
php -v
php -v
1
2
3
4
PHP 5.4.23 (cli) (built: Dec 11 2013 06:48:03)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with the ionCube PHP Loader v4.5.2, Copyright (c) 2002-2014, by ionCube Ltd.
PHP 5.4.23 (cli) (built: Dec 11 2013 06:48:03)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with the ionCube PHP Loader v4.5.2, Copyright (c) 2002-2014, by ionCube Ltd.

Webmin Centos 6 install

Устанавливаем ключ

1
rpm --import http://www.webmin.com/jcameron-key.asc
rpm --import http://www.webmin.com/jcameron-key.asc

Репо файл

1
vi /etc/yum.repos.d/webmin.repo
vi /etc/yum.repos.d/webmin.repo
1
2
3
4
[Webmin]
name=Webmin Distribution Neutral
baseurl=http://download.webmin.com/download/yum
enabled=1
[Webmin]
name=Webmin Distribution Neutral
baseurl=http://download.webmin.com/download/yum
enabled=1

Установка

1
yum install webmin
yum install webmin

Добавляем в автозагрузку

1
chkconfig webmin on
chkconfig webmin on

Настройки

1
/etc/webmin/miniserv.conf
/etc/webmin/miniserv.conf

Ограничение количества писем в exim

1
vi /etc/exim/exim.conf
vi /etc/exim/exim.conf

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
acl_not_smtp = acl_not_smtp
 
######
begin acl
######
 
acl_not_smtp:
deny message = Sender rate overlimit - $sender_rate / $sender_rate_period
ratelimit = 50 / 1h / leaky
accept
 
acl_check_rcpt:
deny message = Sender rate SMTP overlimit - $sender_rate / $sender_rate_period
ratelimit = 100 / 1h / leaky
 
accept hosts = net-lsearch;/etc/exim/whitelist
acl_not_smtp = acl_not_smtp

######
begin acl
######

acl_not_smtp:
deny message = Sender rate overlimit - $sender_rate / $sender_rate_period
ratelimit = 50 / 1h / leaky
accept

acl_check_rcpt:
deny message = Sender rate SMTP overlimit - $sender_rate / $sender_rate_period
ratelimit = 100 / 1h / leaky

accept hosts = net-lsearch;/etc/exim/whitelist

50 писем в час для почты отправленной по phpmail и в 100 писем для отправки через SMTP

Firewall Vesta

1
vi /etc/sysconfig/iptables
vi /etc/sysconfig/iptables
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Generated by iptables-save v1.4.7 on Fri Jun 7 14:37:21 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#ftp
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
#ssh
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#smtp
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
#pop
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
#dns
-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT
#http
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
#
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
#vesta
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8083 -j ACCEPT
#ftp passive ports
-A INPUT -p tcp -m state --state NEW -m tcp --dport 12000:12100 -j ACCEPT
#webmin
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Fri Jun 7 14:37:21 2013
# Generated by iptables-save v1.4.7 on Fri Jun 7 14:37:21 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#ftp
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
#ssh
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#smtp
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
#pop
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
#dns
-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT
#http
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
#
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
#vesta
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8083 -j ACCEPT
#ftp passive ports
-A INPUT -p tcp -m state --state NEW -m tcp --dport 12000:12100 -j ACCEPT
#webmin
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Fri Jun 7 14:37:21 2013

загрузка при старте

1
chkconfig iptables on
chkconfig iptables on

запуск

1
service iptables start
service iptables start

Разбираем transcend storejet 25m

Моему мобильному диску уже больше четырех лет, работает исправно, но периодически надоедает своими самопроизвольными отключениями.

Надо заметить, что это происходит гораздо чаще, при заполнении диска более 90%

Да и объема в 250Гб порой уже не хватает. Покупкой нового диска я займусь позже, а пока диск переедет в другой контейнер с интерфейсом USB 3.0. Читать далее