Linux IPTables 常用规则及示例


本文将帮助您创建可直接用于日常需求的 IPTables 规则。这些示例将作为基本模板,您可以根据这些规则并结合您的具体需求来操作 iptables。

删除 IPTables 或现有规则

在开始构建新的 IPTables 规则集之前,您应该清理所有默认规则和现有规则。使用 IPTables flush 命令,以下是一些示例:

#iptables --flush
(or)
# iptables --F

默认策略链

默认策略为 ACCEPT,将 INPUT、FORWARD、OUTPUT 的策略更改为 DROP。

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

对于每个防火墙规则,我们需要定义两条规则,即一条用于入站,另一条用于出站。

如果我们信任内部用户,我们可以对入站规则使用 DROP,而默认出站将为 ACCEPT。

Learn Linux/Unix in-depth with real-world projects through our Linux/Unix certification course. Enroll and become a certified expert to boost your career.

允许 HTTP & HTTPS 入站连接

以下规则将允许所有 HTTP & HTTPS (80 & 443) 的入站流量。

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
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

仅允许 SSH 连接到网络

以下规则仅允许来自内部网络的出站 ssh 连接,这意味着我们只能从 192.168.87.0/24 网络进行 ssh 连接。

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

允许 TCP 流量的入站 MySQL 端口 (3306)。

以下示例展示了 eth0 网卡上 3306 端口 (mysql) 的入站和出站流量。

iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

允许特定网络的入站 MySQL 端口 (3306)

以下示例将允许特定网络 192.168.87.x 使用 3306 (mysql) 端口。

iptables -A INPUT -i eth0 -p tcp -s 192.168.87.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

使用单条规则允许多个端口

以下规则将允许来自外部的多个端口的入站连接,而不是编写多条规则,我们也可以像下面这样一起编写多端口规则。

这里,我们允许 mysql、Http 和 Https 在一条规则中。

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 3306,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 3306,80,443 -m state --state ESTABLISHED -j ACCEPT

允许出站 MySQL

这与入站连接不同,我们在 OUTPUT 链上允许新的和已建立的连接,而在 INPUT 中,我们只允许已建立的连接。

当我们尝试从 Linux 机器连接到 MySQL 服务器时,此规则将仅允许出站 MySQL 连接。

iptables -A OUTPUT -o eth0 -p tcp --dport 3306-m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

允许 Sendmail 流量

这些规则将允许使用 sendmail 或 postfix 25 端口发送邮件。

iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

允许 IMAP & POP3 端口

此规则将允许发送或接收来自 IMAP 或 POP3 的电子邮件。

iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

将 5722 端口转发到 22(SSH)

这些规则将转发来自 5722 端口的所有流量到 22 端口。这意味着,ssh 的入站连接可以来自 5722 和 22 端口。

iptables -t nat -A PREROUTING -p tcp -d 192.168.87.100 --dport 5722 -j DNAT --to 192.168.87.200:22

允许 873 (rsync) 端口进行备份

这些规则将允许您使用 rsync 从特定网络进行备份或复制数据。

iptables -A INPUT -i eth0 -p tcp -s 192.168.87.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

阻止 IP 地址

如果我们想阻止特定的 IP 地址。

BLOCK_ADDRESS="192.168.87.100"
# iptables -A INPUT -s "$BLOCK_ADDRESS" -j DROP

如果我们想阻止某些正在下载或尝试访问服务器的 IP 地址,这将非常有用,我们可以阻止该 IP 地址以进行进一步调查。

# iptables -A INPUT -i eth0 -s “$ BLOCK_ADDRESS ” -j DROP
# iptables -A INPUT -i eth0 -p tcp -s “$ BLOCK_ADDRESS ” -j DROP

以上示例将阻止 eth0 上针对该特定 IP 地址的 TCP/IP 流量。

如果要限制来自外部的服务器访问,可以在变量中添加网络。

通过使用以上 iptables 规则或修改规则和端口,我们可以保护连接或网络/服务器的安全。我们还可以根据需要修改网络或端口以适应我们的环境。这些 iptables 规则以简单的 shell 脚本格式编写,因此我们可以在编写 shell 脚本时将它们应用于多个服务器。

更新于:2020年1月31日

浏览量:10K+

开启你的职业生涯

完成课程获得认证

开始学习
广告