Архив рубрики: Vesta

Избавляем 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