我一直在试图把一个基本的服务器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),但是像我这样的人很难理解为我们的服务器制作安全的基本防火墙的一切。
什么是最安全的方式来打开Web服务器所需的基本端口?
更新: cyberciti.biz有另一个iptables脚本 ,看起来不错。
此外,而不是使用Denyhosts或fail2ban,你可以使用iptables本身阻止在SSH重复尝试不良 。
使用iptables最安全的方式是closures所有东西,只打开你所需要的东西。 我有点心不在焉,所以我总是尽可能的懒,所以我不会犯错误,导致服务器不安全。
我使用这个,为了使它工作,只有一点点的变化。
#!/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 :)
我已经使用了一段时间了,如果pipe理更容易,任何修改都将非常感激。
这看起来不错,但是你可以稍微收紧一点。 -s标志是源IP或域名,并且添加“-s 198.23.12.32”或任何您的IP地址只允许来自您的源IP的SSH。 您也可以使用CIDR风格表示法来select一系列源IP。
logging被拒绝的电话时应该小心。 您的服务器的IP地址将被机器人,脚本小子等扫描,日志文件可能会变得很快。 除非您正在尝试诊断您认为可能与试图破坏防火墙的人相关的特定问题,否则我将删除此选项。
您也可以将fail2ban绑定到iptables以获得伪IDS。 fail2ban会扫描你的日志文件,如果试图强行进入你的系统,可以阻止一个IP。 例如,如果某个IP地址无法loginSSH 5次,则可以locking一整天。 它也适用于FTP和许多其他(包括坏机器人攻击Apache)。我用它在我所有的服务器上提供一些额外的缓冲,从蛮力攻击。
看看Shorewall。 单接口默认configuration将是一个很好的起点。 它很容易configuration,并具有诸如SSH和Web访问之类的macros。 可以configuration防火墙closures时将服务器locking到所需的级别。 使用Shorewall-lite,您可以在另一台服务器上运行防火墙。 logging很容易configuration到所需的水平。
对于基本的HTTP服务器,如果您使用HTTPS,则希望打开对端口80和端口443的传入访问。 通常需要SSH从一些受限地址访问。 您也可能想locking传出访问权限。 仅将防火墙打开到所需的服务器和服务。 应该打开NTP和DNS,以及一个获取补丁的渠道。
我会说这是一个非常好的防火墙,除了它是面向停止入站stream量,而不是侧重于出站或出站stream量。 在许多情况下,同样重要的是把重点放在从盒子出站的连接上。 在机器被实际利用的不幸情况下,能够防止下载额外的root工具包,或者连接到命令和控制节点,或者其他任何东西,这将是很好的。
BillThor开始讨论这个问题,但我只是回答具体的例子。 关于iptables的好处之一是它可以记住连接状态,这可能会对大量被贩运的网站有性能影响,但是你可以改变你在http / https上的入站访问权限,例如只允许在已build立的连接上回复,或者特别限制某些非特权用户完全没有出站访问权限。 那么你的出站规则就会有RELATED,ESTABLISHED子句,这样可以防止大量的辅助攻击,并减缓那些需要第二阶段才能真正利用一个盒子的东西,这是很常见的。
最后,我会说,最好是设置你的iptables策略-P DROP,而不是在最后加上REJECT。 这主要是一个偏好的问题,但可以减less错误,而不是插入或刷新/重置附加到现有规则链。