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 规则。
- 创建规则文件:
- 首先,将您希望应用的 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)上的所有流量。
- 允许已建立和相关的连接:允许与现有连接相关的入站和出站流量。
- 使用
iptables-apply
应用规则:
- 打开终端。
- 运行以下命令:
sudo iptables-apply /tmp/iptables.rules
* `sudo`: 因为修改 iptables 规则需要超级用户权限。
* `iptables-apply`: 这是命令本身。
* `/tmp/iptables.rules`: 这是您创建的规则文件的路径。
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 规则,确保您不会失去对服务器的访问。
- 如果 SSH 连接测试成功,回到您运行
-
保存:
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 允许该流量,它也无法到达服务器。