5分钟学SRE-Iptables

2023-11-17 13:02:14 浏览数 (2)

iptables

iptables不是一个真正的防火墙,是位于用户空间的一个命令行工具,用户通过iptables这个代理将用户的安全设定执行到对应的“安全框架”-netfilter,netfilter位于内核空间,他才是防火墙的真正安全框架

iptables组成linux平台下的包过滤防火墙,与大多数的linux软件一样,这个包过滤是免费的,可以完成封包过滤,封包重定向和网络地址转换(NAT)等功能

netfilter

netfilter是linux操作系统核心层内部的一个数据包处理模块,有以下功能:

网络地址转换(Network Address Translate)

数据包内容修改

数据包过滤的防火墙功能

iptables的组成

iptable由五个表table和五个链chain以及一些规则组成

Tip:tables由chains组成,chains由rules组成

五个表table:filter,nat,mangle,raw,security

1.filter表——三个链:INPUT、FORWARD、OUTPUT

作用:过滤数据包 内核模块:iptables_filter.

2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT

作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

4.Raw表——两个链:OUTPUT、PREROUTING

作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

5,security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELINUX)实现

优先级由高到低的顺序为:

security-->raw-->mangle-->nat-->filter

但是常用的是iptables 内置的filter,nat和mangle三张表

五个内置链chain:

链 chain:

内置链:每个内置链对应一个钩子函数

自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制,只有hook钩子调用自定义链时才生效

五条链:
  • input

匹配目标IP是本机的数据包

  • output

出口数据包 , 一般不在此链上做配置

  • forward

匹配流经本机的数据包

  • prerouting

修改目的地址,用来做 DNAT 。如:把内网中的 80 端口映射到互联网端口

  • postrouting

修改源地址,用来做 SNAT。如:局域网共享一个公网IP接入Internet

内核中数据包的传输过程

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
  • 如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
  • 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出

iptables 内建各表格与链的相关性

iptables 可以控制三种封包 的流向:

  • 封包进入 Linux 主机使用资源 (路径 A):在路由判断后确定是向 Linux 主机要求数据 的封包,主要就会透过 filter 的 INPUT 链来进行控管;
  • 封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B):在 路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此 时封包就会透过路径 B 来跑动。也就是说,该封包的目标并非我们的 Linux 本机。主 要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
  • 封包由 Linux 本机发送出去 (路径 C):例如响应客户端的要求,或者是 Linux 本机主 动送出的封包,都是透过路径 C 来跑的。先是透过路由判断, 决定了输出的路径后,再 透过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。

iptables 安装

1、关闭 firewall

代码语言:javascript复制
systemctl stop firewalld //关闭firewalld服务
systemctl disable firewalld //禁止firewalld开机自启动
代码语言:javascript复制
2、安装 iptables
代码语言:javascript复制
yum -y install iptables-services

3、启动服务

代码语言:javascript复制
systemctl start iptables //启动iptables
systemctl start iptables //设置iptables开机自启动

4、Iptables基本操作

代码语言:javascript复制
启动iptables:service iptables start
关闭iptables:service iptables stop
重启iptables:service iptables restart
查看iptables状态:service iptables status
保存iptables配置:service iptables save
Iptables服务配置文件:/etc/sysconfig/iptables-config
Iptables规则保存文件:/etc/sysconfig/iptables
打开iptables转发:echo "1"> /proc/sys/net/ipv4/ip_forward

iptables命令参考

命令:

代码语言:javascript复制
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转] 

1. 表名

表名:Filter, NAT, Mangle, Raw

起包过滤功能的为表Filter,可以不填,不填默认为Filter

2. 命令选项

选项名

功能及特点

-A

在指定链的末尾添加(--append)一条新的规则

-D

删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则

-I

在指定链中插入(--insert)一条新的规则,默认在链的开头插入

-R

修改、替换(--replace)指定链中的一条规则,按规则序号或内容确定

-L

列出(--list)指定链中的所有的规则进行查看,默认列出表中所有链的内容

-F

清空(--flush)指定链中的所有规则,默认清空表中所有链的内容

-N

新建(--new-chain)一条用户自己定义的规则链

-X

删除指定表中用户自定义的规则链(--delete-chain)

-P

设置指定链的默认策略(--policy)

-n

用数字形式(--numeric)显示输出结果,若显示主机的 IP地址而不是主机名

-P

设置指定链的默认策略(--policy)

-v

查看规则列表时显示详细(--verbose)的信息

-V

查看iptables命令工具的版本(--Version)信息

-h

查看命令帮助信息(--help)

--line-number

查看规则列表时,同时显示规则在链中的顺序号

3. 链名

可以根据数据流向来确定具体使用哪个链,在Filter中的使用情况如下:

代码语言:javascript复制
INPUT链 – 处理来自外部的数据。  
OUTPUT链 – 处理向外发送的数据。  
​​​​​​​FORWARD链 – 将数据转发到本机的其他网卡设备上。

4. 条件匹配

条件匹配分为基本匹配和扩展匹配,拓展匹配又分为隐式扩展和显示扩展。

a)基本匹配包括:

匹配参数

说明

-p

指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议

-s

指定数据包的源地址参数,可以使IP地址、网络地址、主机名

-d

指定目的地址

-i

输入接口

-o

输出接口

5. 目标值

其中最常用的动作:

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

代码语言:javascript复制
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
代码语言:javascript复制
DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

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

代码语言:javascript复制
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 特别有用。范例如下:

代码语言:javascript复制
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

LOG  将数据包相关信息记录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如:

代码语言:javascript复制
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则链(mangle:postrouting)。范例如下:

代码语言:javascript复制
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200

DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下:

代码语言:javascript复制
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100

MIRROR 镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。

QUEUE  中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。

RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则链看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

代码语言:javascript复制
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

常见操作

1,删除INPUT链的第一条规则

代码语言:javascript复制
iptables -D INPUT 1

2,拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据

代码语言:javascript复制
iptables -A FORWARD -s 192.168.1.11 -j REJECT 
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
代码语言:javascript复制
说明:注意要把拒绝的放在前面不然就不起作用了

3,只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。

代码语言:javascript复制
iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT 
iptables -A INPUT -p tcp --dport 22 -j DROP
代码语言:javascript复制
说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时。

4,允许本机开放从TCP端口20-1024提供的应用服务。

代码语言:javascript复制
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT 
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT

5,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。

代码语言:javascript复制
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT

6,禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。

代码语言:javascript复制
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
代码语言:javascript复制
说明:此处用“-m –iprange –src-range”指定IP范围。

7,防止单个ip访问量过大,防止syn攻击(限制单个ip的最大syn连接数)

代码语言:javascript复制
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP

参考文章:

https://www.cnblogs.com/marility/p/7448407.html

可以查看原文:

https://mp.weixin.qq.com/s?__biz=MzA5NTgwNzY1NA==&mid=2247483663&idx=1&sn=26bd3d9d13700a3252b2b565e0a10ff9&chksm=90b8f0c6a7cf79d0cc52c0aa4a6852ab7d0e6fee0285f50029c5e5e912f9683e23bacf3fea5c&token=2069274630&lang=zh_CN#rd

0 人点赞