我已经编写了我的第一个 IPtables 规则文件,以尝试保护除 SSH 和 Web 所需端口之外的所有端口上的服务器。
这就是我想出的:
i=/sbin/iptables
# Flush all rules
$i -F
$i -X
# Setup default filter policy
$i -P INPUT DROP
$i -P OUTPUT DROP
$i -P FORWARD DROP
# Allow unlimited traffic on loopback
$i -A INPUT -i lo -j ACCEPT
$i -A OUTPUT -o lo -j ACCEPT
# Open up ports for nginx
$i -A INPUT -p tcp --dport 443 -j ACCEPT
$i -A INPUT -p tcp --dport 80 -j ACCEPT
$i -A INPUT -p tcp --dport 22 -j ACCEPT
# Make sure nothing comes or goes out of this box
$i -A INPUT -j DROP
$i -A OUTPUT -j DROP
我知道 IP 表方面有点暗黑艺术,所以我想知道是否有人可以参与进来,看看这是否是保护 Web 服务器安全的正确方法。
答案1
您可能不想断开所有传出连接。
你可能希望尽早添加一条规则以允许已建立的连接,并且如果使用 ftp 之类的协议,你可能也会将相关项添加到规则中,例如
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
记住规则顺序很重要——先比赛的获胜。
您可能应该看看我们关于保护 Web 服务器安全的问答保护 LAMP 服务器的技巧它包含大量有用的信息。
答案2
你遗漏了-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
某个地方。此外,我不会丢弃所有传出的数据包。
答案3
输入链
允许创建新会话。@Lain 的回答有一个小问题,它不执行状态检查。这可以通过执行以下操作来实现:
-A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
允许已建立的会话
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
输出链
选项1
允许所有出站流量
-P OUTPUT ACCEPT
选项 #2
仅允许回复已接受输入的出站流量。如果您想强制出站流量,这将很有用。
-P OUTPUT DROP
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
接受出站流量的示例规则
-A OUTPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
。 。 。
最后需要注意的是,将包含“-m state --state ESTABLISHED,RELATED”的规则放在规则集的顶部附近,因为它们经常会被匹配。发起会话的规则只会在会话中使用一次。