zoukankan      html  css  js  c++  java
  • 软件防火墙之iptables基础

    netfilter 中五个勾子函数和报文流向

    Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、
    PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具
    (iptables)向其写入规则
    由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
    

    三种报文流向

    1)流入本机:PREROUTING--> INPUT --> 用户空间进程
    2)流出本机:用户空间进程--> OUTPUT --> POSTROUTING
    3)转发:PREROUTING -->FORWARD -->POSTROUTING
    

    iptables组成

    五表五链以及一些规则组成

    链chain:
    1)内置链:每个内置链对应于一个钩子函数
    2)自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有HOOK钩子调用自定义链时,才生效
    
    五个内置链chain
    INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
    
    五个表 table:filter,nat,mangle,raw,security
    1)filter:过滤规则表,根据预定义的规则过滤符号条件的数据包,默认表
    2)nat:network address translation地址转换规则表
    3)mangle:修改数据标记位规则表
    4)raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
    5)security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELINUX)实现
    

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

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

    内核中数据包的传输过程

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

    范例,查看默认的表

    [root@localhost ~]# iptables -vnL
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    [root@localhost ~]# iptables -vnL -t filter
    Chain INPUT (policy ACCEPT 24 packets, 1600 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 14 packets, 1784 bytes)
     pkts bytes target     prot opt in     out     source               destination
    

    iptables规则添加时考量点

    1)要实现哪种功能:判断添加在哪张表上
    2)报文流经的路径:判断添加在哪个链上
    3)报文的流向:判断源和目的
    4)匹配规则:业务需要
    

    iptables常见的处理动作:

    1)内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...;其中最常用的只有,允许:ACCEPT,抛弃:DROP,拒绝:REJECT
    2)自定义处理动作:自定义chain,利用分类管理复杂情形;规则要添加在链上,才生效;添加在自定义链上不会自动生效。
    3)白名单:只有指定的特定主机可以访问,其它全拒绝
    4)黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式
    

    因为CentOS7,8都是Firewalls防火墙,所以需要关闭才能更好的使用iptables我们定义的防火墙规则

    [root@localhost ~]# systemctl disable --now firewalld
    

    iptables 用法说明

    帮助:man 8 iptables

    格式:

    iptables [-t table] {-A|-C|-D} chain rule-specification
    iptables [-t table] -I chain [rulenum] rule-specification
    iptables [-t table] -R chain rulenum rule-specification
    iptables [-t table] -D chain rulenum
    iptables [-t table] -S [chain [rulenum]]
    iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
    iptables [-t table] -N chain
    iptables [-t table] -X [chain]
    iptables [-t table] -P chain target
    iptables [-t table] -E old-chain-name new-chain-name
    rule-specification = [matches...] [target]
    match = -m matchname [per-match-options]
    target = -j targetname [per-target-options]
    

    iptables命令格式详解:

    iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]]
    -j targetname [per-target-options]
    

    1、-t table:指定表

    raw, mangle, nat, [filter]默认

    2、SUBCOMMAND:子命令

    链管理类:

    -N:new, 自定义一条新的规则链
    -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
    -X:delete,删除自定义的空的规则链
    -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受, DROP:丢弃
    

    查看类:

    -L:list,列出指定链上的所有规则,本选项需置后
    -n:numberic,以数字格式显示地址和端口号
    -v:verbose,详细信息
    -vv:更详细
    -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
    --line-numbers:显示规则的序号
    -S selected,以iptables-save命令格式显示链上规则
    

    规则管理类:

    -A:append,追加
    -I:insert,插入,要指明插入至的规则编号,默认为第一条
    -D:delete,删除
       1)指明规则序号
       2)指明规则本身
    -R:replace,替换指定链上的指定规则编号
    -F:flush,清空指定的规则链
    -Z:zero,置零
       iptables的每条规则都有两个计数器
         1)匹配到的报文的个数
         2)匹配到的所有报文的大小之和
    

    范例:

    [root@localhost ~]# iptables -F OUTPUT
    

    常用组合

    -vnL
    -vvnxL --line-numbers
    

    范例

    [root@localhost ~]# iptables -vnL
    Chain INPUT (policy ACCEPT 177 packets, 12622 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 106 packets, 9596 bytes)
     pkts bytes target     prot opt in     out     source               destination 
     
    [root@localhost ~]# iptables -vnL --line-numbers
    Chain INPUT (policy ACCEPT 1606 packets, 3268K bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1       22  1824 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    2        2   120 REJECT     all  --  *      *       172.31.0.18          0.0.0.0/0            reject-with icmp-port-unreachable
    3        1    60 REJECT     all  --  *      *       172.31.0.7           0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    Chain OUTPUT (policy ACCEPT 1338 packets, 98490 bytes)
    num   pkts bytes target     prot opt in     out     source               destination 
    

    匹配条件

    1)基本:通用的,PARAMETERS
    2)扩展:需加载模块,MATCH EXTENTIONS
    

    扩展动作:

    REJECT:--reject-with:icmp-port-unreachable默认
    RETURN:返回调用链
    REDIRECT:端口重定向
    LOG:记录日志,dmesg
    MARK:做防火墙标记
    DNAT:目标地址转换
    SNAT:源地址转换
    MASQUERADE:地址伪装
    自定义链
    

    iptables基本匹配条件

    基本匹配条件:无需加载模块,由iptables/netfilter自行提供

    [!] -s, --source address[/mask][,...]:源IP地址或者不连续的IP地址
    [!] -d, --destination address[/mask][,...]:目标IP地址或者不连续的IP地址
    [!] -p, --protocol protocol:指定协议,可使用数字如0(all)
    protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“
    参看:/etc/protocols
    [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、
    FORWARD、PREROUTING链
    [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于
    FORWARD、OUTPUT、POSTROUTING链
    

    范例:

    准备好一个可以访问的网站页面
    [root@localhost ~]# yum install -y httpd;echo 172.31.0.17 > /var/www/html/index.html;systemctl start httpd
    
    没有添加iptables规则时其他机器可以访问
    [root@localhost ~]# curl 172.31.0.17
    172.31.0.17
    
    iptables设置
    [root@localhost ~]# iptables -vnL
    Chain INPUT (policy ACCEPT 365 packets, 25579 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 215 packets, 23508 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    [root@localhost ~]# iptables -A INPUT -s 172.31.0.18,172.31.0.7 -j REJECT
    [root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT
    
    添加完iptables规则后,只有本机可以访问,被规则限制的ip不能访问
    [root@localhost ~]# curl 127.0.0.1
    172.31.0.17
    
    [root@localhost ~]# curl 172.31.0.17
    curl: (7) Failed connect to 172.31.0.17:80; Connection refused
    
    [root@sz-kx-centos8 ~]# curl 172.31.0.17
    curl: (7) Failed to connect to 172.31.0.17 port 80: Connection refused
    

    范例:添加某个固定ip并允许

    [root@localhost ~]# iptables -A INPUT -s 172.31.0.1 -j ACCEPT
    

    范例:添加某个固定ip并丢弃

    [root@localhost ~]# iptables -A INPUT 1 -s 172.31.0.18 -j DROP
    

    范例:添加整个网段并拒绝连接(谨慎使用

    [root@localhost ~]# iptables -A INPUT -s 172.31.0.0/16 -j REJECT
    

    范例:在序号3插入

    [root@localhost ~]# iptables -I INPUT 3 -s 172.31.0.100 -j ACCEPT
    [root@localhost ~]# iptables -vnL --line-numbers
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1       22  1824 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    2      405 32145 ACCEPT     all  --  *      *       172.31.0.1           0.0.0.0/0           
    3        0     0 ACCEPT     all  --  *      *       172.31.0.100         0.0.0.0/0           
    4        2   120 REJECT     all  --  *      *       172.31.0.18          0.0.0.0/0            reject-with icmp-port-unreachable
    5        1    60 REJECT     all  --  *      *       172.31.0.7           0.0.0.0/0            reject-with icmp-port-unreachable
    6       40  2473 REJECT     all  --  *      *       172.31.0.0/16        0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    Chain OUTPUT (policy ACCEPT 51 packets, 5936 bytes)
    num   pkts bytes target     prot opt in     out     source               destination
    

    范例:删除序号3这条规则

    [root@localhost ~]# iptables -D INPUT 3
    

    范例:替换序号4的规则把拒绝替换成允许

    [root@localhost ~]# iptables -R INPUT 4 -s 172.31.0.7 -j ACCEPT
    

    范例:清空所有规则

    [root@localhost ~]# iptables -F
    

    范例:iptables默认是黑名单,改成白名单

    [root@localhost ~]# iptables -P INPUT DROP
    # 实现效果如下:
    [root@localhost ~]# iptables -vnL
    Chain INPUT (policy ACCEPT 48 packets, 4965 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 40 packets, 5824 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    [root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
    [root@localhost ~]# iptables -A INPUT -s 172.31.0.17  -j ACCEPT
    [root@localhost ~]# iptables -A INPUT -s 172.31.0.1  -j ACCEPT
    [root@localhost ~]# iptables -A INPUT -s 172.31.0.1  -j REJECT
    [root@localhost ~]# iptables -P INPUT DROP
    
    [root@localhost ~]# iptables -vnL
    Chain INPUT (policy DROP 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
        0     0 ACCEPT     all  --  *      *       172.31.0.17          0.0.0.0/0           
      103  6840 ACCEPT     all  --  *      *       172.31.0.1           0.0.0.0/0           
        0     0 REJECT     all  --  *      *       172.31.0.1           0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 21 packets, 2152 bytes)
     pkts bytes target     prot opt in     out     source               destination
    

    规则优化最佳实践

    1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
    2. 谨慎放行入站的新请求
    3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
    4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
    5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更
    高
    6. 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
    7. 设置默认策略,建议白名单(只放行特定连接)
         iptables -P,不建议,容易出现“自杀现象”
         规则的最后定义规则做为默认策略,推荐使用,放在最后一条
    

    iptables保存规则

    以上命令都是临时生效,持久保存规则需要如下操作:

    方法一:

    # 保存规则
    [root@localhost ~]# iptables-save > /home/iptables.ruls
    
    # 执行导入保存的规则
    [root@localhost ~]# iptables-restore < /home/iptables.ruls
    
    写入开机启动配置
    [root@localhost ~]# vim /etc/rc.d/rc.local
    
    iptables-restore < /home/iptables.ruls
    
    # 加执行权限
    [root@localhost ~]# chmod +x /etc/rc.d/rc.local
    

    方法二:(CentOS7,8)

    # 安装
    [root@localhost ~]# yum install iptables-services
    
    添加到配置文件里面
    [root@localhost ~]# iptables-save > /etc/sysconfig/iptables
    
    启动
    [root@localhost ~]# systemctl start iptables
    设置开机启动
    [root@localhost ~]# systemctl enable --now iptables
    
  • 相关阅读:
    2018.10.10python homework
    2018.10.10python学习第十六天part3
    2018.10.10python学习第十六天part2
    2018.10.10python学习第十六天part1
    2018.09.28python学习第十三天part3
    2018.09.28python学习第十三天part2
    2018.09.28python学习第十三天part1
    当不搞技术好几年后,又回来了,忽然很亲切
    福大软工 · BETA 版冲刺前准备(团队)
    事后诸葛亮
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/14748275.html
Copyright © 2011-2022 走看看