А SSH так нельзя прокинуть - вылетите, потому что отрезали сук, на котором сидите. Сначала надо либо перенести порт ноды на другой, либо выбрать другой номер порта для виртуалки и указать его в --dport.
root@example:~# swaks --server example.com --to hidden.address@gmail.com --auth-user michael --auth-password СложНыйП123ароль === Trying example.com:25... === Connected to example.com. <- 220 example.com ESMTP Exim 4.80 Sun, 23 Sep 2012 10:56:05 +0000 -> EHLO example.com <- 250-example.com Hello example.com [178.163.169.128] <- 250-SIZE 52428800 <- 250-8BITMIME <- 250-PIPELINING <- 250-AUTH PLAIN LOGIN <- 250-STARTTLS <- 250 HELP -> AUTH LOGIN <- 334 VXNlcm5hbWU6 -> dmFsZXJpYQ== <- 334 UGFzc3dvcmQ6 -> dmFsZXJpYQ== <- 235 Authentication succeeded -> MAIL FROM:<root@example.com> <- 250 OK -> RCPT TO:<hidden.address@gmail.com> <- 250 Accepted -> DATA <- 354 Enter message, ending with "." on a line by itself -> Date: Sun, 23 Sep 2012 10:56:05 +0000 -> To: hidden.address@gmail.com -> From: root@example.com -> Subject: test Sun, 23 Sep 2012 10:56:05 +0000 -> X-Mailer: swaks v20120320.0 jetmore.org/john/code/swaks/ -> -> This is a test mailing -> -> . <- 250 OK id=1TFjr3-0001au-Uw -> QUIT <- 221 example.com closing connection === Connection closed with remote host.
А это значит, что в диалогах честно отправленных письмах присутствует строчка "235 Authentication succeeded". Соответственно заставьте Ваш iptables искать эту строчку через такую конструкцию:
и наоборот делать -j DROP письмам с текстом "550 relay not permitted"
В любом случае это очень тяжело построить, потому что в сессии идет несколько сообщение и только одно из них будет с этим текстом. То есть нужно вести статистику по пользователю.
А когда Вы водрузите этого мастадонта, то пользователи начнут над Вами смеяться, передавая в поле DATA текст "235 Authentication succeeded" )))
Ну и вариант, когда принимающий сервер будет сразу MTA тоже Ваша смерть. А будет именно так.
a) Разберитесь, почему Ваши PHP-скрипты так вынуждены использовать свой удаленный MSA и где гарантии, что это не будет MTA реципиента.
a) Всё просто, куча клиентов, у некоторых скрипты которые используют отправку писем с авторизацией на стороннем почтовике, mail.ru и т.д. И почему то в этих скрпитах не предусмотрена отправка письма с помощью простейшего mail(). Только для этой цели и требуется.
Ну вообще оно конечно сработает и на локалхосте. Но Ок, ответ понял.
Dimanych:
bugsmoran: b) Разберитесь, почему если речь идет о MSA, то откуда вдруг взялся 25-й порт.
б) тут нет причин разбираться, возможно вы правы, и достаточно будет запрещать только 25й порт(для тупых скрпитов), а 587 оставить открытым для всех и всях) Но я не могу так рисковать! Не исключено что отправка неавторизованного спама будет также и через 587 порт и возможно даже через 465.
Это не ответ на мой вопрос, но ладно.
Dimanych:
Ещё раз всё проанализировал, и понимаю что вероятно единственное решение это фильтровать все пакеты через iptables и при наличии удачной авторизации пропускать далее, или это уже перебор?)
Вы такой сильный программист? Вы понимаете, что Вам придется открыть сорцы iptables и внедрить в него сниффер траффика? И даже это все обломаетя как только клиент начнет использовать SSL для SMTP. У Вас не сформированы требования до сих пор, а Вы уже инструмент выбрали )))
Важный вопрос - от какого пользователя запускаются скрипты. От www-data или у каждого свой?
У Вас /tmp наверняка не слайсом сделан, а просто директория на sda. Поэтому нагрузка перемещается с sdb на sda. Но это всего лишь безпочвенное предположение и игра в угадай мелодию.
А вообще лучше реально показать top/iotop на момент нагрузки. Даже если она всего 7, все равно покажите. Лидера по нагрузке сразу видно будет.
Да я знаю, что исторически так, но история - достояние истории. Адекватные люди не поставят MSA на 25-й порт (если они конечно не ленивые как я :) ).
Давайте я Вам немного объясню про разницу MTA и MSA.
MTA только принимает и посылает почту между серверами от неаутентифицированных пиров. По сути только принимает от других MTA или наоборот передает другим MTA. Механизм аутентификации у него отсутсвует напрочь. Потому что в случае, если он принимающая сторона, то он смотрит для него ли почта (ему достаточно знать, что она пришла по адресу, чтобы передать его в MDA), а если он исходящая сторона, то для него аутентификацию уже провел MSA. То есть когда-то 5 секунд назад MSA принял на отправку запрос от программы, будь она Outlook, RoundCube или самопальный код на PHP. И задача MTA только найти MX сервер домена-реципиента и передать ему письмо. А тот увидит, что почта для его подопечного и примет ее также без аутентификации.
Поэтому, если Вы не хотите заставить свои MSA/MTA на Exim'е работать[почему кстати?], то Вы конечно можете разрешить выступить PHP-скрипту пользователя в качестве:
1) MTA. То есть он будет другим MTA говорить, что MSA уже пройден и я предлагаю принять почту именно для домена, который Вы, уважаемый чужой MTA, обслуживаете.
Тут проблема: ему придется каждый раз подключаться к разным MTA, выбирая по MX-записям кто обслуживает домен реципиента. И вторая проблема - свободная доставка спама целевому MTA.
2) Отсылающего приложения. То есть он будет приходить на свой любымий MSA, представляться там своим логином командой AUTH в протоколе SMTP и уже затем MSA сам будет передавать на отправку письмо MTA.
Тут проблема: MSA как правило на 25-м порту нету. Значит там сразу слушает MTA, а тот как только увидит RCPT TO для чужака, даст отлуп, что не пройдена аутентификация.
Какие из этого всего выводы:
a) Разберитесь, почему Ваши PHP-скрипты так вынуждены использовать свой удаленный MSA и где гарантии, что это не будет MTA реципиента.
b) Разберитесь, почему если речь идет о MSA, то откуда вдруг взялся 25-й порт.
То есть Ваша задача не правило придумать в iptables, а понять где Вас хотят обмануть.
Dimanych: Нет, вы не правы, со спамом я борюсь на 5+
Странно. Обычно люди, которые борятся со спамом на твердую пятерку, знают, что 25 порт - это порт MTA, а для MSA[а Вам нужен именно MSA] есть и дополнительные порты (хотя 25 тоже иногда работает).
Более того, у некоторых сервисов нет сабмишшена на порту 25. Например у mail.ru и gmail.com:
root@test1:~# telnet mxs.mail.ru 25 Trying 94.100.176.20... Connected to mxs.mail.ru. Escape character is '^]'. 220 Mail.Ru ESMTP ehlo test.com 250-mx160.mail.ru ready to serve 250-SIZE 31457280 250 8BITMIME
root@test1:~# telnet gmail-smtp-in.l.google.com. 25 Trying 173.194.70.26... Connected to gmail-smtp-in.l.google.com. Escape character is '^]'. 220 mx.google.com ESMTP o3si19649484wic.0 ehlo test.com 250-mx.google.com at your service, [46.4.207.34] 250-SIZE 35882577 250-8BITMIME 250-STARTTLS 250 ENHANCEDSTATUSCODES
Один из немногих, у кого нашел MSA в том числе на 25-м порту - hotmail.com
root@test1:~# telnet mx1.hotmail.com. 25 Trying 65.54.188.110... Connected to mx1.hotmail.com. Escape character is '^]'. 220 BAY0-MC3-F2.Bay0.hotmail.com Sending unsolicited commercial or bulk e-mail to Microsoft's computer network is prohibited. Other restrictions are found at http://privacy.microsoft.com/en-us/anti-spam.mspx. Sun, 23 Sep 2012 02:20:10 -0700 ehlo test.com 250-BAY0-MC3-F2.Bay0.hotmail.com (3.16.0.61) Hello [46.4.207.34] 250-SIZE 36909875 250-PIPELINING 250-8bitmime 250-BINARYMIME 250-CHUNKING 250-AUTH LOGIN 250-AUTH=LOGIN 250 OK
Я это к тому, что у Вас чужой PHP-скрипт подключется к чужому 25 порту. Будет ли он использовать команду AUTH или наоборот как через релей отправит все локальным пользователям (MTA это пропустит) - Вы знать не можете, если конечно не сниффить каждое подключение, что очень трудоемко и ресурсоемко.
В этот раз я продемонстрировал свои кривые руки. На автомате (устал чего-то под вечер) sysrqd запустил, а он сам себе b-команду дал. Сейчас сервер выйдет из ребута.
Быстро Вы сдались :)
Ну запощу для будущих поколений.
Делается на основной ноде, а не на виртуалке:
А SSH так нельзя прокинуть - вылетите, потому что отрезали сук, на котором сидите. Сначала надо либо перенести порт ноды на другой, либо выбрать другой номер порта для виртуалки и указать его в --dport.
Tasks: 394 total, 1 running, 393 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.1%us, 4.6%sy, 10.7%ni, 57.0%id, 21.2%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 8191156k total, 7587896k used, 603260k free, 213216k buffers
Swap: 3998712k total, 2952k used, 3995760k free, 5517564k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ UID COMMAND
12240 mysql 20 0 1615m 927m 4544 S 54 11.6 7046:08 107 mysqld
7924 www 20 0 44116 15m 1512 D 1 0.2 3:36.00 1001 nginx
7925 www 20 0 44380 16m 1504 D 1 0.2 3:51.72 1001 nginx
7923 www 20 0 44380 16m 1492 S 1 0.2 3:34.29 1001 nginx
7926 www 20 0 44380 16m 1572 D 1 0.2 3:43.47 1001 nginx
10537 root 20 0 19340 1656 1032 R 1 0.0 0:02.79 0 top
7191 root 20 0 653m 11m 656 S 0 0.1 0:00.23 0 apache2
22570 root 20 0 653m 11m 652 S 0 0.1 0:00.05 0 apache2
23267 backups 20 0 190m 3684 1876 S 0 0.0 0:00.75 1002 proftpd
28363 power 30 10 656m 18m 5016 D 0 0.2 0:00.01 1005 apache2
1 root 20 0 8356 668 552 S 0 0.0 1:48.76 0 init
2 root 20 0 0 0 0 S 0 0.0 0:00.01 0 kthreadd
3 root RT 0 0 0 0 S 0 0.0 0:50.08 0 migration/0
Нажмите пожалуйста на единичку, чтобы видеть все ядра.
iowait занимает 21%. А в спокойном состоянии он сколько занимает?
Мой пардон, iptables уже это умеет.
Вот наверно единственная конструкция, которая может помочь:
Как этим воспользоваться.
Вот пример письма, которое не использует аутентификацию:
=== Trying example.com:25...
=== Connected to example.com.
<- 220 example.com ESMTP Exim 4.80 Sun, 23 Sep 2012 10:55:49 +0000
-> EHLO example.com
<- 250-example.com Hello example.com [178.163.169.128]
<- 250-SIZE 52428800
<- 250-8BITMIME
<- 250-PIPELINING
<- 250-AUTH PLAIN LOGIN
<- 250-STARTTLS
<- 250 HELP
-> MAIL FROM:<root@example.com>
<- 250 OK
-> RCPT TO:<hidden.address@gmail.com>
<** 550 relay not permitted
-> QUIT
<- 221 example.com closing connection
=== Connection closed with remote host.
А вот пример письма, которое использует:
=== Trying example.com:25...
=== Connected to example.com.
<- 220 example.com ESMTP Exim 4.80 Sun, 23 Sep 2012 10:56:05 +0000
-> EHLO example.com
<- 250-example.com Hello example.com [178.163.169.128]
<- 250-SIZE 52428800
<- 250-8BITMIME
<- 250-PIPELINING
<- 250-AUTH PLAIN LOGIN
<- 250-STARTTLS
<- 250 HELP
-> AUTH LOGIN
<- 334 VXNlcm5hbWU6
-> dmFsZXJpYQ==
<- 334 UGFzc3dvcmQ6
-> dmFsZXJpYQ==
<- 235 Authentication succeeded
-> MAIL FROM:<root@example.com>
<- 250 OK
-> RCPT TO:<hidden.address@gmail.com>
<- 250 Accepted
-> DATA
<- 354 Enter message, ending with "." on a line by itself
-> Date: Sun, 23 Sep 2012 10:56:05 +0000
-> To: hidden.address@gmail.com
-> From: root@example.com
-> Subject: test Sun, 23 Sep 2012 10:56:05 +0000
-> X-Mailer: swaks v20120320.0 jetmore.org/john/code/swaks/
->
-> This is a test mailing
->
-> .
<- 250 OK id=1TFjr3-0001au-Uw
-> QUIT
<- 221 example.com closing connection
=== Connection closed with remote host.
А это значит, что в диалогах честно отправленных письмах присутствует строчка "235 Authentication succeeded". Соответственно заставьте Ваш iptables искать эту строчку через такую конструкцию:
-m string --string "235 Authentication succeeded" --algo kmp
и тогда делать такому письму -J ACCEPT
и наоборот делать -j DROP письмам с текстом "550 relay not permitted"
В любом случае это очень тяжело построить, потому что в сессии идет несколько сообщение и только одно из них будет с этим текстом. То есть нужно вести статистику по пользователю.
А когда Вы водрузите этого мастадонта, то пользователи начнут над Вами смеяться, передавая в поле DATA текст "235 Authentication succeeded" )))
Ну и вариант, когда принимающий сервер будет сразу MTA тоже Ваша смерть. А будет именно так.
a) Разберитесь, почему Ваши PHP-скрипты так вынуждены использовать свой удаленный MSA и где гарантии, что это не будет MTA реципиента.
a) Всё просто, куча клиентов, у некоторых скрипты которые используют отправку писем с авторизацией на стороннем почтовике, mail.ru и т.д. И почему то в этих скрпитах не предусмотрена отправка письма с помощью простейшего mail().
Только для этой цели и требуется.
Ну вообще оно конечно сработает и на локалхосте. Но Ок, ответ понял.
b) Разберитесь, почему если речь идет о MSA, то откуда вдруг взялся 25-й порт.
б) тут нет причин разбираться, возможно вы правы, и достаточно будет запрещать только 25й порт(для тупых скрпитов), а 587 оставить открытым для всех и всях) Но я не могу так рисковать! Не исключено что отправка неавторизованного спама будет также и через 587 порт и возможно даже через 465.
Это не ответ на мой вопрос, но ладно.
Ещё раз всё проанализировал, и понимаю что вероятно единственное решение это фильтровать все пакеты через iptables и при наличии удачной авторизации пропускать далее, или это уже перебор?)
Вы такой сильный программист? Вы понимаете, что Вам придется открыть сорцы iptables и внедрить в него сниффер траффика? И даже это все обломаетя как только клиент начнет использовать SSL для SMTP. У Вас не сформированы требования до сих пор, а Вы уже инструмент выбрали )))
Важный вопрос - от какого пользователя запускаются скрипты. От www-data или у каждого свой?
У Вас /tmp наверняка не слайсом сделан, а просто директория на sda. Поэтому нагрузка перемещается с sdb на sda. Но это всего лишь безпочвенное предположение и игра в угадай мелодию.
А вообще лучше реально показать top/iotop на момент нагрузки. Даже если она всего 7, все равно покажите. Лидера по нагрузке сразу видно будет.
Да я знаю, что исторически так, но история - достояние истории. Адекватные люди не поставят MSA на 25-й порт (если они конечно не ленивые как я :) ).
Давайте я Вам немного объясню про разницу MTA и MSA.
MTA только принимает и посылает почту между серверами от неаутентифицированных пиров. По сути только принимает от других MTA или наоборот передает другим MTA. Механизм аутентификации у него отсутсвует напрочь. Потому что в случае, если он принимающая сторона, то он смотрит для него ли почта (ему достаточно знать, что она пришла по адресу, чтобы передать его в MDA), а если он исходящая сторона, то для него аутентификацию уже провел MSA. То есть когда-то 5 секунд назад MSA принял на отправку запрос от программы, будь она Outlook, RoundCube или самопальный код на PHP. И задача MTA только найти MX сервер домена-реципиента и передать ему письмо. А тот увидит, что почта для его подопечного и примет ее также без аутентификации.
Поэтому, если Вы не хотите заставить свои MSA/MTA на Exim'е работать[почему кстати?], то Вы конечно можете разрешить выступить PHP-скрипту пользователя в качестве:
1) MTA. То есть он будет другим MTA говорить, что MSA уже пройден и я предлагаю принять почту именно для домена, который Вы, уважаемый чужой MTA, обслуживаете.
Тут проблема: ему придется каждый раз подключаться к разным MTA, выбирая по MX-записям кто обслуживает домен реципиента. И вторая проблема - свободная доставка спама целевому MTA.
2) Отсылающего приложения. То есть он будет приходить на свой любымий MSA, представляться там своим логином командой AUTH в протоколе SMTP и уже затем MSA сам будет передавать на отправку письмо MTA.
Тут проблема: MSA как правило на 25-м порту нету. Значит там сразу слушает MTA, а тот как только увидит RCPT TO для чужака, даст отлуп, что не пройдена аутентификация.
Какие из этого всего выводы:
a) Разберитесь, почему Ваши PHP-скрипты так вынуждены использовать свой удаленный MSA и где гарантии, что это не будет MTA реципиента.
b) Разберитесь, почему если речь идет о MSA, то откуда вдруг взялся 25-й порт.
То есть Ваша задача не правило придумать в iptables, а понять где Вас хотят обмануть.
Нет, вы не правы, со спамом я борюсь на 5+
Странно. Обычно люди, которые борятся со спамом на твердую пятерку, знают, что 25 порт - это порт MTA, а для MSA[а Вам нужен именно MSA] есть и дополнительные порты (хотя 25 тоже иногда работает).
Более того, у некоторых сервисов нет сабмишшена на порту 25. Например у mail.ru и gmail.com:
Trying 94.100.176.20...
Connected to mxs.mail.ru.
Escape character is '^]'.
220 Mail.Ru ESMTP
ehlo test.com
250-mx160.mail.ru ready to serve
250-SIZE 31457280
250 8BITMIME
Trying 173.194.70.26...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP o3si19649484wic.0
ehlo test.com
250-mx.google.com at your service, [46.4.207.34]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
Один из немногих, у кого нашел MSA в том числе на 25-м порту - hotmail.com
Trying 65.54.188.110...
Connected to mx1.hotmail.com.
Escape character is '^]'.
220 BAY0-MC3-F2.Bay0.hotmail.com Sending unsolicited commercial or bulk e-mail to Microsoft's computer network is prohibited. Other restrictions are found at http://privacy.microsoft.com/en-us/anti-spam.mspx. Sun, 23 Sep 2012 02:20:10 -0700
ehlo test.com
250-BAY0-MC3-F2.Bay0.hotmail.com (3.16.0.61) Hello [46.4.207.34]
250-SIZE 36909875
250-PIPELINING
250-8bitmime
250-BINARYMIME
250-CHUNKING
250-AUTH LOGIN
250-AUTH=LOGIN
250 OK
Я это к тому, что у Вас чужой PHP-скрипт подключется к чужому 25 порту. Будет ли он использовать команду AUTH или наоборот как через релей отправит все локальным пользователям (MTA это пропустит) - Вы знать не можете, если конечно не сниффить каждое подключение, что очень трудоемко и ресурсоемко.
В этот раз я продемонстрировал свои кривые руки. На автомате (устал чего-то под вечер) sysrqd запустил, а он сам себе b-команду дал. Сейчас сервер выйдет из ребута.
Очень извиняюсь за самого себя.
:) обычно настраивают так, что между двумя операциями требуется выдержать паузу не менее заданного минимального интервала.
Написать на форуме про такой лимит - не значит его реализовать. Пока ни у одного хостера нет такого ограничения.
Любой предусмотрительный хостер выключит эту возможность. Это же идеальная утилита для DDoS. Нажал на кнопочку и дал нагрузку на сервер.
У нас есть такая услуга, но она только по запросу в саппорт. Чтобы не было желания досить.