Linux
用於基本 HTTP(s) 網路伺服器的安全、標準 iptables 規則集
我一直在嘗試編寫一個基本的伺服器 iptables 腳本,該腳本適用於大多數僅使用 HTTP(S) 和 SSH(埠 80、443 和 22)執行基本網路伺服器的站點。畢竟大多數 VPS 只需要這些起始埠規則,以後可以根據需要添加郵件或遊戲埠。
到目前為止,我有以下規則集,我想知道是否有人知道更好的腳本或可以添加的任何改進。
*filter # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You can modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest) -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT
iptables 是保護您的機器的最重要部分之一(另請參閱fail2ban),但是有很多像我這樣的人無法理解為我們的伺服器製作安全基本防火牆的所有內容。
僅打開網路伺服器所需的基本埠的最安全方法是什麼?
更新: cyberciti.biz 有另一個看起來不錯的iptables 腳本。
此外,您可以使用iptables 本身來阻止對 SSH 的錯誤重複嘗試,而不是使用 Denyhosts 或 fail2ban 。
使用 iptables 最安全的方法是關閉所有內容,只打開您需要的內容。我有點分心,所以我總是盡可能地偷懶,所以我不會犯可能導致伺服器不安全的錯誤。
我使用這個,只需要做一點點變數賦值就可以讓它工作。
#!/bin/bash +x # first author: marcos de vera # second: joan marc riera ip=/sbin/iptables mriera="xx.xx.xx.xx" nsancho="yy.yy.yy.yy" admins="$mriera $nsancho " sshers="" mysqlrs="zz.zz.zz.zz/23" snmprs="uu.uu.uu.uu" tcpservices="80 443 22" udpservices="" # Firewall script for servername echo -n ">> Applying iptables rules... " ## flushing... $ip -F $ip -X $ip -Z $ip -t nat -F # default: DROP! $ip -P INPUT DROP $ip -P OUTPUT DROP $ip -P FORWARD DROP # filtering... # localhost: free pass! $ip -A INPUT -i lo -j ACCEPT $ip -A OUTPUT -o lo -j ACCEPT # administration ips: free pass! for admin in $admins ; do $ip -A INPUT -s $admin -j ACCEPT $ip -A OUTPUT -d $admin -j ACCEPT done # allow ssh access to sshers for ssher in $sshers ; do $ip -A INPUT -s $ssher -p tcp -m tcp --dport 22 -j ACCEPT $ip -A OUTPUT -d $ssher -p tcp -m tcp --sport 22 -j ACCEPT done # allow access to mysql port to iReport on sugar for mysql in $mysqlrs ; do $ip -A INPUT -s $mysql -p tcp -m tcp --dport 3306 -j ACCEPT $ip -A OUTPUT -d $mysql -p tcp -m tcp --sport 3306 -j ACCEPT $ip -A INPUT -s $mysql -p udp -m udp --dport 3306 -j ACCEPT $ip -A OUTPUT -d $mysql -p udp -m udp --sport 3306 -j ACCEPT done # allowed services for service in $tcpservices ; do $ip -A INPUT -p tcp -m tcp --dport $service -j ACCEPT $ip -A OUTPUT -p tcp -m tcp --sport $service -m state --state RELATED,ESTABLISHED -j ACCEPT done for service in $udpservices ; do $ip -A INPUT -p udp -m udp --dport $service -j ACCEPT $ip -A OUTPUT -p udp -m udp --sport $service -m state --state RELATED,ESTABLISHED -j ACCEPT done $ip -A INPUT -j LOG --log-level 4 # VAS and VGP #88 tcp udp #389 tcp ldap queries , udp ldap ping #464 tcp upd kerberos #3268 tcp global catalog access for dc in ip.ip.ip.ip ; do # our dc servers for some ldap auth vas=88 $ip -A INPUT -s $dc -p tcp -m tcp --dport $vas -j ACCEPT $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $vas -j ACCEPT $ip -A INPUT -s $dc -p udp -m udp --dport $vas -j ACCEPT $ip -A OUTPUT -d $dc -p udp -m udp --dport $vas -j ACCEPT ldap=389 $ip -A INPUT -s $dc -p tcp -m tcp --dport $ldap -j ACCEPT $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $ldap -j ACCEPT $ip -A INPUT -s $dc -p udp -m udp --dport $ldap -j ACCEPT $ip -A OUTPUT -d $dc -p udp -m udp --dport $ldap -j ACCEPT kpasswd=464 $ip -A INPUT -s $dc -p tcp -m tcp --dport $kpasswd -j ACCEPT $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $kpasswd -j ACCEPT $ip -A INPUT -s $dc -p udp -m udp --dport $kpasswd -j ACCEPT $ip -A OUTPUT -d $dc -p udp -m udp --dport $kpasswd -j ACCEPT gca=3268 $ip -A INPUT -s $dc -p tcp -m tcp --dport $gca -j ACCEPT $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $gca -j ACCEPT vgp=445 $ip -A INPUT -s $dc -p tcp -m tcp --dport $vgp -j ACCEPT $ip -A OUTPUT -d $dc -p tcp -m tcp --dport $vgp -j ACCEPT done # allow the machine to browse the internet $ip -A INPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT $ip -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT $ip -A INPUT -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT $ip -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT $ip -A INPUT -p tcp -m tcp --sport 8080 -m state --state RELATED,ESTABLISHED -j ACCEPT $ip -A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT # don't forget the dns... $ip -A INPUT -p udp -m udp --sport 53 -j ACCEPT $ip -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT $ip -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT $ip -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT # ... neither the ntp... (hora.rediris.es) #$ip -A INPUT -s 130.206.3.166 -p udp -m udp --dport 123 -j ACCEPT #$ip -A OUTPUT -d 130.206.3.166 -p udp -m udp --sport 123 -j ACCEPT $ip -A INPUT -p udp -m udp --dport 123 -j ACCEPT $ip -A OUTPUT -p udp -m udp --sport 123 -j ACCEPT # and last but not least, the snmp access for monitor in $snmprs ; do $ip -A INPUT -s $monitor -p tcp -m tcp --sport 161 -j ACCEPT # monitoring service $ip -A OUTPUT -d $monitor -p tcp -m tcp --dport 161 -j ACCEPT # monitoring service end # outgoing SMTP $ip -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT $ip -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT # temporary backup if we change from DROP to ACCEPT policies $ip -A INPUT -p tcp -m tcp --dport 1:1024 -j DROP $ip -A INPUT -p udp -m udp --dport 1:1024 -j DROP echo "OK. Check rules with iptables -L -n" # end :)
我已經使用它一段時間了,如果它使管理更容易,任何形式的修改都將非常感激。