Iptables
如何讓 Apache 訪問 ubuntu 上的 ip-tables
我在一個新
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
我從未使用過 mod-evasive,但在瀏覽了您的腳本後,您似乎忘記了製作
/usr/local/bin/ban_ip.sh
執行檔 - 如果我正確理解您的設置。此外,我看不出有任何理由在您的 iptables 命令中添加額外的 sudo,因為在 evasive.conf 中,整個
usr/local/bin/ban_ip.sh
腳本被配置為由 sudo 啟動。如果它執行,它將以 root 權限執行。您可以添加一些語句,例如:
echo here we are at 1 >>/tmp/evasive.testlog
#!/bin/sh 之後不久,只是為了查看您的腳本是否被執行。