如何使用iptables配置Ubuntu Linux防火墙(完整指南)
2024-03-01 14:46:04
我们将把这个教程分成三个步骤。首先,你将学习如何在Ubuntu系统中安装iptables。其次,我们将教你如何定义规则。最后,我们将指导你如何让iptables的变化永久生效。
第一步:安装iptables
iptables在大多数Linux发行版中都是预装的。但是,如果你在Ubuntu/Debian系统中没有默认安装它,可以按照以下步骤进行:
- 连接到你的服务器,使用SSH。如果你不知道怎么做,可以阅读我们的SSH教程。
- 依次执行以下命令:
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
可以看到,目前没有任何规则,所有的链的默认策略都是ACCEPT,也就是说允许所有的流量。
注意:iptables的规则只适用于ipv4协议。如果你想为ipv6协议设置防火墙,你需要使用ip6tables命令。
第二步:定义链规则
现在我们已经安装了iptables,我们可以开始创建一些规则来控制网络流量。我们可以使用-A选项来添加新的规则到链的末尾,或者使用-I选项来指定规则的位置(如果不指定,则放在链的开头)。我们还需要指定表、链、协议、端口、目标等参数。
下面是一些常见的规则的例子:
- 允许本地回环流量(这对于一些应用程序很重要):
sudo iptables -A INPUT -i lo -j ACCEPT
- 允许已经建立或相关联的连接的流量(这可以避免中断已经存在的连接):
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- 允许进入服务器的SSH流量(默认端口是22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 允许进入服务器的HTTP流量(默认端口是80):
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- 允许进入服务器的HTTPS流量(默认端口是443):
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 拒绝来自特定IP地址或网段的流量(例如,拒绝来自192.168.1.1或192.168.1.0/24的流量):
sudo iptables -A INPUT -s 192.168.1.1 -j DROP
sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP
- 拒绝进入服务器的ICMP流量(例如,拒绝ping请求):
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
- 拒绝所有其他的流量(这可以作为最后一条规则,以确保只允许我们指定的流量):
sudo iptables -A INPUT -j DROP
第三步:保存规则的变化
iptables的规则是临时的,也就是说,它们在重启后不会保留。如果我们想让它们永久生效,我们需要手动保存它们。在Ubuntu中,一种保存iptables规则的方法是使用iptables-persistent软件包。安装它的方法如下:
- 运行以下命令:
sudo apt install iptables-persistent
- 在安装过程中,你会被问到是否要保存你当前的防火墙规则。选择是。
- 如果你更新了你的防火墙规则,并且想要保存变化,运行以下命令:
sudo netfilter-persistent save
其他的Linux发行版可能有不同的方法来保存iptables的变化。请参考相关的文档来获取更多信息。
结论
在本文中,我们学习了如何使用iptables来配置Linux防火墙。我们了解了iptables的基本概念和工作原理,以及如何安装、列出、删除、创建和保存规则。我们还看了一些常见的防火墙规则的例子,可以根据自己的需要进行修改或添加。
使用iptables可以让我们对网络流量有更多的控制和保护,但也需要注意不要误操作导致自己被锁在服务器外面。如果你因为防火墙设置而失去了访问权限,你可能需要通过一个基于网页的控制台来恢复你的访问。如果你使用的是DigitalOcean,你可以阅读我们的恢复控制台产品文档来获取更多信息。一旦你通过控制台连接到服务器,你可以修改你的防火墙规则来允许SSH访问(或者允许所有流量)。如果你保存的防火墙规则允许SSH访问,另一种方法是重启你的服务器。
记住,你可以使用sudo iptables -S和sudo iptables -L来检查你当前的iptables规则集。
希望这篇文章对你有所帮助,如果你有任何问题或建议,请在下面留言。
常见问题解答
Q: iptables和ip6tables有什么区别?
A: iptables和ip6tables都是用来管理Linux防火墙的工具,但是iptables只适用于ipv4协议,而ip6tables只适用于ipv6协议。如果你想为两种协议都设置防火墙规则,你需要分别使用iptables和ip6tables命令。
Q: iptables和ufw有什么区别?
A: ufw(Uncomplicated Firewall)是一款基于iptables的简化版防火墙工具,它提供了一个更友好和直观的命令行界面来管理防火墙规则。ufw是Ubuntu系统中默认安装的防火墙工具,但也可以在其他Linux发行版中使用。如果你觉得iptables太复杂或难用,你可以考虑使用ufw来代替。
Q: 如何查看iptables的日志?
A: iptables默认不会记录任何日志,但是你可以使用LOG或ULOG目标来把匹配某些规则的数据包记录到日志中。例如,如果你想记录所有被DROP目标拒绝的数据包,你可以在DROP目标之前添加一条LOG目标的规则:
sudo iptables -A INPUT -j LOG --log-prefix "INPUT DROP: "
sudo iptables -A INPUT -j DROP
这样,所有被DROP目标拒绝的数据包都会被记录到/var/log/kern.log文件中,带有"INPUT DROP: "的前缀。你可以使用tail命令来查看这个文件的内容:
sudo tail -f /var/log/kern.log
你可以根据你的需要修改LOG目标的参数,比如日志级别、前缀、限制等。你也可以使用ULOG目标来把日志发送到用户空间,然后使用ulogd等工具来处理日志。
Q: 如何备份和恢复iptables的规则?
A: 除了使用iptables-persistent软件包来保存和加载iptables的规则,你也可以使用iptables-save和iptables-restore命令来手动备份和恢复规则。例如,如果你想把当前的规则保存到一个名为iptables.bak的文件中,你可以运行:
sudo iptables-save > iptables.bak
如果你想从这个文件中恢复规则,你可以运行:
sudo iptables-restore < iptables.bak
注意,这些命令只会影响当前的规则,不会影响重启后的规则。如果你想让规则永久生效,你还是需要使用iptables-persistent软件包或其他方法。
Q: 如何在iptables中使用端口范围或多个端口?
A: 如果你想在iptables中指定一个端口范围或多个端口,你可以使用冒号(:)或逗号(,)来分隔端口号。例如,如果你想允许进入服务器的1000到2000端口的流量,你可以运行:
sudo iptables -A INPUT -p tcp --dport 1000:2000 -j ACCEPT
如果你想允许进入服务器的80、443和8080端口的流量,你可以运行:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
注意,使用多个端口时,需要加上-m multiport选项来匹配多端口模块。
Q: 如何在iptables中使用IP地址范围或多个IP地址?
A: 如果你想在iptables中指定一个IP地址范围或多个IP地址,你可以使用斜杠(/)或逗号(,)来分隔IP地址。例如,如果你想拒绝来自192.168.1.0/24网段的流量,你可以运行:
sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP
如果你想拒绝来自192.168.1.1和192.168.1.2两个IP地址的流量,你可以运行:
sudo iptables -A INPUT -s 192.168.1.1,192.168.1.2 -j DROP
注意,使用多个IP地址时,需要加上-m iprange选项来匹配IP范围模块。