基本Linux防火墙iptables规则集合
本指南的目的是展示 Linux 系统中一些最常见的 iptables 命令。 iptables 是所有 Linux 发行版中内置的防火墙。即使是像 Ubuntu 这样的发行版(使用 ufw(简单的防火墙))和 Red Hat(使用 firewalld)仍然会将命令传递给 iptables 并在后台使用它。
掌握 iptables,或者至少熟悉一些最基本的命令,对于 Linux 管理员来说至关重要。即使是普通的 Linux 用户也可以从了解 iptables 防火墙的基础知识中受益,因为他们可能需要在某些时候对其应用一些小的配置。使用下面的一些示例来熟悉 iptables 语法并了解它如何保护您的系统。
警告
在您稍微熟悉 iptables 规则的工作原理之前,不应将其应用于生产系统。将规则应用于远程系统(已与其建立 SSH 会话的计算机)时也要小心,因为如果输入错误的规则,您可能会意外地将自己锁定。
在本教程中您将学习:
Linux基本防火墙iptables规则合集
查看Linux系统上配置的iptables规则
iptables 命令示例
您知道吗?
请注意 iptables 规则的顺序很重要。当您的系统收到网络流量数据包时,iptables 会将其与它可以匹配的第一条规则进行匹配。因此,如果您有一条接受 SSH 流量的规则,后跟一条拒绝 SSH 流量的规则,则 iptables 将始终接受该流量,因为该规则位于链中的拒绝规则之前。您始终可以通过在命令中指定规则编号来更改规则顺序。
规则:iptables 拒绝所有传出网络连接
规则的第二行仅允许当前传出和已建立的连接。当您通过 ssh 或 telnet 登录服务器时,这非常有用。
# iptables -F OUTPUT # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT # iptables -A OUTPUT -j REJECT
规则:iptables 拒绝所有传入网络连接
# iptables -F INPUT # iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # iptables -A INPUT -j REJECT
规则:iptables 拒绝所有网络连接
此规则将删除并阻止所有网络连接,无论传入还是传出。更重要的是,这还将包括当前正在建立的连接。
# iptables -F # iptables -A INPUT -j REJECT # iptables -A OUTPUT -j REJECT # iptables -A FORWARD -j REJECT
规则:iptables 丢弃传入的 ping 请求
此 iptables 规则将删除所有传入的 ping 请求。请注意,可以使用 REJECT 代替 DROP。 DROP 与 REJECT 之间的区别在于 DROP 会默默地丢弃传入的包,而 REJECT 将导致返回 ICMP 错误。
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
规则:iptables 删除传出的 telnet 连接
此 iptables 规则将阻止目标端口为 23(telnet)的任何主机的任何传出流量。
# iptables -A OUTPUT -p tcp --dport telnet -j REJECT
规则:iptables 拒绝传入的 telnet 连接
此 iptables 规则将拒绝所有发往本地端口 23 的传入连接请求。
# iptables -A INPUT -p tcp --dport telnet -j REJECT
规则:iptables 拒绝传出 ssh 连接
此 iptables 规则将拒绝来自本地端口 22 (ssh) 的所有传出连接。
# iptables -A OUTPUT -p tcp --dport ssh -j REJECT
规则:iptables 拒绝传入的 ssh 连接
拒绝所有到本地端口 22 (ssh) 的传入连接。
# iptables -A INPUT -p tcp --dport ssh -j REJECT
规则:iptables 拒绝除 ssh 和本地连接之外的所有传入流量
这些规则将拒绝所有到服务器的传入连接,端口 22 (SSH) 上的连接除外。它还将接受环回接口上的连接。
# iptables -A INPUT -i lo -j ACCEPT # iptables -A INPUT -p tcp --dport ssh -j ACCEPT # iptables -A INPUT -j REJECT
规则:iptables 接受来自特定 IP 地址的传入 ssh 连接
使用此 iptables 规则,我们将阻止所有到端口 22 (ssh) 的传入连接,IP 地址为 77.66.55.44 的主机除外。这意味着只有 IP 为 77.66.55.44 的主机才能进行 ssh。
# iptables -A INPUT -p tcp -s 77.66.55.44 --dport ssh -j ACCEPT # iptables -A INPUT -p tcp --dport ssh -j REJECT
规则:iptables 接受来自特定 MAC 地址的传入 ssh 连接
使用此 iptables 规则,我们将阻止所有到端口 22 (ssh) 的传入连接,但 MAC 地址为 00:e0:4c:f1:41:6b 的主机除外。换句话说,所有 ssh 连接将仅限于 MAC 地址为 00:e0:4c:f1:41:6b 的单个主机。
# iptables -A INPUT -m mac --mac-source 00:e0:4c:f1:41:6b -p tcp --dport ssh -j ACCEPT # iptables -A INPUT -p tcp --dport ssh -j REJECT
规则:iptables 拒绝特定 TCP 端口上的传入连接
以下 iptables 规则将丢弃 TCP 端口 3333 上的所有传入流量。
# iptables -A INPUT -p tcp --dport 3333 -j REJECT
规则:iptables 删除特定网络接口上的所有传入连接
以下规则将丢弃来自子网 192.168.0.0/16 的特定网络接口上的传入流量。这对于尝试删除所有欺骗性 IP 地址非常有用。如果 eth0 是外部网络接口,则来自内部网络的传入流量不应到达 eth0 网络接口。
# iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
规则:iptables 创建简单的 IP 伪装
以下规则将创建一个简单的 IP 伪装网关,以允许同一子网上的所有主机访问 Internet。下面指定的 eth0 是连接互联网的外部接口。
# echo "1" > /proc/sys/net/ipv4/ip_forward # iptables -t nat -A POSTROUTING -o $EXT_IFACE -j MASQUERADE
规则:拒绝除指定 IP 地址之外的所有传入 telnet 流量
以下 iptables 规则将拒绝除来自 IP 222.111.111.222 的连接请求之外的所有传入 telnet 流量
# iptables -A INPUT -t filter ! -s 222.111.111.222 -p tcp --dport 23 -j REJECT
规则:拒绝除指定 IP 地址范围之外的所有传入 ssh 流量
以下 iptables 规则将拒绝所有传入的 ssh 流量,除了来自 IP 地址范围 10.1.1.90 – 10.1.1.1.100 的连接请求。
去掉否定词“!”根据以下规则,拒绝来自 IP 地址范围 10.1.1.90 – 10.1.1.100 的所有 ssh 流量。
# iptables -A INPUT -t filter -m iprange ! --src-range 10.1.1.90-10.1.1.100 -p tcp --dport 22 -j REJECT
规则:iptables 拒绝所有发往特定远程主机的传出流量
以下 iptables 规则将拒绝 IP 地址为 222.111.111.222 的远程主机的所有传出流量
# iptables -A OUTPUT -d 222.111.111.222 -j REJECT
规则:iptables 阻止对特定网站的访问
以下 iptables 规则将阻止来自 facebook.com(源端口为端口 80/www)的所有传入流量。
# iptables -A INPUT -s facebook.com -p tcp --sport www -j DROP
请注意,上述 iptables 规则将阻止访问 facebook.com 以及 www.facebook.com。
结束语
在本指南中,我们看到了 Linux 基本 iptables 规则的集合。这包括一些通常应用于系统的最常见规则,例如阻止除来自特定 IP 地址的连接之外的 SSH 连接。使用这些规则将有助于增强您的服务器免受攻击的能力并提高整体安全性。请随意调整这些示例以适应您自己的场景。