2015-06-12 3 views
0

Бесконечная волна распределенных smtp-атак на моем сервере побудила меня запретить не указанные IP-адреса от подключения к smtp на моем сервере и отправки почты, хотя это. Очень эффективный. (инструкции: http://sysadmintips.in/advanced/csf/exim)Предоставить Google доступ к SMTP на сервере cPanel/WHM Centos без рекламы SMTP Auth?

Однако теперь я не могу использовать Google Mail (Gmail) для «отправки почты как» для новых учетных записей без включения двухфакторной аутентификации (что является болью, поскольку я настраиваю это дистанционно для моего клиенты) или включение smtp auth обратно на моем сервере.

Моим другим вариантом было бы IP-адреса белых списков Google Mail.

поиск Google открыл этот путь, чтобы получить ток Google IP диапазоны, используя что-то вдоль этих линий (которые я скопированный с этой страницы: https://support.google.com/a/answer/60764?hl=en):

nslookup -q=TXT _spf.google.com 8.8.8.8 

Это возвращает список доменов включенных в запись SPF в Google, например: _netblocks.google.com, _netblocks2.google.com, _netblocks3.google.com

Теперь найдите записи DNS, связанные с этими доменами, по одному, например:

nslookup -q=TXT _netblocks.google.com 8.8.8.8 
nslookup -q=TXT _netblocks2.google.com 8.8.8.8 
nslookup -q=TXT _netblocks3.google.com 8.8.8.8 

Результаты этих команд содержат текущий диапазон адресов.

Могу ли я использовать выходные данные для создания полезного контента для /etc/csf/csf.smtpauth?

Я могу что-то сделать для этого в PHP и запустить его как задачу cron как root, но какой формат является приемлемым? Использует ли csf.smtpauth объявления диапазона IP? Он справляется с IP-адресами IPV6?

После любых изменений мне также потребуется принудительно перезапустить csf и lfd, чтобы новые IP-адреса были использованы. Возможно ли, что PHP работает под управлением root?

Спасибо!

ответ

0

Решено.

Я закодировал следующий PHP, который запрашивает записи SPF Google, а затем, только при необходимости, заменит существующий блок SMTP Auth новым. Затем он создает файл, который используется как флаг для сценария bash для повторного запуска брандмауэра.

Обратите внимание, что /etc/csf/csf.smtpauth принимает адреса IPV4 и IPV6 и диапазоны адресов CIDR.

// Grab current Google SPF IPs... 
$dns = dns_get_record('_spf.google.com', DNS_TXT); 
if (!$dns) 
{ 
    echo "FAILED TO RETRIEVE DNS RECORD<br />\n"; 
    exit; 
} 

// The variable in which to store the results 
$ranges = array(); 

// Of interest in particular to us is... 
$val = $dns[0]['txt']; 

preg_match_all("/include:[^\s]+\s/", $val, $matches); 

if (sizeof($matches[0]) <= 0) 
{ 
    echo "BAD DATA RECEIVED OR FAILED TO DECODE DATA<br />\n"; 
    exit; 
} 

foreach ($matches[0] as $match) 
{ 
    $match = trim($match); 
    $domain = trim(preg_replace("/include\:/", "", $match)); 

    // Now do it all again for this domain to get the IP range 
    $dns = dns_get_record($domain, DNS_TXT); 

    if (!$dns) 
    { 
     echo "DNS LOOKUP FAILURE AT PASS 2<br />\n"; 
     exit; 
    } 

    $val = $dns[0]['txt']; 
    preg_match_all("/ip\d:[^\s]+\s/", $val, $ips); 

    if (sizeof($ips[0])<=0) 
    { 
     // At time of writing this is entirely possible as _netblocks3.google.com 
     // currently holds NO IP ranges 
    } 
    else 
    { 
     foreach ($ips[0] as $ip) 
     { 
      $ip = trim($ip); 
      if ($ip <> '') 
      { 
       $ip = preg_replace("/ip\d\:/", "", $ip); 
       $ranges[] = $ip; 
      } 
     } 
    } 
} 

// To be here means we made it without a major problem. Form the new IP range for 
// the smtp auth file (/etc/csf/csf.smtpauth) and compare with the existing. Update only if there has 
// been a change. Also update only if there are at least N ranges found. 
// When I wrote this there were 11 IPV4 ranges and 6 IPV6 ranges so setting 
// low limit to 10 
$limit = 10; 
$filename = '/etc/csf/csf.smtpauth'; 

if (sizeof($ranges) < $limit) 
{ 
    echo "NOT UPDATING RANGES, TOO FEW DISCOVERED, PROBLEM?"; 
    exit; 
} 

$filerange = "# GOOGLE SPF RESULTS START\n"; 
$filerange .= join("\n", $ranges); 
$filerange .= "\n# GOOGLE SPF RESULTS END"; 

// Read in existing conf file 
$econf = file_get_contents($filename); 
if (sizeof($econf)<=0) 
{ 
    echo "FAILED TO READ $filename<br />\n"; 
    exit; 
} 

// Extract the block 
if (!preg_match("/\# GOOGLE SPF RESULTS START.+\# GOOGLE SPF RESULTS END/s", $econf, $matches)) 
{ 
    echo "FAILED TO FIND EXISTING BLOCK. CORRUPT AUTH FILE?<br />\n"; 
    exit; 
} 

if ($filerange == $matches[0]) 
{ 
    // IT'S THE SAME DO NOT UPDATE IT!; 
    exit; 
} 

// Replace the block entirely 
$econf = preg_replace("/\# GOOGLE SPF RESULTS START.+\# GOOGLE SPF RESULTS END/s", $filerange, $econf); 

// Write out the new file contents 
file_put_contents($filename, $econf); 

// Trigger a CSF/LFD restart by creating trigger file. 
touch("restartcsflfd"); 

Затем создать задачу CRON для запуска этого сценария оболочки вскоре после того, как и каждый раз выше, выполняемый:

#!/bin/bash 
if [ -f /path-to-file/restartcsflfd ]; 
then 
    csf -r 
    /etc/init.d/lfd restart 
    rm -f restartcsflfd 
    echo "RE-STARTED CSF and LFD" 
fi