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 脚本时将它们应用于多个服务器。