Назад | Перейти на главную страницу

Как предоставить Apache доступ к ip-таблицам в ubuntu

Я запустил приведенный ниже сценарий на свежем Ubuntu 14.04.5 x64 коробка. Это работает до такой степени, что apache блокирует мой IP-адрес для слишком большого количества запросов, как ожидалось. Однако мой IP-адрес не добавлен в iptables. Я просто получаю стандартный 403, но я бы хотел, чтобы пакеты отбрасывались без ошибок.

Я думаю, проблема в разрешениях, где apache не может бежать ip-tables. Но я не могу понять этого, так как дал apache пользователь www-data возможность бегать iptables в sudoers файл.

Любая помощь приветствуется, я весь день возился с этим!

#!/bin/sh

apt-get update
apt-get -y install apache2

# Install mod evasive
apt-get -y install libapache2-mod-evasive

# Enable it
a2enmod evasive
a2enconf evasive

# Create log directory
mkdir /var/log/mod_evasive
chown -R www-data:www-data /var/log/mod_evasive

# Config for mod evasive
cat <<'EOF' > /etc/apache2/mods-available/evasive.conf
  <IfModule mod_evasive20.c>
      DOSHashTableSize     3097

      # Allow 5 requests for the same resource request per second. Per-IP
      DOSPageCount          5
      DOSPageInterval       1

      # Allow up to 50 requests across the domain per second. Per-IP
      DOSSiteCount          50
      DOSSiteInterval       1

      # Block user by IP for 60 minutes
      DOSBlockingPeriod     60

      DOSSystemCommand      "sudo /usr/local/bin/ban_ip.sh %s"

      DOSLogDir             /var/log/mod_evasive
      DOSWhitelist          188.88.90.71
      DOSWhitelist          188.88.90.72
      DOSWhitelist          188.88.90.73
  </IfModule>
EOF

# Config for banning users
cat <<'EOF' > /usr/local/bin/ban_ip.sh
#!/bin/sh

# Offending IP as detected by mod_evasive
IP=$1

# Path to iptables binary executed by user www-data through sudo
IPTABLES="/sbin/iptables"

# mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive

# Add the following firewall rule (block IP)
sudo $IPTABLES -I INPUT -s $IP -j DROP

# Unblock offending IP after 2 hours through the 'at' command; see 'man at' for further details
echo "sudo $IPTABLES -D INPUT -s $IP -j DROP" | sudo at now + 1 minute

# Remove lock file for future checks
sudo rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
EOF

echo 'www-data ALL=NOPASSWD: /sbin/iptables *, /usr/bin/at *' | EDITOR='tee -a' visudo

Я никогда не использовал уклонение от модов, но после просмотра вашего скрипта похоже, что вы забыли сделать свой /usr/local/bin/ban_ip.sh исполняемый файл - если я правильно понимаю вашу настройку.

Кроме того, я не вижу причин для дополнительного sudo в вашей команде iptables, потому что в evasive.conf весь usr/local/bin/ban_ip.sh скрипт настроен для запуска с помощью sudo. Если он запускается, он работает с привилегиями root.

Вы можете добавить такое заявление:

echo here we are at 1 >>/tmp/evasive.testlog

вскоре после #! / bin / sh, чтобы увидеть, выполняется ли вообще ваш скрипт.