centos7 firewall、iptables使用小记

本文详细介绍了Linux系统的firewall和iptables的使用,包括firewall的安装、开启、规则管理,以及iptables的报文流向、表、链和规则设置。重点讲解了端口操作、自定义链、网络防火墙及NAT转发功能。内容涵盖了从基础命令到高级应用,适合系统管理员和网络安全从业者参考。
摘要由CSDN通过智能技术生成

一、firewall

1.1 安装及开启

  • 安装:centOS自带
  • 服务:
    # 防火墙 开启、开机启动、状态
    systemctl start firewalld
    systemctl enable firewalld
    systemctl status firewalld
    
    # 防火墙 关闭、重启、关闭开机启动
    systemctl stop firewalld
    systemctl restart firewalld
    systemctl disable firewalld
    

1.2 规则管理

1.2.1 常用参数

  • 部分常用参数
    参数选项参数名
    –permanent永久生效,否则重启后失效
    –zone=区域名功能:指定规则生效区域,常规为public区域,开启ssh端口22,允许ping
    获取所有区域名firewall-cmd --get-zones
    不带此参数表示针对默认区域firewall-cmd --get-default-zone
    设置默认区域 firewall-cmd --set-default-zone=区域名
    –timeout=秒数指定此规则在设定秒数后清除
    –reload修改规则后,需要重新加载配置文件,服务不会中断

1.2.2 端口操作

  • 此处端口打开指针对外网,本机端口不受限制
  • 均针对默认区域
    # 查询开启的端口
    firewall-cmd --list-ports
    > 22/tcp
    
    # 临时开启端口用于测试,立即生效,不用reload
    firewall-cmd --add-port=1234/tcp --timeout=1m
    > success
    
    # 永久开启端口,可以指定区间1024-2048/tcp,必须reload,否则不生效
    firewall-cmd --add-port=1024/tcp --permanent
    # 不断开连接的情况下,加载配置
    firewall-cmd --reload
    > success
    
    # 删除端口
    firewall-cmd --remove-port=1024/tcp
    

二、iptables

  • 与firewall关系:firewall与iptables均为操作内核中的安全框架netfilter的工具,firewall操作端口的动作也是基于iptables,但是iptables中的端口等规则在firewall中无法查询,导致莫名的无法访问,特别是针对docker
  • 功能:直接操作网络层的报文,包含对报文的过滤,改写,转发NAT,可作为网络防火墙主外(集体), 主机防火墙主内(个人)
  • 本文参考博客:传送门,此处仅做总结归纳

2.1 报文流向

  • 超重点
    在这里插入图片描述

2.2 表、链、规则

关系:表中存链,链中存规则

  • 四表
    表名功能
    filter表(常用)负责过滤功能,防火墙;内核模块:iptables_filter
    nat表(常用)network address translation,网络地址转换功能;内核模块:iptable_nat
    mangle表(不用)拆解报文,做出修改,并重新封装 的功能;iptable_mangle
    raw表(不用)关闭nat表上启用的连接追踪机制;iptable_raw
  • 五链
    • PREROUTING:常用来改写目的地址与端口(NAT相关)
    • INPUT:常用于写过路由表后的入过滤规则
    • FORWARD:常用于写NAT嵌入过滤规则(NAT相关)
    • OUTPUT:常用于写过路由表后的出过滤规则
    • POSTROUTING:常用来改写源地址与端口(NAT相关)

  • 规则写法
    • 规则执行:在链表中按从上到下依次匹配,若无匹配,执行默认策略
    • 命令写法:iptables [指定表] 指定链 匹配规则 指定动作
      • 指定表:-t nat,默认为-t filter可不写
      • 指定链、匹配规则:见2.3节
      • 指定动作
        动作名动作意义
        ACCEPT允许数据包通过
        DROP直接丢弃数据包,不给任何回应信息,客户端超时后断开链接
        REJECT拒绝数据包通过,客户端刚请求就会收到拒绝的信息
        SNAT源地址转换,解决内网用户用同一个公网地址上网的问题
        MASQUERADE是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
        DNAT目标地址转换
        REDIRECT在本机做端口映射
        LOG/var/log/messages文件中记录日志信息,不做其他动作,然后将数据包传递给下一条规则
        自定义链将匹配到的报文转给自定义链

2.3 基础命令

2.3.1 前期准备

  • 关闭SELINUX:设置/etc/sysconfig/selinux中SELINUX=disabled,需重启
  • 卸载防火墙
    # 需要卸载firewall防火墙,启用iptables-services防火墙,
    # 否则docker的规则看不见但生效
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl status firewalld
    systemctl remove firewalld -y
    
  • 安装iptables服务
    # 功能:规则保存后,开机后不丢失,否则需要配置脚本
    yum install iptables-services.x86_64 -y
    # iptables服务开启、开机启动、查看启动状态
    systemctl start iptables
    systemctl enable iptables
    systemctl status iptables
    

2.3.2 查询操作

  • 查询filter表 iptables [-t filter] -L
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
    ACCEPT     icmp --  anywhere             anywhere            
    ACCEPT     all  --  anywhere             anywhere            
    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination 
    
  • 查询nat表 iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination  
    
  • 不进行IP地址名称反解查询 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
    ...
    
  • 显示行号查询 iptables -L --line-number
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
    ...
    
  • 详细单链查询 iptables -vL INPUT
    # policy ACCEPT:当前链的默认规则,即不匹配所有规则后执行此规则
    # pkts\bytes:当前链已匹配到的包的数量\大小总和
    # target:指定动作
    # prot:协议 tcp\udp\icmp
    # opt:规则选项
    # in/out:包流向的入网卡、出网卡
    # source/destination:包流向的源地址、目标地址,最后为描述性文字
    
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts	bytes	target	prot	opt	in	out	source		destination         
    55110	3601K	ACCEPT	all		--	any	any	anywhere	anywhere	state RELATED,ESTABLISHED
    ...
    

  • 总结
    • 行号:常用于插入和删除前的操作
    • 查询规则:常用iptables -nL
    • 查询链操作:iptables -nL INPUT, 仅显示filter表的INPUT链

2.3.3 删除及保存

  • 格式化表:iptables [-t filter] -F
  • 格式化链:iptables [-t filter] -F INPUT
  • 删除规则:iptables [-t filter] -D INPUT 1,数字1为行号,–line-number获得的
  • 保存策略:service iptables save,保存在/etc/sysconfig/iptables中,可直接在里面写

2.4 功能实现

2.4.1 匹配条件

  • 未指定:以下均指所有,ALL的意思
  • ip匹配条件
    写法意义
    -s 192.168.1.1单个ip
    -s 192.168.1.1,192.168.1.2离散ip
    -s 192.168.1.0/24网段ip
    ! -s 192.168.1.123取反,非后面的ip即可
    -s 192.168.1.1 -d 192.168.1.2同时符合源与目标地址才匹配
  • 协议匹配条件:-p tcp,还包含tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
  • 网卡接口匹配条件:
    • 写法:-i eth0 -o eth1报文从eth0网卡流入,从eth1网卡流出
    • 查询:iptables -vL中的in,out列可以显示网卡名
  • 端口匹配条件
    写法意义
    -p tcp [-m tcp] --sport 1234单端口,模块与协议同名可省略,–dport为目标端口,其前为双横杠
    -p tcp --sport 0:100连续区间,0:100:100同义,互补区间100:
    -p tcp -m multiport --sports 80,443离散端口,也可80,90:100这种写法,注意是复数,–dports
  • time模块小应用
    # 设置防火墙固定时间无法看网页
    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
    

2.4.2 单机防火墙

  • 端口关闭/开放

    # 测试机用运行:清空filter的所有链中的规则
    iptables -F
    
    # 插入filter表INPUT链尾:访问本机的22端口均直接放行,端口必须指定协议
    # -I INPUT 1可指定插入行位置
    iptables -I INPUT -p tcp --dport 22 -j ACCEPT
    
    # 插入filter表INPUT链首:此源主机数据包均直接丢弃不给回复
    # 针对所有协议,所以可以ping下测试
    iptables -A INPUT -s 192.168.1.102 -j DROP
    
    # 添加到最尾部,有白名单效果
    iptables -A INPUT -j DROP
    
    # 修改INPUT表的默认策略(若无其他ACCEPT策略,将失去ssh连接,常规别修改)
    # iptables -t filter -P INPUT DROP
    

    以上操作效果:注意顺序,服务器除22端口开放=》源ip为192.168.1.102直接丢弃=》所有包丢弃,中间任一条匹配,后续都不再匹配

  • 禁外部ping规则设定机操作

    iptables -F
    # 102若ping当前机,会返回端口不可达,若为DROP,会返回超时
    # 此处需加此参数8,否则当前机ping外部的返回报文也被拦截了
    iptables -I INPUT -s 192.168.1.102 -p icmp --icmp-type 8 -j REJECT
    

    以上操作效果:注意顺序,源ip为192.168.1.102的ping报文均拒绝=》所有报文均接受(INPUT链默认策略)

  • INPUT链第一条(因匹配频率最高,放首位)

    # 常放在INPUT第一条:已建立连接的报文均直接放行
    > iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    > 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
    
    状态名意义
    NEW连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW
    ESTABLISHED我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立
    RELATEDFTP服务中建立连接后的相关状态
    INVALID如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文
    UNTRACKED报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接

2.4.3 自定义链

  • 应用:分类管理过滤条件,docker中大量应用
  • 示例过程
    > iptables -F
    # 自定义链名
    > iptables -N IN_WEB
    > iptables -nL
    # 显示0 references,表示自定义链还没有被任何默认链所引用
    Chain IN_WEB (0 references)
    
    # 给自定义链添加规则
    > iptables -I IN_WEB -s 192.168.1.102 -p icmp -j REJECT
    # 引用自定义链
    > iptables -I INPUT -j IN_WEB
    # 查看效果
    > iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    IN_WEB     all  --  0.0.0.0/0            0.0.0.0/0           
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain IN_WEB (1 references)
    target     prot opt source               destination         
    REJECT     icmp --  192.168.1.102        0.0.0.0/0            reject-with icmp-port-unreachable
    

    报文流转:报文会从INPUT链进入IN_WEB链,执行完IN_WEB链,若未匹配到任何会返回INPUT链继续执行后续

  • 删除自定义链
    # 删自定义链,其必须为空
    > iptables -F IN_WEB 
    # 自定义链未被任何其他链引用
    > iptables -D INPUT 1
    # 删自定义链
    > iptables -X IN_WEB
    
  • 重命名自定义链:iptables -E IN_WEB WEB,引用的链会自动联动更新这个名字

2.4.4 网络防火墙及转发NAT

  • 开启核心转发功能
    • 临时开启:echo 1 > /proc/sys/net/ipv4/ip_forward,立即生效
    • 永久开启:/usr/lib/sysctl.d/00-system.conf文件中net.ipv4.ip_forward设置为1,重启生效

  • 防火墙功能(即转发中过滤报文)
    # 白名单策略
    > iptables -A FORWARD -j REJECT
    # 过滤语句:看2.1节图,转发数据流向,源地址为此网段,目的端口为80,均放行
    > iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
    # 已建立的连接直接放行
    > iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    

    测试网络配置:传送门,比较繁杂,了解过程即可

    # centOS7 路由表
    > route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
    192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
    

    路由寻址:对应2.1节的路由选择,先用报文的ip匹配路由表的(Destination/Genmask:目的地址/网络掩码),匹配就从相应网卡接口Iface送出去,没找到就从默认网关Flags(UG)送出,完整路由表会有匹配优先级项


  • NAT转发功能
    • 场景1:局域网有多个客户端,使用一个公网ip访问外网
      # DHCP组网的:指定源地址段-s,报文流出的网卡接口,MASQUERADE进行动态的SNAT操作,自动维护nat表
      > iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
      # 静态ip组网的:效率更高
      > iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 公网IP
      

      核心:内网报文在向外网最终发出前,修改报文源ip为节点机器的公网IP,返回的报文会通过节点机维护的nat表找到内网机,2.1节表

    • 场景2:局域网有多个服务器,使用一个公网ip给外网提供服务,即反向代理,Nginx和路由器端口映射都可以实现
      # 服务器必须静态IP:报文流向是从外网=>PREROUTING =>内网,私网IP:端口号
      > iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 192.168.1.123:80
      

      核心:外网报文进入节点机过路由表前,修改报文目标ip为内网指定IP,返回的报文会通过节点机维护的nat表找到外网机,2.1节表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值