Web服务器的良好iptables启动规则?


12

我正在安装新的centos 5.4服务器,我想为mu iptables设置一套干净的规则来启动。

一开始的好规则是什么?

这是一个好的起点吗?

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

这个规则是什么:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

更新:

它将是具有FTP(必需),apache,SSH,mysql的Web服务器。


我使用这个简单的规则....关闭所有内容并向后工作,打开需要的内容。对于Web服务器,端口80/443通常是唯一面向公众的服务。阻止其他所有内容或限制访问-例如,将ssh限制为指定的IP或专用网络。
jeffatrackaid 2011年

Answers:


13

IPTables规则似乎最适合您的服务器。但我建议一些可能的更改:

  • 除非您需要允许从整个Internet进行SSH,MySQL和FTP访问,否则使用'--source'选项仅限制从某些批准的IP地址访问这些端口将更加安全。例如,要仅允许从IP地址71.82.93.101进行SSH访问,可以将第五条规则更改为“ iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT”。您可能需要为要允许的每个单独的IP地址添加一个单独的规则,有关此问题的更多信息,请参见此问题:iptables Multiple source IPs

  • 除非此计算机运行的是DNS服务器,否则您可能要阻止对“域”(53)端口的访问。为此,只需删除“ iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT”行。(这也应该回答您的最后一个问题,BTW。)但是,如果您实际上正在运行DNS服务器,请保留此规则。

  • 如果需要允许通过网络进行远程MySQL客户端访问,则需要添加“ iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT”行以打开对标准MySQL端口的外部访问。但是除非真正必要,否则不要这样做-如果您只需要本地MySQL访问(例如,对于在Apache下运行的PHP应用程序),则不需要提供远程MySQL访问。并且除非您有冒被黑客攻击的风险,否则,如果您确实打开了网络的端口3306,请确保为所有MySQL用户帐户都要求使用强密码,并且您的MySQL服务器软件包是最新的。

  • 您的评论之一(“允许ssh,dns,ldap,ftp和Web服务”)提到了LDAP服务,但是您的配置中没有这样的规则。复制示例配置并对其进行修改时,这在我身上经常发生。它不会影响功能,但是我会修复注释,因为误导性注释可能会因将来使您或其他管理员感到困惑而间接引起。

以我的经验,很难提出一套完善的IPTables规则,但是我认为您肯定是在正确的道路上。此外,祝您学习更多有关IPTables的运气好-这些规则乍看起来似乎很复杂,但这对于任何Linux系统管理员来说都是非常有用的技能。


1
无需允许通过防火墙的远程MySQL访问,您只需确保需要访问MySQL服务器的每个人都有权进行SSH端口转发。
ptman 2010年

SSH端口转发是打开端口并锁定MySQL权限的潜在替代方法。但是除非他正在处理敏感数据和/或他是一个备受瞩目的目标(这将使SSH的加密功能有用),否则我看不到优势。毕竟,SSH隧道有其自身的缺点,包括:安装/配置麻烦;提高CPU利用率并限制带宽(由于OpenSSH的静态缓冲区大小)。如果他不希望所有远程MySQL客户端都具有本地登录名怎么办?
瑞安·林奇

至于不符合规定的评论得好,ICMP规则允许路由跟踪,PMTU发现,和其他有用的信息,但他们不会允许坪(回声请求和回声应答)。
Gerald Combs 2010年

杰拉德(Gerald),这很不错,我什至没有注意到。他可能应该更改注释以注意不允许ping,或者应该添加允许ICMP回显请求/回复流量的规则。
瑞安·林奇

4

绝对也要限制您的出站流量。

我已经看到很多情况,PHP漏洞导致某人使用“ curl”或“ wget”从其他地方获取恶意代码,然后在服务器上执行它以加入僵尸网络。

如果您不希望Apache(例如)需要与其他网站本身进行通信,请限制访问量,并省去一些麻烦!


2

这些规则可以通过“ iptables-restore”导入:

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

仅作记录...如果未使用上述iptables-restore,也应设置这些默认策略:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

我已经编辑了您的帖子-StackOverflow是一种问题/答案格式。请阅读常见问题解答:stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705 2013年

由于有状态规则在此处排在最后,因此将引入性能问题,并且由于它与绝大多数数据包匹配,因此应该首先出现。
迈克尔·汉普顿

0

为什么允许ftp和dns?您的服务器是否提供这些服务?不应真正使用FTP,除了某些非常特殊的用例外,请改用SFTP(而不是FTPS)。另外,为什么还要用符号名称指定所有其他端口,并用数字80指定http?您只是从其他地方复制过来的吗?没有复制和建议将弥补缺乏理解。确保您了解TCP,IP,防火墙以及要提供的服务协议。


我并不是要冒犯,ptman,但我认为您的回答可能被认为是不礼貌和屈尊的。另外,您并没有真正回答这个问题。如果提问者缺乏理解力,您是否认为最好有礼貌地讲话,并对他进行一些特定的教育?
瑞安·林奇

你可能是正确的。我的评论听起来可能是负面的,但并非如此。我试图列出会触发相关思考过程的问题。而且由于我不了解基础知识,所以我没有开始写教科书。但是您对无用的语气绝对是正确的。幸运的是,您已经写了一个更有帮助的答案。
ptman 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.