iptables学习笔记

Linux-IP tables

简单介绍

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

五链四表

五链

iptables开启后,数据报文从进入服务器到出来会经过5道关卡
iptables学习笔记

  • **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。
我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。
链表关系
iptables学习笔记
每条链上各个表被匹配的顺序为: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
上一篇:filter过滤器&listener监听器


下一篇:FPGA信号处理系列文章——Xilinx FIR IP的matlab模型的使用