Iptables防火墙

Iptables防火墙

一、Iptables防火墙概述
0.前言
# 学好iptables的基础:
  1、OSI7层模型以及不同层对应哪些协议?
  2、TCP/IP三次握手,四次断开的过程,TCP HEADER,状态转换
  3、常用的服务端口要非常清楚了解。
  4、常用服务协议原理http协议,icmp协议。

企业中安全配置原则:
  1、尽可能不给服务器配置外网IP,可以通过代理转发或者通过防火墙映射。
  2、并发不是特别大情况有外网IP,可以开启防火墙服务。
  3、大并发的情况,不能开iptables,影响性能,利用硬件防火墙提升架构安全。


#  iptables防火墙使用时名词概念理解

容器:装东西的器皿,docker容器技术,将镜像装在了一个系统中,这个系统就称为容器
iptables称为一个容器---装着防火墙的表
防火墙的表又是一个容器---装着防火墙的链
防火墙的链也是一个容器---装着防火墙的规则
iptables---表---链---规则

规则:防火墙一条一条安全策略
防火墙匹配规则流程:
  1.    防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
  2.    如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
  3.    如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
  4.    防火墙的默认规则是所有规则执行完才执行的。
1.应用场景
1.主机安全
2.内部共享上网
3.端口或IP转发
2.iptables注意事项
1.匹配规则是从上往下依次执行的
2.只要匹配到某一条规则,就不会在往下执行
3.如果都没有匹配到规则,就执行默认规则
4.默认规则最后执行,默认允许所有
5.经常使用的规则尽量往前放

#  匹配规则是从上往下依次执行的,切记,切记
二、iptables四表五链
1.四表五链
#四表:
filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理
#五链:
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
4表5链
1、Filter:实现防火墙安全过滤功能
      INPUT       对于指定到本地套接字的包,即到达本地防火墙服务器的数据包      外面---->(门)房子iptables
        FORWARD     路由穿过的数据包,即经过本地防火墙服务器的数据包             外面-----(前门)房子(后门)---房子            
        OUTPUT     本地创建的数据包                                        外面<-----(门)房子iptables
2、NAT:实现将数据包中IP地址或者端口信息,内网到外网进行改写/外网到内网进行改写
        PREROUTING   一进来就对数据包进行改变           在路由之前,进行数据包IP地址或端口信息的转换           
        OUTPUT         本地创建的数据包在路由之前进行改变   本地防火墙要出去的流量进行相应转换(了解)
        POSTROUTING     在数据包即将出去时改变数据包信息     在路由之后,进行数据包IP地址或端口信息的转换
        
        SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示,如果内网主机访问外网而经过路由时,源IP会发生改变,这种变更行为就是SNAT;反之,当外网的数据经过路由发往内网主机时,数据包中的目的IP (路由器上的公网IP) 将修改为内网IP,这种变更行为就是DNAT
        
        注:
      在nat server 中,先更改配置文件,/etc/sysctl.conf 中改为
      net.ipv4.ip_forward = 1
      修改完成后,命令行sysctl -p 让其全部执行生效
      
3、Managle:对数据进行标记
4、Raw:将数据包一些标记信息进行拆解

2.filter表
#过滤数据包,主要作用就是阻止和允许访问
1.INPUT链:过滤流入主机的数据包
2.OUTPUT链:过滤流出主机的数据包
3.FORWARD链:负责转发流经主机的数据包
3.Nat表
#用于网络地址转换,主要作用就是端口转发和ip转发
1.OUTPUT链:过滤流出主机的数据包
2.PREROUTING链:数据包到达防火墙时进行判断,改写数据包的地址或或端口(进)
3.POSTROUTING链:数据包到达防火墙时进行判断,改写数据包的地址或或端口(出)
三、iptables安装
1.安装
[root@lb01 ~]# yum install -y iptables-services

2.启动
[root@lb01 ~]# systemctl stop firewalld
[root@lb01 ~]# systemctl restart iptables

防护墙实操
3.iptables常用参数
1.链管理:
    -N:new, 自定义一条新的规则链;
    -X:delete,删除自定义的规则链;
        注意:仅能删除 用户自定义的 引用计数为0的 空的 链;
    -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
           ACCEPT:接受
           DROP:丢弃
           REJECT:拒绝
          REDIRECT: 重定向重定向
          MASQUERADE 地址伪装
    SNAT 如果内网主机访问外网而经过路由时,源IP会发生改变,这种变更行为就是SNAT
    DNAT 当外网的数据经过路由发往内网主机时,数据包中的目的IP (路由器上的公网IP) 将修改为内网IP,这种变更行为就是DNAT
    -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
    
  ## 查看防火墙 [root@lb01 ~]# iptables -nL

2.规则管理:
    -A:append,追加;
    -I:insert, 插入,要指明位置,省略时表示第一条;
    -D:delete,删除;
        (1) 指明规则序号;
        (2) 指明规则本身;
    -R:replace,替换指定链上的指定规则;
    -R  表示将规则信息进行修改
    -F:flush,清空指定的规则链;
    -Z:zero,置零;
        iptables的每条规则都有两个计数器:
            (1) 匹配到的报文的个数;
            (2) 匹配到的所有报文的大小之和;

3.查看:
	-L:list, 列出指定链上的所有规则;
    -n:numberic,以数字格式显示地址和端口号;
    -v:verbose,详细信息;
        -vv, -vvv
    -x:exactly,显示计数器结果的精确值;
    --line-numbers:显示规则的序号;

四、iptables常用操作
1.查看防火墙策略(filter)
[root@lb01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 


[root@lb01 ~]# iptables -nL --line-numbers   # 显示防火墙规则的序号

2.查看指定表
-t   指定表

[root@lb01 ~]# iptables -nL -t raw
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

# 防火墙的表   raw  、nat 、filter 、mangle 

3.清空防火墙规则
#删除规则
[root@lb01 ~]# iptables -F
#删除自定义的链
[root@lb01 ~]# iptables -X
#计数器清零(缓存清空)
[root@lb01 ~]# iptables -Z

# 只能一个一个执行, iptables -F

4.添加防火墙规则
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP   # 轻易勿用

iptables 		#命令
-t 				#指定表
filter 			#指定链
-A				#添加规则
INPUT			#链的名字
-p				#指定协议d
tcp				#tcp协议
--dport			#指定端口
22 				#端口
-j 				#指定动作
DROP			#丢弃

### 执行完这条命令,机器自动断开 ,然后清空所有规则才能连接 

#删除规则
[root@lb01 ~]# iptables -F
#删除自定义的链
[root@lb01 ~]# iptables -X
#计数器清零
[root@lb01 ~]# iptables -Z


##    -A:append,向下添加
      -I:insert, 向上添加
 [root@lb01 ~]# iptables -t filter -R INPUT 1 -p tcp --dport 8080 -j DROP   --- -R 指定将配置好的规则信息进行替换

5.删除防火墙规则
#1.查看防火墙规则序号
[root@lb01 ~]# iptables -nL --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:111

#2.删除防火墙规则
[root@lb01 ~]# iptables -D INPUT 1  #从下删除

#3.再次查看
[root@lb01 ~]# iptables -nL --line-numbers
[root@pinglb01 ~]# iptables --line-numbers -nL   #TAB键可以出来
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:111

五、防火墙配置实例
1.禁止22端口访问
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP  #轻易勿用

2.拒绝IP访问
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.10.0.1 -i eth0 -j DROP  # 轻易勿用
-i		指定网卡
-s		指定源地址IP

[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.10.0.1 -i eth0 -j REJECT

3.禁止IP网段访问
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.10.0.0/24 -i eth0 -j REJECT
# REJECT 必须大写

4.只允许某个IP访问
#正规的使用方法
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.10.0.1 -i eth0 -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.10.0.0/24 -i eth0 -j DROP

#取反的使用
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp ! -s 10.10.0.1 -i eth0 -j DROP

#添加允许的ip时
[root@lb01 ~]# iptables -t filter -I INPUT -p tcp -s 10.10.0.8 -i eth0 -j ACCEPT
-I		向上添加规则
-A		向下添加规则

5.拒绝端口范围
# 如果端口是连续的
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp --dport 22:111 -j DROP

# 如果端口不是连续的
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 22,200 300:1999 -j DROP

六、企业一般配置
1.配置前考虑
1.考虑防火墙开在哪台机器上
2.这台机器部署了哪些服务
	nginx
	keepalive
	sshd
3.服务对应的端口和协议
	# 80
	# 443
	# 22
	 111
	 vrrp (112端口)
4.其他端口全部拒绝

4.配置默认拒绝所有
#注意天坑:

# 清空防火墙之前
# 要默认允许所有,在清空防火墙

#配置

[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443,20 -j ACCEPT

[root@lb01 ~]# iptables -t filter -A INPUT -p vrrp -j ACCEPT
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 172.16.1.6 --dport 22 -j ACCEPT
# 禁止172.16.1.6IP的22端口
[root@lb01 ~]# iptables -P INPUT DROP  #拒绝所有

#注意天坑:

配置好以后,不要清空防火墙规则,小心删除规则,因为我们最后一条配置的是默认拒绝所有,而清空防火墙规则不会更改其状态,还是默认拒绝所有,所以完犊子了
[root@lb01 ~]# iptables -P INPUT ACCEPT   #改成这个  然后从下往上清空,切记,切记!

2.防火墙规则永久生效
#配置完防火墙,执行以下操作,将自己配置的规则添加到防火墙的配置文件中
[root@lb01 ~]# service iptables save   然后就可以生效了
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

[root@lb01 ~]# cat /etc/sysconfig/iptables  #重启防火墙时,先执行在这个配置永久生效 
# Generated by iptables-save v1.4.21 on Wed Dec 16 15:39:15 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [1:176]
:POSTROUTING ACCEPT [1:176]
COMMIT
# Completed on Wed Dec 16 15:39:15 2020
# Generated by iptables-save v1.4.21 on Wed Dec 16 15:39:15 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [40:5168]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -s 10.10.0.1/32 -i eth0 -p tcp -j ACCEPT
-A INPUT -s 10.10.0.0/24 -i eth0 -p tcp -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Dec 16 15:39:15

[root@lb01 ~]# service iptables save   然后就可以永久生效了

七、iptables 转发
1.端口转发
[root@web01 ~]# iptables -t nat -A PREROUTING -p tcp --dport 3800 -j REDIRECT --to-port 80
# 本地3800端口重进向到80端口
[root@lb01 ~]# iptables -t nat -A PREROUTTNG -d 10.10.0.5  -p tcp --dport 6666 -j DNAT --to-destination 172.16.1.7:22

[root@lb01 ~]# iptables -t nat -A PREROUTTNG -s 172.16.1.7/24 -j SNAT --to-source 10.10.0.5

[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 5555 -j DNAT --to-destination 172.16.1.7:22

[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-d                  指定目的ip
DNAT                目标地址转换
--to-destination    目标地址转换指向

2.Ip转发
iptables -t nat -A PREROUTTNG -d 10.10.0.5 -j DNAT --to-destination 172.16.1.7

iptables -A FORWARD -i eth1 -s 172.16.1.0/24  -j ACCEPT

iptables -A FORWARD -o eth0 -s 172.16.1.0/24  -j ACCEPT

iptables -A FORWARD -i eth0 -d 172.16.1.0/24  -j ACCEPT

iptables -A FORWARD -i eth1 -d 172.16.1.0/24  -j ACCEPT

iptables -t nat -A PREROUTTNG -d  172.16.1.0/24 -j SNAT --to-destination 10.10.0.5

3.内部共享上网
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

iptables -A FORWARD -i eth1 -s 172.16.1.0/24  -j ACCEPT

iptables -A FORWARD -o eth0 -s 172.16.1.0/24  -j ACCEPT

iptables -A FORWARD -i eth0 -d 172.16.1.0/24  -j ACCEPT

iptables -A FORWARD -i eth1 -d 172.16.1.0/24  -j ACCEPT

iptables -t nat -A PREROUTTNG -s  172.16.1.0/24 -j SNAT --to-destination 10.10.0.5

4、企业面试题
1、详述iptales工作流程以及规则过滤顺序?
2、iptables有几个表以及每个表有几个链?
3、iptables的几个表以及每个表对应链的作用,对应企业应用场景?
4、画图讲解iptables包过滤经过不同表和链简易流程图并阐述。
5、请写出查看iptables当前所有规则的命令。
6、禁止来自10.0.0.188 ip地址访问80端口的请求
7、如何使在命令行执行的iptables规则永久生效?(service iptables save)
8、实现把访问10.0.0.3:80的请求转到172.16.1.17:80(iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8)
9、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
10、写一个防火墙配置脚本,只允许远程主机访问本机的80端口(奇虎360面试题)

iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT  -j DROP

11、写一个脚本解决DOS攻击生产案例


问题描述
写一个脚本解决DOS攻击生产案例:
==提示:==根据web日志或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,立即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。
防火墙命令为:iptables -I INPUT -s (源ip地址) -j DROP

思路
取到ip和ip访问次数
统计ip访问次数是否大于100次
判断出来后设置防火墙命令,并查看是否执行成功
根据实际情况进行优化


#!/bin/bash
# 日志文件路径
logfile=/usr/local/nginx/logs
last_minutes=1 
# 开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)
start_time=`date -d"$last_minutes minutes ago" +"%Y-%m-%d"T"%H:%M:%S"`
echo $start_time
# 结束时间现在
stop_time=`date +"%Y-%m-%d"T"%H:%M:%S"`
echo $stop_time
cur_date="`date +%Y-%m-%d`" 
echo $cur_date
# 过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径
tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,1);if(t>=st && t<=et){print $1}}' |sort | uniq -c | sort -nr > $logfile/log_ip_top10
#ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
# 出现横杠使用sed去掉第一行
#sed -i '1d' $logfile/log_ip_top10    
# 单位时间[1分钟]内单ip访问次数超过200次的ip记录入black.txt
ip=`cat $logfile/log_ip_top10 | awk '{if($1>200)print $2}'`
for line in $ip
do
echo $line >> $logfile/getip.txt
echo $line
iptables -I INPUT -p tcp  -m multiport --dport 80,443 -s $line -j DROP
done
 
 
# ab -n 1000 -c 100 http://192.168.2.3/   使用ab测试 模仿100个客户端访问1000次
#  webbench -c 2 -t 2 http://192.168.2.3/ 使用webbench测试 
# 删除之前日志
# 定义日志格式  
#    log_format main '$remote_addr $time_iso8601 $status $http_x_forwarded_for '
#    '$remote_user $http_host $request $upstream_addr '
#    'ups_resp_time:$upstream_response_time request_time:$request_time';
#    access_log logs/access.log main;
#192.168.2.21 2019-08-14T16:48:03+08:00 200 - - 192.168.2.27 GET / HTTP/1.0 - ups_resp_time:- request_time:0.000

# 注释iptables -I INPUT -s $line -j DROP
# 查看 log_ip_top10文件 分析IP地址
# cat access.log |grep IP


# 方式二:
mm:
t1='date -d "-1 min " +%Y:%H:%M'
log=/var/log/nginx/access.log
 
block_ip()
{
    egrep "$t1:[0-5]+ "  $log > /tmp/tmp_last_min.log
 
    #把一分钟内访问量高于100的ip地址记录到一个临时文件中。
    awk '{print $1}'  /tmp/_last_min.log | sort -n | uniq -c | awk '$1>100 {print $2}' > /tmp/bad_ip.list
 
    #计算ip的数量
    n=`wc -l /tmp/bad_ip.list | awk '{print $1}'`
    
    #当ip数大于0时,才会用iptables封掉。
    if [ $n -ne 0 ]
    then 
        for ip in `cat /tmp/bad_ip.list`
        do 
           iptables -I INPUT -s $ip -j REJCT
        done
        
# 方式三:
11、写一个脚本解决DOS攻击生产案例
#!/bin/bash

# 写一个脚本解决DOS攻击生产案例
# 过滤出IP及IP重复次数
# grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/nginx/access.log
# awk '{print $1}' /var/log/nginx/access.log
# awk '{print $1}' /var/log/nginx/access.log | uniq -c | sort -n
# 每一分钟怎么做?
# 将统计结果超过100的,屏蔽掉

DIR="/var/log/nginx/access.log"
IPS_DIR="/var/log/nginx/IPS.txt"
DATE=`date +%F_%H_%M`
BACKUP_DIR="/var/log/nginx/backup"
NEW_FILE_NAME=$BACKUP_DIR/$DATE.txt

if [ ! -d $BACKUP_DIR ];then
  mkdir -pv $BACKUP_DIR
fi

cp -r $DIR $NEW_FILE_NAME
>$DIR

awk '{print $1}' $NEW_FILE_NAME | sort | uniq -c | sort -n > ${IPS_DIR}

while read line
do

        COUNT=`echo $line | awk '{print $1}'`
  IP=`echo $line | awk '{print $2}'`
  if [ $COUNT -gt 100 ];then
    /usr/sbin/iptables -t filter -A INPUT -s $IP -p tcp -j DROP 
  fi
  
done < ${IPS_DIR}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值