您的位置:

Linux防火墙iptables命令与应用

一、基本概念

Linux防火墙的本质是一个将出入的数据流流量打包起来过一遍筛子,没有设置规则的数据包会被直接丢弃,经过规则的数据包则被放行。

iptables是Linux防火墙的一个工具,用于配置Linux内核的网络数据包过滤表、NAT表和mangle表,控制信息流进流出的控制中心。

iptables规则由链、表、匹配和动作4个基本元素组成:

  • 链:是由预定义名称组成的规则列表,每个数据流都必须经过一个或多个链才能处理。
  • 表:由iptables规则组成的有序规则集合。
  • 匹配:在选择匹配时,iptables会检测数据流中数据包的头部信息(被称作“匹配项”),根据这些信息来匹配数据流
  • 动作:iptables根据匹配结果执行一个动作。

二、iptables基本命令

当需要更新防火墙规则,通常执行如下命令:

iptables -t <表名称> <动作> <链名称> [匹配模式] -j <动作>

其中,各个选项的含义如下:

  • -t 表示防火墙表名称,默认为filter表。
  • <动作> add表示新增、insert表示插入、append表示追加、delete表示删除、replace表示替换等。
  • <链名称> 表示在哪个防火墙链中应用规则,通常为INPUT、FORWARD、OUTPUT。
  • [匹配模式] 表示需要对数据流的哪些特定数据包进行防火墙动作。
  • -j <动作> 表示进行匹配后应该执行哪个动作。

三、链类型详解

Linux防火墙iptables可以支持3种基本链,每种链都有自己的处理方式和钩子:

  • INPUT:处理目的主机为本机的数据流。
  • OUTPUT:处理源主机为本机的数据流。
  • FORWARD:处理两个不同的主机之间的数据流。通常在一台网关主机上设置,并且该主机需要有两个网卡来处理进入和发出的流量。

四、防火墙规则

4.1默认策略

Linux防火墙iptables可以使用三种默认策略,即DROP、ACCEPT和REJECT。

#将所有规则的默认策略设置为drop
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

#将所有规则的默认策略设置为accept
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

REJECT与DROP相似,但是会给源主机发送一个错误响应消息,表示连接被拒绝。这比DROP更加安全,因为DROP会导致连续重试。

4.2 IP地址过滤规则

IP地址过滤是一个黑白名单的过程,在这个过程中,iptables会根据源IP地址和目的IP地址来过滤数据包。例如:

#允许来自192.168.1.4的TCP连接
iptables -A INPUT -s 192.168.1.4 -p tcp -j ACCEPT

#禁止来自192.168.1.6的UDP连接
iptables -A INPUT -s 192.168.1.6 -p udp -j DROP

#将指定的IP地址列入黑名单
iptables -A INPUT -s 192.168.1.5 -j DROP

4.3 端口过滤规则

iptables也可以根据端口号过滤数据包,允许或者禁止指定端口的访问:

#允许来自B主机的80、8080端口的TCP连接
iptables -A INPUT -s 192.168.1.5 -p tcp --dport 80,8080 -j ACCEPT

#禁止所有的3389端口的TCP连接
iptables -A INPUT -p tcp --dport 3389 -j DROP

4.4 发送标记(Masquerading)

使用iptables的Masquerading规则来允许防火墙主机将内部IP地址转换为公共IP地址(NAT):

#允许eth1上的IP地址能够访问外部网络,将其IP地址发送标记
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

4.5 内部端口转发规则

当需要将外部请求转发到内部网络的指定端口时,可以使用iptables的端口转发规则:

#将外部TCP请求转发到本机的8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

五、常见问题及解决方案

5.1 如何永久保存iptables设置?

为了防止重启系统而导致iptables规则被重置,需要执行如下步骤永久保存iptables设置:

#安装iptables-persistent
sudo apt-get install iptables-persistent

#保存当前的规则
sudo netfilter-persistent save

#重新加载已经保存过的规则
sudo netfilter-persistent reload

5.2iptables不生效怎么办?

当iptables设置不生效时,有一些常见的原因和解决方法:

  • 检查设置的规则是否正确,可以通过iptables -L命令查看规则。
  • 检查规则的顺序是否正确,规则以顺序执行。
  • 检查iptables服务是否已经启动,可以通过systemctl status iptables查看iptables服务的运行状态。
  • 检查是否有其他的程序干扰iptables规则的生效,例如firewalld和ufw。

5.3 如何使用iptables限制SSH登录次数?

为了防止SSH暴力破解,需要设置iptables来限制登录次数:

#将所有SSH登录请求发送到另一个新链进行处理
iptables -N SSH_CHECK

#将SSH连接计数器设置为0
iptables -A SSH_CHECK -m recent --name SSH --set --rsource -j DROP

#当连接次数达到限制时,禁止SSH登录
iptables -A SSH_CHECK -m recent --name SSH --update --seconds 60 --hitcount 3 --rsource -j DROP

#将SSH_CHECK链接到INPUT链
iptables -A INPUT -p tcp --dport ssh -j SSH_CHECK

六、结论

iptables是一个强大的工具,可以使系统更加安全,但同时也需要仔细考虑规则的设置,以确保应用程序的正常运行。