本文将向你介绍如何在Ubuntu系统上安装及使用iptables。通过了解此Linux防火墙工具,你可以使用命令行界面保护Linux VPS。
什么是Iptables,它如何工作?
概括来讲,iptables是Linux的防火墙程序。它将使用表监视来往服务器的流量。这些表包含规则集,称为链,这将过滤传入和传出数据分组。
当数据包与规则匹配时,将为其指定目标,该目标可以是另一条链或以下特殊值之一:
- ACCEPT –将允许数据包通过。
- DROP –不会让数据包通过。
- RETURN –阻止数据包遍历链,并告诉它返回上一个链。
在此iptables教程中,我们将使用默认表之一,称为filter。它由三个链组成:
- INPUT –控制进入服务器的数据包。
- FORWARD –过滤将转发到其他地方的传入数据包。
- OUTPUT –过滤从服务器传出的数据包。
在开始本指南之前,请确保你对在Ubuntu 16.04或更高版本上运行的计算机具有SSH根目录或sudo访问权限。你可以通过PuTTY(Windows)或终端外壳(Linux,macOS)建立连接。
iptables规则仅适用于ipv4。如果要为ipv6协议设置防火墙,则需要改用ip6tables。
如何安装和使用Iptables Linux防火墙
我们将把这个iptables教程分为三个步骤。首先,你将学习如何在Ubuntu上安装该工具。其次,我们将向你展示如何定义规则。最后,我们将指导你对iptables进行永久更改。
第1步-安装iptables
iptables预装在大多数Linux发行版中。但是,如果默认情况下在Ubuntu / Debian系统中没有它,请按照以下步骤操作:
- 通过SSH连接到服务器。如果你不知道,可以阅读我们的前文《Linux VPS远程终端工具:PuTTY的使用教程》。
- 一一执行以下命令:
sudo apt-get update sudo apt-get install iptables
- 通过运行以下命令检查当前iptables配置的状态:
sudo iptables -L -v
在这里,-L选项用于列出所有规则,而-v 用于以更详细的格式显示信息。下面是示例输出:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
sudo iptables -L -v
现在,你将安装Linux防火墙。此时,你会注意到所有链都设置为ACCEPT并且没有规则。这是不安全的,因为任何数据包都可以通过而无需过滤。
不用担心 我们将在iptables教程的下一步告诉你如何定义规则。
第2步-定义链规则
定义规则意味着将其附加到链中。为此,你需要在iptables命令之后插入-A选项(Append),如下所示:
sudo iptables -A
它将警告iptables你正在向链中添加新规则。然后,你可以将该命令与其他选项结合使用,例如:
- -i(接口)—你要过滤其流量的网络接口,例如eth0,lo,ppp0等。
- -p(protocol)-进行过滤过程的网络协议。它可以是tcp,udp,udplite,icmp,sctp,icmpv6等。或者,你可以键入all选择每个协议。
- -s(source)-流量来自的地址。你可以添加主机名或IP地址。
- –dport(目标端口)—协议的目标端口号,例如22(SSH),443(https)等。
- -j(目标)—目标名称(ACCEPT,DROP,RETURN)。每次制定新规则时都需要插入此代码。
如果要使用所有这些,则必须按以下顺序编写命令:
sudo iptables -A <chain> -i <interface> -p <protocol (tcp/udp) > -s <source> --dport <port no.> -j <target>
了解基本语法后,就可以开始配置防火墙,以为服务器提供更高的安全性。对于此iptables教程,我们将使用INPUT链作为示例。
在Localhost上启用流量
要允许本地主机上的流量,请键入以下命令:
sudo iptables -A INPUT -i lo -j ACCEPT
对于此iptables教程,我们使用lo或Loopback接口。它用于本地主机上的所有通信。上面的命令将确保同一台计算机上的数据库和Web应用程序之间的连接正常工作。
在HTTP,SSH和SSL端口上启用连接
接下来,我们希望http(端口80),https(端口443)和ssh(端口22)连接能够照常工作。为此,我们需要指定协议(-p)和相应的端口(-dport)。你可以一一执行以下命令:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
现在该检查规则是否已添加到iptables中了:
sudo iptables -L -v
它应返回以下结果,这意味着将接受来自指定端口的所有TCP协议连接:
基于源过滤报文
iptables允许你根据IP地址或IP地址范围过滤数据包。你需要在-s选项后指定它。例如,要接受来自192.168.1.3的数据包,命令将是:
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
你还可以通过将ACCEPT目标替换为DROP来拒绝来自特定IP地址的数据包。
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
如果要丢弃来自某个IP地址范围的数据包,则必须使用-m选项和iprange模块。然后,使用–src-range指定IP地址范围。请记住,连字符应将IP地址范围分隔成空格,如下所示:
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
丢弃所有其他流量
定义–dport规则后,对所有其他流量使用DROP目标至关重要。这将防止未经授权的连接通过其他打开的端口访问服务器。为此,只需键入:
sudo iptables -A INPUT -j DROP
现在,指定端口外部的连接将被删除。
删除规则
如果要删除所有规则并以干净的开头开始,则可以使用-F选项(flush):
sudo iptables -F
该命令将删除所有当前规则。但是,要删除特定规则,必须使用-D选项。首先,你需要通过输入以下命令来查看所有可用规则:
sudo iptables -L --line-numbers
你将获得带有数字的规则列表:
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 192.168.0.4 anywhere 2 ACCEPT tcp -- anywhere anywhere tcp dpt:https 3 ACCEPT tcp -- anywhere anywhere tcp dpt:http 4 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
要删除规则,请从列表中插入相应的链和编号。假设对于此iptables教程,我们要摆脱INPUT链的第三条规则。该命令应为:
sudo iptables -D INPUT 3
步骤3 –永久保存变更
我们创建的iptables规则保存在内存中。这意味着我们必须在重新启动时重新定义它们。要在重新启动服务器后使这些更改持久化,可以使用以下命令:
sudo /sbin/iptables-save
它将当前规则保存在系统配置文件中,该文件将在每次服务器重新引导时用于重新配置表。
请注意,每次更改规则时,都应始终运行此命令。例如,如果要禁用iptables,则需要执行以下两行:
sudo iptables -F sudo /sbin/iptables-save
你将看到以下结果:
结论
iptables是功能强大的防火墙程序,你可以根据自己的喜好定义各种规则,保护Linux服务器或VPS。
在此iptables教程中,你学习了如何安装和使用该工具。通过本教程的学习,你应该也可以管理规则以过滤传入和传出数据包了。