Linux IPTables:传入和传出的规则示例(SSH 和 HTTP)

举报
Tiamo_T 发表于 2021/09/20 16:10:50 2021/09/20
【摘要】 在我们之前的 IPTables 防火墙系列文章中,我们回顾了如何使用“iptables -A”添加防火墙规则。我们还解释了如何允许传入的 SSH 连接。在高层次上,它包括以下 3 个步骤。删除所有现有规则:“iptables -F”仅允许传入 SSH:“iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT”丢弃所有其他传入数据包:“ipta...

在我们之前的 IPTables 防火墙系列文章中,我们回顾了如何使用“iptables -A”添加防火墙规则

我们还解释了如何允许传入的 SSH 连接。在高层次上,它包括以下 3 个步骤。

  1. 删除所有现有规则:“iptables -F”
  2. 仅允许传入 SSH:“iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT”
  3. 丢弃所有其他传入数据包:“iptables -A INPUT -j DROP”

以上工作。但它并不完整。上述步骤的一个问题是它不限制传出的数据包。

默认链策略

链的默认策略是 ACCEPT。如果你不明白链是什么意思,你最好阅读我们的iptables 介绍文章。因此,INPUT 和 OUTPUT 链的默认策略都是 ACCEPT。在上面的 3 个步骤中,我们最后丢弃了所有传入的数据包(传入的 ssh 除外)。但是,我们没有限制传出流量。

正如您在下面注意到的,它在所有三个链名称(INPUT、OUTPUT 和 FORWARD)旁边都写着“(policy ACCEPT)”。这表明默认的链策略是 ACCEPT。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

所以,你在这里有两个选择。

选项 1:添加丢弃规则

最后,添加以下三个丢弃规则,将丢弃所有传入、传出和转发数据包(除了在这三个规则之上定义的那些)。如果你这样做,默认的链策略仍然是 ACCEPT,这无关紧要,因为无论如何你都会在最后丢弃所有数据包。


iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP

选项 2:将默认链策略更改为 DROP

开始时,执行以下三个命令,将链的默认策略更改为 DROP。

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

现在,如果您添加允许 ssh 规则:“iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT”,并执行 iptables -L,您会注意到它旁边写着“(policy DROP)”所有三个链。

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination

但是这里有一个问题。允许 ssh 传入连接规则将不再起作用,因为所有传出数据包都被丢弃。

允许传入连接

当 INPUT 和 OUTPUT 链的默认策略为 DROP 时,对于每个传入的防火墙规则,您需要指定以下两个规则。

  1. 请求规则:这是从客户端到服务器的传入连接的请求。
  2. 响应规则:这是针对从服务器发出到客户端的响应(针对相应的传入请求)。

示例 1:允许传入的 SSH 连接

这是为了允许从外部到您的服务器的 SSH 连接。即您可以从外部 ssh 到您的服务器。

这包括两个步骤。首先,我们需要允许传入的新 SSH 连接。一旦允许传入 ssh 连接,我们还需要允许该传入 ssh 连接返回响应。

首先,允许传入的 SSH 连接请求,如下所示。

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

在上面的例子中:

  • iptables -A INPUT:将新规则附加到 INPUT 链。对于传入的连接请求,这始终必须是 INPUT。
  • -i eth0:这是指输入接口。对于传入连接,这始终必须是“-i”。
  • -p tcp:表示这是针对 TCP 协议的。
  • –dport 22:这是指传入连接的目标端口。端口 22 用于 ssh。
  • -m state:这表示使用了“state”匹配模块。我们将在以后的文章中更多地讨论“-m”选项(以及所有可用的 iptables 匹配模块)。
  • –state NEW, ESTABLISHED:“状态”匹配模块的选项。在这个例子中,只允许 NEW 和 ESTABLISHED 状态。第一次从客户端向服务器发起 SSH 连接请求时,使用 NEW 状态。ESTABLISHED 状态用于从客户端到服务器的所有进一步请求。

接下来,允许传出(仅限 ESTABLISHED 状态)SSH 连接响应(针对相应的传入 SSH 连接请求)。

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

在上面的例子中:

  • iptables -A OUTPUT:将新规则附加到 OUTPUT 链。由于这是针对从服务器发出的响应规则(针对相应的传入请求),因此应为 OUTPUT。
  • -o eth0:这是指输出接口。对于传出连接,这始终必须是“-o”。
  • -p tcp:表示这是针对 TCP 协议的。
  • –sport 22:这是指传出连接的源端口。端口 22 用于 ssh。由于传入请求(来自之前的规则)来到“目标”端口,传出响应将通过“源”端口。
  • -m state:这表示使用了“state”匹配模块。
  • –state ESTABLISHED:由于这是一个响应规则,我们只允许 ESTABLISHED 连接(而不是任何 NEW 连接)。

示例 2:允许传入的 HTTP 连接

这是为了允许从外部到您的服务器的 HTTP 连接。即您可以从外部查看您在服务器上运行的网站。

就像上面的SSH传入规则一样,这也涉及两个步骤。首先,我们需要允许传入的新 HTTP 连接。一旦允许传入的 HTTP 连接,我们需要允许响应传入的 HTTP 连接。

首先,允许传入的 HTTP 连接请求,如下所示。

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

接下来,允许传出(仅限 ESTABLISHED)HTTP 连接响应(用于相应的传入 SSH 连接请求)。

iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

注意:在上面的 HTTP 请求和响应规则中,除了端口号之外,一切都与 SSH 示例相同。

允许传出连接

当 INPUT 和 OUTPUT 链的默认策略为 DROP 时,对于每个传出防火墙规则,您需要指定以下两个规则。

  1. 请求规则:这是从服务器向外发出的请求,用于传出连接。
  2. 响应规则:这是针对从外部返回到服务器的响应(针对相应的传出请求)。

示例 3:允许传出 SSH 连接

这是为了允许从您的服务器到外部的 SSH 连接。即您可以从您的服务器 ssh 到外部服务器。

这包括两个步骤。首先,我们需要允许传出新的 SSH 连接。一旦允许传出 ssh 连接,我们还需要允许该传出 ssh 连接返回响应。

首先,允许传出 SSH 连接请求,如下所示。

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

在上面的例子中:

  • iptables -A OUTPUT:将新规则附加到 OUTPUT 链。对于传出连接请求,这始终必须是 OUTPUT。
  • -o eth0:这是指输出接口。对于传出连接,这始终必须是“-o”。
  • -p tcp:表示这是针对 TCP 协议的。
  • –dport 22:这是指传出连接的目标端口。
  • -m state:表示使用“state”匹配模块。
  • –state NEW, ESTABLISHED:“状态”匹配模块的选项。在这个例子中,只允许 NEW 和 ESTABLISHED 状态。第一次从服务器向外部发起SSH连接请求时,使用NEW状态。ESTABLISHED 状态用于从服务器到外部的所有进一步请求。

接下来,允许传出(仅限 ESTABLISHED)SSH 连接响应(针对相应的传入 SSH 连接请求)。

iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

在上面的例子中:

  • iptables -A INPUT:将新规则附加到 INPUT 链。由于这是针对从外部到服务器的响应规则(针对相应的传出请求),因此应该是 INPUT。
  • -i eth0:这是指输入接口。对于传入连接,这始终必须是“-i”。
  • -p tcp:表示这是针对 TCP 协议的。
  • –sport 22:这是指传入连接的源端口。由于传出请求(来自之前的规则)到达“目标”端口,因此传入响应将来自“源”端口。
  • -m state:这表示使用了“state”匹配模块。
  • –state ESTABLISHED:由于这是一个响应规则,我们只允许 ESTABLISHED 连接(而不是任何 NEW 连接)。

把这一切放在一起

创建执行以下操作的 rules.sh shell 脚本:

  1. 删除所有现有规则
  2. 设置默认链策略
  3. 允许入站 SSH
  4. 允许入站 HTTP
  5. 允许出站 SSH

首先,创建rules.sh

$ vi rules.sh
# 1. Delete all existing rules
iptables -F

# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# 3. Allow incoming SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# 4. Allow incoming HTTP
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# 5. Allow outgoing SSH
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

接下来,执行 rules.sh 并查看规则。

# chmod u+x rules.sh

# ./rules.sh

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source      destination
ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:ssh state NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:http state NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp spt:ssh state ESTABLISHED 

Chain FORWARD (policy DROP)
target     prot opt source      destination         

Chain OUTPUT (policy DROP)
target     prot opt source      destination
ACCEPT     tcp  --  anywhere    anywhere      tcp spt:ssh state ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp spt:http state ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:ssh state NEW,ESTABLISHED

以此为基础,您应该能够编写自己的传入和传出 iptables 防火墙规则。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。