iptables详解使用

iptables详解使用

1、介绍

1.1简介

iptables是一个linux下的防火墙工具,它能帮助我们基于规则进行网络流量控制。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。它可以做到,但不限于以下功能:

  • 允许/拒绝某种协议的链接建立,比如TCP,UDP
  • 允许/拒绝 来自某个ip的访问
  • 允许/拒绝某个端口被访问
  • ….

2、linux内核处理流程

2.1 简化的流程介绍

2.1.1 一般流程介绍

这个流程是简化过的流程,但是对于整个流程的梳理是重要的,简单介绍这个流程:

  1. 首先是数据包从网卡进入, 已经路由预处理链路(PREROUTING), 这个预处理可以用来修改ip包的目的地址等信息
  2. 路由决策(Routing Decision)就是判断ip的目的地址是不是本机的ip
  3. 按照一般情况, 再进入输入链路(INPUT)这个链路,这个主要是决定进入上层应用层的处理前的链路
  4. 上层应用处理,这个就是实际流入上层应用的数据包,例如用java或者Python构建的web服务就能接收到
  5. 再就是上层应用会做出响应的数据包进入输出链路(OUTPUT)
  6. 路由决策这里根据目的ip选择将数据包发给哪个网卡
  7. 进入路由后处理链路(POSTROUTING), 这个后处理可以用来修改ip地址的源ip信息等
  8. 输出到网卡发送出去

2.1.2 转发流程

  1. 假如当前主机是网关(例如路由器),那么从网卡上就会接收到目的ip不是本机ip的数据包

  2. 这个时候路由预处理(PREROUTING)之后的路由决策就会进入路由路由转发(FORWARD)线路

  3. 然后到最终经过路由决策到路由后处理(POSTROUTING)

    • 路由后处理(POSTROUTING)这里十分重要,一般路由器就会在这里将源ip地址换成路由器自己的外网ip,这样内网机器就可以通过路由器上网了

    • iptabels将这个操作称为SNAT,是可以通过命令简单配置下就能配好的

2.2 表、链、规则介绍

2.2.1 规则(rule)

来自192.168.2.31的访问,就要将其拒绝`,这即是一条规则

一个规则一般分为两大部分:

  • 匹配: 即哪些数据包会命中这个规则,比如一个指定的ip,即是一个匹配规则
  • 动作: 匹配到规则之后,需要做什么动作,是放行,还是拒绝。动作分为以下几种:
    • ACCEPT: 直接接受该数据包,不会再走其他链条和规则。比如filter中的input表中的某个规则命中后,动作是ACCEPT,那么该数据包将被直接送达目标进程端口。
    • DROP: 直接抛弃该数据包,并且没有任何返回。且不会再走其他链和规则
    • REJECT: 跟DROP类似,但好歹还是会跟请求方返回一些拒绝信息,比如我们拒绝掉ICMP协议后,ping该主机,会返回“destination host unreachable”
    • RETURN: 当前规则不做任何处理,返回。让给下一个规则处理
    • LOG : 同RETURN类似,但只是会将请求信息记录到系统日志中,记录路径

2.2.2 链(chain)

往往我们的安全策略不只一条规则,除了 来自192.168.2.31的访问,就要将其拒绝 这条规则之外,我们还有其它规则,比如: 来自192.168.43.22的访问,也要将其拒绝

甚至,我们可能还有多个互斥的规则,这多个规则,哪个规则先执行? 这就涉及到链这个概念。简单来讲,链就是将多个规则从上大小串起来的一个集合单位。规则按从上倒下依次进行匹配

img

2.2.3 表(table)

链条可以有多个。将多个链条再规整在一起的集合,叫做表。

2.2.4 四表五链

  • 以上流程中还涉及到表(表是对功能的封装,例如filter专门用于防火墙),按照官方文档也有5张表

    • filter 配置防火墙的规则, 可以决定一个数据包是否可以到达目标进程端口
    • nat 配置转发包的规则,可以修改源和目标的ip地址,从而进行包路由。
    • raw(不常用) 用来标记包让免于系统跟踪,能基于数据包的状态进行规则设定
    • mangle(不常用) 用于对特定数据包的修改, 可以修改数据包的内容,比如ttl
    • security(不常用) 用于访问控制。
  • 链就是数据包传输过程中经过的各个链路,有5个,包括路由PREROUTING(预处理),INPUT(输入),OUTPUT(输出),POSTROUTING(路由后处理),**FORWARD(转发)**这五条链路

    • PREROUTING 链

      PREROUTING 一般用作对包进行目标地址修改。比如将该包的目标地址,修改为非本机的另外的网络ip,一般通过DNAT规则进行修改。(例如虚机访问外网时,回包需要原链路返回需要DNAT)

    • 路由决策(Routing Decision)

      决定一个包该走哪个链。如果上述PREROUTING 链对包进行了目标网络ip更改。那么决策会觉得这个是一个需要转发的数据包,于是会将该包转发给 FORWARD 链。否则, 该包会走INPUT链

    • FORWARD 链

      FORWARD在各表中生效的优先顺序是:mangle(FORWARD) —-> filter(FORWARD) 处理路由决策派发发过来的包,到这里的包一般目标网络地址在PREROUTING链被修改过

    • INPUT 链

      其生效顺序是: mangle(INPUT) —-> filter(INPUT) 处理路由决策派发发过来的包,到这里的包一般目标网络地址在PREROUTING链没有被修改过。

    • OUTPUT 链

      在目标进程端口接收到输入数据包后,输出的数据包,将在这里进行规则应用。OUTPUT链在各表中生效的先后顺序是: raw(OUTPUT) —-> mangle(OUTPUT) —-> nat(OUTPUT) —-> filter(OUTPUT)

    • POSTROUTING

      POSTROUTING一般用作对包进行源地址修改,一般通过SNAT规则进行修改

  • 表能控制的链路关系如下

表名/链名 raw filter nat mangle security
PREROUTING
INPUT
OUTPUT
POSTROUTING
FORWARD

3、iptables命令说明

iptables的命令格式较为复杂,一般的格式如下:

iptables [-t 表] -命令 匹配   操作

3.1 -t 表

表选项用于指定命令应用于哪个iptables内置表。

3.2 命令

命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,如下表所示

-P  --policy        <链名>  定义默认策略
-L  --list          <链名>  查看iptables规则列表
-A  --append        <链名>  在规则列表的最后增加1条规则
-I  --insert        <链名>  在指定的位置插入1条规则
-D  --delete        <链名>  从规则列表中删除1条规则
-R  --replace       <链名>  替换规则列表中的某条规则
-F  --flush         <链名>  删除表中所有规则
-Z  --zero          <链名>  将表中数据包计数器和流量计数器归零
-X  --delete-chain  <链名>  删除自定义链
-v  --verbose       <链名>  与-L他命令一起使用显示更多更详细的信息

3.3 匹配规则

匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示

-i --in-interface    网络接口名>     指定数据包从哪个网络接口进入,
-o --out-interface   网络接口名>     指定数据包从哪个网络接口输出
-p ---proto          协议类型        指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source          源地址或子网>   指定数据包匹配的源地址
   --sport           源端口号>       指定数据包匹配的源端口号
   --dport           目的端口号>     指定数据包匹配的目的端口号
-m --match           匹配的模块      指定数据包规则所使用的过滤模块

3.4 动作

  • REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下:
iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
  • DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

  • REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
  • MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

3.5 常用示例

查看防火墙的状态

iptables -L -n -v --line-numbers

启动/停止/重启防火墙

service iptables stop

service iptables start

service iptables restart

删除一条规则

iptables -L INPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers | less
iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
# 删除 如果想要删除一条规则,那么可以直接使用序号,例如 INPUT 的第 1 条可以直接这么删除
iptables -D INPUT 1

插入一条规则

# 插入前面
iptables -I INPUT 2 -s 202.54.1.2 -j DROP  # 在第二条位置插入一条规则
# 添加后面
iptables -A INPUT -s 202.54.1.2 -j DROP

保存防火墙规则

service iptables save

加载防火墙规则

iptables-restore < /root/my.active.firewall.rules

删除公共接口上的私有地址

iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

屏蔽 ip 地址

iptables -A INPUT -s 1.2.3.4 -j DROP

iptables -A INPUT -s 192.168.0.0/24 -j DROP

屏蔽入站端口

iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP

iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

屏蔽出站ip

iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

记录并删除包

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

通过 mac 地址过滤数据

iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP

只接收MAC地址为00:0F:EA:91:04:07的TCP流量

iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

过滤 ICMP ping 请求

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

开启范围端口

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

开启范围 ip

iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

改变某个链的默认规则

以filter表的三个链为例,默认是ACCEPT。 但是我们可以改变这个模型规则,比如默认规则就是DROP

iptables -t filter -P INPUT DROP

在使用某个网络时,不响应请求

iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP 

规则的取反配置

上述规则配置,一般都是满足某某条件,做什么动作。除此之外,我们还可以配置,如果不满足某某条件,则做某个动作。

iptables -A INPUT -p tcp -m multiport ! --dports 22,80,443 -j DROP

这个不满足则的取动作,是通过感叹号来实现的。 上述命令的含义是:非22,80,443的端口,我们直接丢弃。

当然这条命令之前,应该要配置一条规则:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

因为通过22或80建立的连接,可能会衍生出一些RELATED的连接,他们的端口可能不是22或80,那样也就被拒掉了。会导致通信出问题。

3.6 规则持久化

  1. 第一步,在修改iptables配置后,将其导出到某个文件,比如: /etc/iptables.conf 。命令为:iptables-save > /etc/iptables.conf 这一步,每次修改后都要做
  2. 第二步,在/etc/rc.local中添加命令iptables-restore < /etc/iptables.conf。从此之后,每次重启,系统会自动从/etc/iptables.conf恢复对应的iptables配置。这一步只需要做一次

   转载规则


《iptables详解使用》 by XieJiayi is licensed under a 知识共享署名 4.0 国际许可协议 许可协议。转载请注明来源
 上一篇
K8S NetworkPolicy(网络策略) K8S NetworkPolicy(网络策略)
NetworkPolicy(网络策略)1. 介绍1.1 基本概念NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 Pod 与网络上的各类网络“实体”,实现以下功能: 限制 Pod 之间和外部网络的流量:通过指定 I
2023-07-27
下一篇 
内网穿透【搞一下】 内网穿透【搞一下】
内网穿透【搞一下】场景入门介绍老板找到产品经理,说:“客户想看一下项目,你搞一下,把demo网站搭起来”产品经理找到技术组长,说:“客户想看一下项目,你搞一下,让客户能访问demo网站”技术组长找到程序员小A,说:“客户想看一下项目,你搞一
2023-06-16
  目录