前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5分钟学SRE-Iptables

5分钟学SRE-Iptables

原创
作者头像
五分钟学SRE
修改2023-11-17 13:02:14
2270
修改2023-11-17 13:02:14
举报
文章被收录于专栏:五分钟学SRE五分钟学SRE

iptables

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

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

netfilter

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

网络地址转换(Network Address Translate)

数据包内容修改

数据包过滤的防火墙功能

iptables的组成

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

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

image.png
image.png

五个表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三张表

image.png
image.png

五个内置链chain:

链 chain:

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

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

五条链:
  • input

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

  • output

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

  • forward

匹配流经本机的数据包

  • prerouting

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

  • postrouting

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

内核中数据包的传输过程

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

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

image.png
image.png
image.png
image.png

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • iptables
  • netfilter
  • iptables的组成
    • 五个表table:filter,nat,mangle,raw,security
      • 五个内置链chain:
        • 五条链:
    • iptables 内建各表格与链的相关性
    • iptables 安装
      • 1、关闭 firewall
        • 3、启动服务
          • 4、Iptables基本操作
          • iptables命令参考
            • 1. 表名
              • 2. 命令选项
                • 3. 链名
                  • 4. 条件匹配
                    • 5. 目标值
                    • 常见操作
                    相关产品与服务
                    命令行工具
                    腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档