服务器上如何使用iptable防火墙??

1. iptables 配置(仅开放22端口):

iptables 是 Linux 系统中用于配置内核防火墙(Netfilter)的工具。它通过一系列规则来控制网络流量的进出。

一、手动配置步骤:

  • 允许已建立的连接和相关流量(防止失联):
    为了使服务器能够响应已建立的连接(例如,您通过 SSH 连接到服务器后,服务器需要能够将响应发送回您),我们需要允许与已建立连接相关的流量。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  • 清空现有规则(谨慎操作!):
    在开始配置之前,通常建议先清空 iptables 的现有规则。这可以避免旧规则的干扰。但请注意,这可能会导致您暂时失去对服务器的 SSH 访问,因此请确保您有其他方式可以访问服务器(例如,通过服务器提供商的控制台)。
sudo iptables -F  # 清空 INPUT、OUTPUT、FORWARD 链
sudo iptables -X  # 删除自定义链
sudo iptables -t nat -F  # 清空 NAT 表
sudo iptables -t nat -X  # 删除 NAT 表中的自定义链
sudo iptables -t mangle -F  # 清空 Mangle 表
sudo iptables -t mangle -X  # 删除 Mangle 表中的自定义链
  • 设置默认策略:
    默认策略是指当数据包与任何规则都不匹配时采取的操作。通常,我们会将 INPUT、OUTPUT 和 FORWARD 链的默认策略设置为 DROP,这意味着丢弃所有不符合规则的数据包。
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP
  • 允许回环(Loopback)流量:
    回环接口(lo)是用于本地进程间通信的虚拟网络接口。我们需要允许所有流经回环接口的流量。
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
  • 允许 SSH 流量(22 端口):
    这是关键的一步,允许通过 22 端口的 SSH 流量进入服务器。
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# 允许来自服务器的新连接
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
  • 允许 80 和 443 端口的流量:

在您现有的 iptables 规则基础上,添加以下规则:

sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

命令解释:

  • sudo iptables -A INPUT ...: 这部分表示我们要向 INPUT 链添加一条规则。INPUT 链控制进入服务器的流量。

  • -p tcp: 这指定了规则适用的协议,这里是 TCP 协议。HTTP 和 HTTPS 都使用 TCP 协议。

  • --dport 80: 这指定了目标端口(destination port)为 80。这是 HTTP 协议的默认端口。

  • --dport 443: 这指定了目标端口为 443。这是 HTTPS 协议的默认端口。

  • -m conntrack --ctstate NEW,ESTABLISHED: 这使用了 conntrack 模块,它可以跟踪连接的状态。

    • NEW: 表示这条规则适用于新建立的连接(客户端首次向服务器发送请求)。
    • ESTABLISHED: 表示这条规则适用于已经建立的连接(服务器响应客户端,或后续的数据传输)。
  • -j ACCEPT: 这表示如果数据包符合上述条件,就接受(允许)它。

  • -A OUTPUT: 这部分表示我们要向 OUTPUT链添加一条规则。OUTPUT链控制服务器出去的流量。

  • --sport: 源端口

  • 允许出站流量:
    如果希望允许来自服务器所有出站的流量,可以做如下配置:

 sudo iptables -P OUTPUT ACCEPT

在之前的配置中,sudo iptables -P OUTPUT DROP, 这意味着禁止所有出站流量,这可能会阻止您的服务器访问其他网络资源。

  • 保存 iptables 规则:
    iptables 规则默认情况下不会在系统重启后自动加载。您需要使用以下命令来保存规则(在 Ubuntu 上):
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload

二、如何使用 iptables-apply 命令来安全地应用 iptables 规则。

  1. 创建规则文件:
  • 首先,将您希望应用的 iptables 规则保存到一个文本文件中。这个文件通常被称为规则文件,您可以将其命名为 /tmp/iptables.rules(或者您喜欢的任何其他位置和名称)。
  • 使用您喜欢的文本编辑器(如 nano、vim 或 gedit)创建并编辑此文件。
nano /tmp/iptables.rules
  • 将您的 iptables 规则以正确的格式写入此文件。
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# 允许 SSH 连接 (端口 22)
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 允许 HTTP 和 HTTPS 连接
-A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

# 允许环回接口 (lo) 的流量
-A INPUT -i lo -j ACCEPT

# OUTPUT 链 (通常不需要特别修改,除非您有特殊需求)
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

COMMIT

添加规则以打开端口 40000

INPUT 链中添加一条规则,允许通过 TCP 协议访问端口 40123 的新连接和已建立的连接。以下是应该添加到 iptables 配置中的规则:

-A INPUT -p tcp --dport 40123 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

这个规则文件做了几件事:

  • 设置默认策略:INPUT 链为 DROP(阻止所有未明确允许的入站流量),FORWARD 链为 DROP(阻止所有转发流量),OUTPUT 链为 ACCEPT(允许所有出站流量)。
    • 允许 SSH:允许通过端口 22 进行新的和已建立的 SSH 连接。
    • 允许 HTTP/HTTPS: 允许80/443端口
    • 允许环回流量:允许本地环回接口(lo)上的所有流量。
    • 允许已建立和相关的连接:允许与现有连接相关的入站和出站流量。
  1. 使用 iptables-apply 应用规则:
  • 打开终端。
  • 运行以下命令:
sudo iptables-apply /tmp/iptables.rules
* `sudo`: 因为修改 iptables 规则需要超级用户权限。
* `iptables-apply`: 这是命令本身。
* `/tmp/iptables.rules`: 这是您创建的规则文件的路径。
  1. iptables-apply 的工作原理和提示:
  • 测试应用: iptables-apply 首先会尝试将规则加载到 iptables 中。
  • 等待确认: 加载后,它会显示一个提示,通常如下所示:
iptables-apply: loaded rules from /tmp/iptables.rules
Proceed with applying the changes? [N/y]

它会等待您的确认。默认情况下,如果您在一段时间内(通常是 10 秒)不输入 y并按 Enter 键,它会自动认为您不满意,并回滚到之前的 iptables 配置。

  • 测试连接(关键步骤): 在您输入 y 确认之前,立即打开一个新的终端窗口或 SSH 会话,并尝试通过 SSH 连接到您的服务器(使用端口 2024):
ssh ubuntu@your_server_ip -p 22
* `ubuntu`: 您的用户名。
* `your_server_ip`: 您的服务器的 IP 地址。
* `-p 22`: 指定 SSH 端口为 22。如果连接成功,说明新规则没有阻止您的 SSH 连接。
  • 确认或回滚:

    • 如果 SSH 连接测试成功,回到您运行 iptables-apply 的终端,输入 y 并按 Enter 键确认应用规则。
    • 如果 SSH 连接测试失败,或者您在超时时间内没有进行任何操作,iptables-apply 会自动回滚到之前的 iptables 规则,确保您不会失去对服务器的访问。
  • 保存: iptables-apply 应用的规则在重启后不会自动保留。要使规则在重启后仍然有效,您需要使用特定于您的 Linux 发行版的方法来保存 iptables 规则。 在 Ubuntu 上,您可以使用 iptables-persistent

sudo apt-get install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

2. iptables 与网络安全组的关系:

  • iptables:
    • 主机级防火墙: iptables 工作在服务器的操作系统层面,直接控制进出服务器的网络流量。
    • 精细控制: 您可以使用 iptables 进行非常精细的配置,例如,基于端口、协议、IP 地址、连接状态等来过滤流量。
    • 本地管理: iptables 规则存储在服务器本地,并通过命令行工具进行管理。
  • 网络安全组(Network Security Groups, NSGs):
    • 云服务提供商层面: 网络安全组通常是由云服务提供商(如 AWS、Azure、Google Cloud 等)提供的。它们在云平台的网络层面上工作,控制进出云资源的流量。
    • 虚拟网络层面: 网络安全组通常与虚拟网络(VPC)或子网相关联,可以控制整个子网或特定虚拟机的流量。
    • 集中管理: 您可以通过云服务提供商的控制台或 API 来管理网络安全组,通常比 iptables 更容易配置和管理。
  • 两者关系:
    • 互补关系: iptables 和网络安全组可以一起使用,提供多层安全防护。网络安全组提供第一道防线,iptables 在服务器内部提供更精细的控制。
    • 优先级: 如果同时配置了网络安全组和 iptables,通常网络安全组的规则会先被应用。如果网络安全组阻止了某个流量,那么即使 iptables 允许该流量,它也无法到达服务器。
1 Like