iptables的要领:通用防火墙规则和命令

iptables的是附带大多数Linux发行版默认的软件防火墙。这小抄式指南提供了一个快速参考,这将创建防火墙规则是普通的日常情况下非常有用的iptables命令。这包括允许和通过端口,网络接口,和源IP地址阻塞各种服务的iptables的例子。

介绍

Iptables是默认情况下包含在大多数Linux发行版中的软件防火墙。 这个欺骗表单样式指南提供了一个快速参考iptables命令,将创建防火墙规则在常见的日常场景中是有用的。 这包括iptables示例,允许和阻止各种服务的端口,网络接口和源IP地址。

如何使用本指南

  • 如果你是刚开始使用防火墙配置你的iptables,看看我们介绍的iptables
  • 大多数此处描述的规则假定你的iptables设置为DROP传入流量,通过默认输入的政策,并希望有选择地允许交通
  • 使用随后的章节适用于您要实现的内容。 大多数节不是基于任何其他节,因此您可以独立使用下面的示例
  • 使用此页面右侧的“内容”菜单(以宽页面宽度)或浏览器的查找功能,找到所需的部分
  • 复制并粘贴给出的命令行示例,将红色的值替换为您自己的值

请记住,您的规则的顺序很重要。 所有这些的iptables命令使用-A选项将新规则附加到链的末端。 如果你想要把它别的地方链,您可以使用-I选项,允许您指定新规则的位置(或者干脆不指定规则编号将其放置在链的开头)。

注意:当使用防火墙时,注意不要通过阻断交通SSH(端口22,默认情况下)把自己锁了自己的服务器。 如果你输了,由于你的防火墙设置访问权限,您可能需要通过控制台连接到它解决您的访问。 通过控制台连接后,您可以更改防火墙规则以允许SSH访问(或允许所有流量)。 如果您保存的防火墙规则允许SSH访问,另一种方法是重新启动服务器。

请记住,你可以查看与您当前的iptables规则集sudo iptables -Ssudo iptables -L

让我们来看看iptables命令!

保存规则

Iptables规则是短暂的,这意味着它们需要手动保存以供重新启动后保持。

Ubuntu

在Ubuntu上,最简单的方法来保存iptables规则,所以他们会生存重新启动,是使用iptables-persistent包。 使用apt-get安装它,像这样:

sudo apt-get install iptables-persistent

在安装过程中,您将询问是否要保存当前的防火墙规则。

如果更新防火墙规则并要保存更改,请运行以下命令:

sudo invoke-rc.d iptables-persistent save

CentOS 6和更旧版本

在CentOS 6及以上-的CentOS 7使用FirewallD在默认情况下,你可以使用iptables初始化脚本保存iptables规则:

sudo service iptables save

这将您当前的iptables规则保存到/etc/sysconfig/iptables文件。

列出和删除规则

如果您想了解如何列出和删除iptables规则,看看这个教程: 如何列出和删除iptables防火墙规则

一般有用的规则

本节包括各种iptables命令,这些命令将创建在大多数服务器上通常有用的规则。

允许回送连接

Loopback接口,也被称为lo ,就是一台电脑用来进行网络连接到自身。 例如,如果运行ping localhostping 127.0.0.1 ,您的服务器将使用环回ping通本身。 如果将应用程序服务器配置为使用“localhost”地址连接到数据库服务器,那么也将使用回送接口。 因此,您需要确保防火墙允许这些连接。

要接受您的环回接口上的所有流量,请运行以下命令:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

如网络通信通常需要是双向-传入和传出到正常工作,这是典型的创建允许建立相关的传入通信防火墙规则,使得服务器将允许返回通信到由服务器发起的传出连接本身。 此命令将允许:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

允许建立传出连接

您可能要允许所有已建立的连接,这是典型的合法传入连接响应传出流量。 此命令将允许:

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

内部到外部

假设eth0是外部网络和eth1是你的内部网络,这将让你的内部访问外部:

sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

丢弃无效的数据包

一些网络流量的数据包得到标记为无效 有时,记录此类型的数据包可能很有用,但通常它们可以删除它们。 使用此命令执行此操作:

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

阻止IP地址

要阻止网络连接从一个特定的IP地址发起, 15.15.15.51例如,运行以下命令:

sudo iptables -A INPUT -s 15.15.15.51 -j DROP

在这个例子中, -s 15.15.15.51指定“15.15.15.51”的一个 IP地址。 源IP地址可以在任何防火墙规则中指定,其中包括允许规则。

如果你要拒绝 ,而不是连接,将与“拒绝”这样对连接请求作出回应以“连接被拒绝”的错误,将“DROP”:

sudo iptables -A INPUT -s 15.15.15.51 -j REJECT

阻止与网络接口的连接

要阻止来自特定IP地址的连接,例如15.15.15.51到一个特定的网络接口,如eth0 ,使用这个命令:

iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP

这是相同的前面的例子,通过加入-i eth0 网络接口可以在任何防火墙规则中指定,并且是将规则限制到特定网络的好方法。

服务:SSH

如果您使用云服务器,则可能需要允许传入SSH连接(端口22),以便可以连接和管理服务器。 本节介绍如何使用各种SSH相关规则配置防火墙。

允许所有传入的SSH

要允许所有传入的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

如果第二个命令,允许建立 SSH连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许从特定IP地址或子网传入SSH

要允许来自特定IP地址或子网的传入SSH连接,请指定源。 例如,如果你想使整个15.15.15.0/24子网,运行以下命令:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果第二个命令,允许建立 SSH连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许传出SSH

如果您的防火墙OUTPUT策略未设置为ACCEPT ,并且要允许传出的SSH连接,您的服务器启动SSH连接到另一台服务器,你可以运行下面的命令:

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

允许从特定IP地址或子网接收Rsync

Rsync在端口873上运行,可用于将文件从一台计算机传输到另一台计算机。

要允许来自特定IP地址或子网的传入rsync连接,请指定源IP地址和目标端口。 例如,如果你想使整个15.15.15.0/24子网能够Rsync在你的服务器上,运行以下命令:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果第二个命令,允许建立的rsync连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

服务:Web服务器

Web服务器(如Apache和Nginx)通常分别监听端口80和443上的HTTP和HTTPS连接的请求。 如果将传入流量的默认策略设置为drop或deny,您将需要创建允许服务器响应这些请求的规则。

允许所有传入的HTTP

要允许所有传入的HTTP(端口80)连接运行以下命令:

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

如果第二个命令,允许建立 HTTP连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许所有传入的HTTPS

要允许所有传入的HTTPS(端口443)连接运行以下命令:

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

如果第二个命令,允许建立 HTTP连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许所有传入的HTTP和HTTPS

如果你想同时允许HTTP和HTTPS流量,可以使用多端口模块来创建一个规则,允许两个端口。 要允许所有传入的HTTP和HTTPS(端口443)连接运行以下命令:

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

如果第二个命令,允许建立 HTTP和HTTPS连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

服务:MySQL

MySQL侦听端口3306上的客户端连接。如果远程服务器上的客户端正在使用MySQL数据库服务器,则需要确保允许该流量。

从特定IP地址或子网允许MySQL

要允许来自特定IP地址或子网的传入MySQL连接,请指定源。 例如,如果你想使整个15.15.15.0/24子网,运行以下命令:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果第二个命令,允许建立 MySQL连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许MySQL到特定的网络接口

要允许特定的网络接口,说你有一个专用网络接口,MySQL连接eth1 ,例如,使用以下命令:

sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果第二个命令,允许建立 MySQL连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

服务:PostgreSQL

PostgreSQL侦听端口5432上的客户端连接。如果远程服务器上的客户端正在使用您的PostgreSQL数据库服务器,则需要确保允许该流量。

PostgreSQL从特定的IP地址或子网

要允许从特定IP地址或子网传入PostgreSQL连接,请指定源。 例如,如果你想使整个15.15.15.0/24子网,运行以下命令:

sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果第二个命令,允许建立的PostgreSQL连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许PostgreSQL到特定的网络接口

为了让PostgreSQL的连接到特定的网络接口,说你有一个专用网络接口eth1 ,例如,使用以下命令:

sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果第二个命令,允许建立的PostgreSQL连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

服务:邮件

邮件服务器(例如Sendmail和Postfix)根据用于邮件传递的协议在各种端口上侦听。 如果您正在运行邮件服务器,请确定您正在使用哪些协议,并允许相应类型的流量。 我们还将向您展示如何创建规则以阻止传出SMTP邮件。

阻止发送SMTP邮件

如果您的服务器不应发送外发邮件,则可能需要阻止此类流量。 要阻止使用端口25的传出SMTP邮件,请运行以下命令:

sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

这将配置iptables以拒绝所有出站流量在端口25上。如果你需要通过端口号拒绝不同的服务,而不是25端口,只需更换它。

允许所有传入SMTP

要允许服务器响应SMTP连接(端口25),请运行以下命令:

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

如果第二个命令,允许建立 SMTP连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

注:这是常见的的SMTP服务器使用端口587的出站邮件。

允许所有收到的IMAP

要允许服务器响应IMAP连接(端口143),请运行以下命令:

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

如果第二个命令,允许建立 IMAP连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许所有传入的IMAPS

要允许服务器响应IMAPS连接,端口993,请运行以下命令:

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

如果第二个命令,允许建立连接IMAPS的传出流量,只需要OUTPUT的政策未设置为ACCEPT

允许所有传入的POP3

要允许服务器响应POP3连接,端口110,请运行以下命令:

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

如果第二个命令,允许建立 POP3连接发送的报文,只需要OUTPUT的政策未设置为ACCEPT

允许所有传入的POP3S

要允许服务器响应POP3S连接,端口995,请运行以下命令:

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

如果第二个命令,允许建立连接POP3S的传出流量,只需要OUTPUT的政策未设置为ACCEPT

结论

这应该涵盖配置iptables防火墙时常用的许多命令。 当然,iptables是一个非常灵活的工具,所以随意混合和匹配命令与不同的选项,以满足您的具体需求,如果这里不包括。

如果您正在寻找帮助确定你的防火墙应该如何设置,看看这个教程: 如何选择一个有效的防火墙策略,以确保您的服务器

祝你好运!