文章目录
- 前言
- 一、Netfilter内核
- 二、Netfilter与iptables的关系
- 三、iptables的表与链
- 四、iptables的常用命令与参数
- 五、 iptables使用案例
前言
iptables是Linux系统中一款强大的防火墙工具,它基于Netfilter内核模块,允许管理员定义数据包的转发、过滤和NAT(网络地址转换)规则,以保护网络安全,限制网络流量。
一、Netfilter内核
Netfilter是Linux内核中的一个网络包过滤框架,它不是一个单独的模块,而是一个集成在内核中的子系统。它提供了一种钩子机制,允许其他内核模块(如conntrack、nat等)在这些钩子点上注册回调函数,以便在数据包通过时执行特定的操作。
Netfilter的主要功能:
- 数据包过滤:根据源IP地址、目标IP地址、端口号等条件对数据包进行筛选,允许或拒绝数据包的传输。
- 网络地址转换(NAT):修改数据包中的源IP地址或目标IP地址,以实现网络地址的映射和隐藏。
- 数据包修改:修改数据包头部或有效载荷,例如更改TCP/UDP端口号、设置TTL值等。
- 流量控制:限制特定协议或端口的流量速率,防止网络拥塞和攻击。
- 负载均衡:将流量分发到多个服务器上,以实现负载均衡和故障转移。
二、Netfilter与iptables的关系
iptables是一个用户空间工具,用于配置和管理Netfilter规则。通过iptables命令,用户可以定义过滤规则、NAT规则和mangle规则等,这些规则会被iptables工具转换为Netfilter可以理解的格式,并注册到相应的钩子点上。
iptables与Netfilter之间的关系可以类比为“用户界面”与“后台处理系统”之间的关系。iptables提供了丰富的命令行接口和配置选项,使得用户可以方便地配置和管理网络规则;而Netfilter则负责在内核中实际执行这些规则,对数据包进行过滤和处理。
三、iptables的表与链
iptables具有四种内建表:Filter、NAT、Mangle、Raw,不同的表含有的链也不同。
-
Filter表(默认表):
- 主要负责过滤功能。
- 包含的链:INPUT、FORWARD、OUTPUT。
- INPUT:处理进入本机的数据包。
- FORWARD:处理经过本机的转发数据包。
- OUTPUT:处理本机发出的数据包。
-
NAT表:
- 主要负责网络地址转换功能。
- 包含的链:PREROUTING、POSTROUTING、OUTPUT。
- PREROUTING:处理刚到达本机并在路由转发前的数据包。
- POSTROUTING:处理即将离开本机的数据包。
- OUTPUT:处理本机产生的数据包。
-
Mangle表:
- 用于修改数据包的头部信息,如TTL、TOS等。
- 包含的链:PREROUTING、OUTPUT、FORWARD、INPUT、POSTROUTING。
-
Raw表:
- 用于控制数据包是否被状态追踪机制处理。
- 包含的链:PREROUTING、OUTPUT。
四、iptables的常用命令与参数
iptables提供了丰富的命令和选项,用于对防火墙规则进行增删改查、保存和加载等操作。
-
添加规则(
-A
):- 在指定链的末尾添加一条新的规则。
- 示例:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
(允许TCP端口22的流量通过)。
-
删除规则(
-D
):- 删除指定链中的某一条规则。
- 示例:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
(删除允许TCP端口22的规则)。
-
插入规则(
-I
):- 在指定链的指定位置插入一条新的规则,默认在第一行添加。
- 示例:
iptables -I INPUT 1 -p icmp --icmp-type echo-request -j DROP
(拒绝所有ICMP回显请求)。
-
列出规则(
-L
):- -t :表示想要查看那个表,这里查看的是nat表。(iptables的所有命令如果不指定-t,默认是filter表)
- -L:表示列出该表所有的链和规则
- -v:详细显示,会将规则匹配的进出网口也列出来
- –line-numbers :表示给规则进行编号处理,编号能方便我们后续对规则进行修改、删除等操作
- 示例:
iptables -L INPUT
(列出INPUT链的所有规则)。
-
清空规则(
-F
):- 清空指定链中的所有规则。
- 示例:
iptables -F INPUT
(清空INPUT链的所有规则)。
-
设置默认策略(
-P
):- 设置指定链的默认策略。
- 示例:
iptables -P INPUT DROP
(将INPUT链的默认策略设置为DROP)。
五、 iptables使用案例
#查看INPUT链的规则,显示行号
iptables -L INPUT --line-numbers
#删除INPUT链的第一条规则,行号从1开始
iptables -D INPUT 1
#拒绝进入防火墙的所有ICMP协议数据包
iptables -A INPUT -p icmp -j REJECT
#允许防火墙转发除ICMP协议以外的所有数据包。使用”!”可以将条件取反
iptables -A FORWARD -p ! icmp -j ACCEPT
#拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据
iptables -A FORWARD -s 192.168.1.10 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
#所有发给目标网口是wlan0 且目标ip是121.18.238.0/29 地址的包,都会被丢弃,不作任何回复
iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP
#拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包,无任何回复
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
#web服务器开启80端口,可接收外部的http请求
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许ping。由于是双向的,所以INPUT链、OUTPUT链都要设置
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
##将本机的对8080端口请求转发至其他主机,主机IP:192.168.0.141,目标主机IP和端口:192.168.0.142:80;
#进入PREROUTING作目标地址转换。由192.168.0.141:8080转为192.168.0.142:80
iptables -t nat -A PREROUTING -d 192.168.0.141/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.142:80
#数据包进入POSTROUTING链,即将离开本机,做源地址转换,由客户端IP转换为192.168.0.141
iptables -t nat -A POSTROUTING -d 192.168.0.142/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.141
#将本机的对80端口请求重定向到8080端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
#清空所有iptables规则
iptables -F
#清除iptables nat表规则
iptables -t nat -F
#保存iptables规则
service iptables save