ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

iptables学习笔记

2022-01-13 21:30:13  阅读:157  来源: 互联网

标签:iptables filter #- 笔记 学习 规则 INPUT 数据包


Linux-IP tables

简单介绍

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架。Netfilter所设置的规则是存放在内核空间中的,而iptables是一个应用层的应用程序,它通过Netfilter放出的接口来对存放在内核空间中的 XXtables(Netfilter的配置表)进行修改

五链四表

五链

iptables开启后,数据报文从进入服务器到出来会经过5道关卡
在这里插入图片描述

  • **INPUT链:**当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
  • **OUTPUT链:**当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
  • **FORWARD链:**当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则;
  • PREROUTING链:(互联网进入局域网)在对数据包作路由选择之前,应用此链中的规则,如DNAT;
  • POSTROUTING链:(局域网出互联网)在对数据包作路由选择之后,应用此链中的规则,如SNAT。

四表

虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”:
– **filter表:**主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter;
– **nat表:**network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat;
– **mangle表:**拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;
– **raw表:**是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。
我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。
链表关系
在这里插入图片描述
每条链上各个表被匹配的顺序为:raw→mangle→nat→filter

匹配规则

匹配条件

  • **S_IP:**source ip,源ip
  • **S_PORT:**source port,源端口
  • D_IP: destination ip,目标ip
  • D_PORT: destination port,目标端口
  • **TCP/UDP:**第四层(传输层)协议

处理的动作

  • **ACCEPT:**允许数据包通过;
  • **DROP:**直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;
  • **REJECT:**拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;
  • **SNAT:**S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;
  • **MASQUERADE:**是SNAT的一种特殊形式,适用于动态的、临时会变的IP上;
  • **DNAT:**D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;
  • **REDIRECT:**在本机做端口映射;
  • **LOG:**在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
    除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

    启动iptables

# 启动iptables
systemctl start firewalld
# 查看iptables状态
systemctl status firewalld
# 停止iptables
systemctl stop firewalld
# 重启iptables
systemctl restart firewalld
# 重载iptables
systemctl reload firewalld

参数选项

#-L list缩写
iptables -L INPUT  #查看INPUT链上的规则
iptables -L    #查看所有链上规则
#-t  table缩写
iptables -t filter -L  #查看filter表中的规则
#-n  numeric的缩写,意思是指定源和目标地址、端口什么的都以数字/数值的方式显示,否则默认会以域名/主机名/程序名等显示,该选项一般与`-L`合用
#-v verbose缩写,即输出更加详细的信息,可以和-L 连用,连用时-L一定要放最后,其后面要放置参数
#--line-numbers 显示列表序号,--line也可
#-I 指定在哪条链中
#-s 匹配源IP
#-j jump跳转,其后面指定动作,如ACCEPT、DROP、REJECT等等
#-F flush 清空
#-R replace替换
#-P policy策略
iptables -t raw -P OUTPUT ACCEPT
#-d destination 目标地址
#-p 用于匹配协议
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
#-i 用于匹配哪个网卡接口流入本机
iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
#-o 用于匹配哪个网卡接口流出本机

规则的增删改查

#添加
iptables -t filter -I INPUT -s 192.168.198.129 -j DROP
#删除
iptables -t filter -D INPUT 2  #根据编号
iptables -t filter -D INPUT -s 192.168.198.129 -j DROP  #根据条件
iptables -t filter -F INPUT  #清空INPUT链上filter表中的规则
#修改
iptables -t filter -R INPUT 1 -s 192.168.198.129 -j ACCEPT
iptables -P FORWARD DROP  #把FORWARD链的默认规则设置为DROP

其保存文件在/etc/sysconfig/iptables

防御网站扫描器的扫描脚本

# 日志文件路径
logfile=/var/log/httpd/
last_minutes=1 
# 开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义) 时间格式:日月年时分秒
start_time=`date -d"$last_minutes minutes ago" +"%d/%m/%Y:%H:%M:%S"`
echo $start_time
# 结束时间现在
stop_time=`date +"%d/%m/%Y:%H:%M:%S"`
echo $stop_time
cur_date="`date +%d/%m/%Y`"
echo $cur_date
# 过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径
tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($4,2);if(t>=st && t<=et){print $1}}' |sort | uniq -c | sort -nr > $logfile/log_massage
#ip_top=`cat $logfile/log_massage| head -1 | awk '{print $1}'`
# 出现横杠使用sed去掉第一行
#sed -i '1d' $logfile/log_massage
# 单位时间[1分钟]内单ip访问次数超过200次的ip记录入massage.txt
ip=`cat $logfile/log_massage| awk '{if($1 > 100)print $2}'`
for line in $ip
do
echo $line >> $logfile/massage.txt
echo $line
iptables -I INPUT -p tcp  -m multiport --dport 80,443 -s $line -j DROP
done

标签:iptables,filter,#-,笔记,学习,规则,INPUT,数据包
来源: https://blog.csdn.net/qq_42960944/article/details/122481302

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有