一、基本概念
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是一个强大的工具,可以使系统更加安全,但同时也需要仔细考虑规则的设置,以确保应用程序的正常运行。