默认计划
930人加入学习
(23人评价)
Linux安全基础
价格 ¥ 399.00
该课程属于 高校公益行 | 网络安全实践训练营 请加入后再学习


重置root密码

   CentOS 7 与之前的版本不同,当忘记root密码,并采用GRUB2为启动器时,将无法通过单用户模式重置root密码
   1、启动系统,并在 GRUB2启动屏显时,按下e键进入编辑模式
   2、找到  linux16开头的行  ,按  end键到行尾,输入一个空格键之后再输入   rd.break
      Ctrl+x  进入  提示符界面
   3、 输入  mount  -o   remount,rw   /sysroot/  命令   ,重新挂载系统分区   // 此步之前系统分区是只读状态
   4、再输入   chroot   /sysroot/  命令  ,  改变根
   5、修改root密码                 此时出现类似乱码的字符,属于正常现象
   6、 如果之前系统启用了SELinux ,必须运行  touch   /.autorelabel   命令,否则将无法正常启动系统
   7、然后按  Ctrl + d  退出
   8、输入  reboot 命令重启 , OK
   
   重启后等待时间可能有点长,属于正常现象
   这样方便是方便,但是不安全啊,下面有解决方案

为GRUB2菜单加上防编辑密码
   
   第一步:
      [root@huawei_plus ~]# grub2-mkpasswd-pbkdf2
      输入口令:
      Reenter password:
      PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.8EBF7E924D4F2751C16EDA60B01CCF2132082125CFAE98C932FDC9981AAA64E38615454C214E7BA4195836EC8AF5580B7DB24316ED4F343F501DE3C36C5420D8.783DD1820A3F9FB61264293E2EBDFF83551218B57DCABD63412232E5F5252CB9D0CEC2FDCE7955E86415CFA6D69B6DB019D1D382E99A6C47E96FF3E41CE72F29
   第二步:
      复制第一步的加粗字符串
      vi  /boot/grub2/grub.cfg   添加 下面的加粗字体,注意上下文对应
      ### BEGIN /etc/grub.d/10_linux ###
      set superusers="cws"                                            # 注意是  superusers   有 s
      password_pbkdf2  cws   此处粘贴第一步复制的加粗字符串
      menuentry 'CentOS Linux (3.10.0-862.11.6.el7.x86_64) 7 (Core)'
      
      上面的superuser可以随便定
      保存退出,测试
   再安装之前那样重置root密码的步骤,按下 e键之后,需要输入用户名(对应于 superusers )和密码(对应于 输入 grub2-mkpasswd-pbkdf2命令后 输入的口令  )
   这样,就为 GRUB2菜单加上了防编辑密码

单用户模式重置root密码
   
      在grub 页面输入a,进入修改内核模式
      在内核的结尾“/”,输入空格,在输入single,回车
      启动系统,进入单用户模式
      Passwd root 修改密码
修复MBR


   
      
      
      
   
   

 

[展开全文]

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
  • 实验环境
    • 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
    • 配置ip地址
      • 防火墙端
        • vi /etc/udev/70-persistent-net.rules
          • 复制eth1和eth2的mac地址
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth1
          • 用于连接外网
          • 粘贴eth1的mac地址
          • static协议
          • IPADDR=172.16.8.100
          • MASKNET=255.255.255.0
          • GATEWAY=172.16.8.2 -这个应该是宿主机的IP或网关
          • DNS1=114.114.114.114
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth2
          • 用于连接内网
          • 粘贴eth2的mac地址
          • static协议
          • IPADDR=192.168.11.11
          • MASKNET=255.255.255.0
          • 无网关和DNS
        • vi /etc/sysconfig/network
        • vi /etc/hosts
        • reboot
      • 客户端(用于后面的NAT转发)
        • 仅主机模式
        • IP:192.168.11.3
        • 默认网关地址::192.168.11.11
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
        • 拒绝来自192.168.1.11的连接
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
        • 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
        • 允许该网段进行dns查询
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
        • 拒绝带以上标记的TCP包
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
        • 不带SYN标记的统统接收
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
        • 不允许来自别人的ping
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

iptables实现NAT功能

  • SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
    • 局域网各主机正确设置IP地址/子网掩码
      • 仅主机模式
      • IP:192.168.11.3
      • 默认网关地址::192.168.11.11
    • Linux网关需要支持IP路由转发
      • iptables -F
      • echo "1" > /proc/sys/net/ipv4/ip_forward
        • 或通过vi /etc/sysctl.conf编辑
      • sysctl -p 查看当前状态
      • 至此该Linux开启了路由转发功能
    • 编写SNAT转换规则
      • iptables -t nat -D POSTROUTING 1
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
        • POSTROUTING:路由选择后处理。
        • -s X.X.X.X/X:内网源地址。
        • -o eth1:外网接口。
        • --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
    • MASQUERADE —— 地址伪装
      • 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
  • DNAT,修改数据包的目标地址或端口号
    • 实现内网服务器通过防火墙发布到互联网
    • 局域网的Web服务器能够访问Internet
    • 网关的外网IP地址有正确的DNS解析记录
    • Linux网关支持IP路由转发
      • echo "1" > /proc/sys/net/ipv4/ip_forward
    • 编写DNAT转换规则
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
        • PREROUTING:DNAT使用PREROUTING链,路由选择前处理
        • -i eth1:外网接口。
        • -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
        • --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
          • 可以使用XAMPP自动部署web环境
          • 默认是80端口,其它端口的转发需要指定
          • 在浏览器输入172.16.8.100测试
    • 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22

 

iptables系统服务与脚本

  • 脚本位置:/etc/init.d/iptables
  • 规则文件位置:/etc/sysconfig/iptables
    • service iptables start|restart|stop|save…
  • 配置防火墙脚本
    1. 编写防火墙脚本→开机时自动执行该脚本
      • 脚本执行指令写入/etc/rc.d/rc.local
      • vim ipfw.sh
        #!/bin/bash
        WAN_IF="eth1"
        WAN_IP="172.16.8.100"
        LAN_IF="eth2"
        LAN_IP="192.168.11.11"
        LAN_NET="192.168.11.0/24"
        LAN_WWW_IP="192.168.11.10"
        IPT="/sbin/iptables"
        MOD="/sbin/modprobe"
        CTL="/sbin/sysctl"
        
    2. 加载必要的系统模块,在ipfw.sh中追加
      $MOD ip_tables
      $MOD ip_conntrack
      $MOD ipt_REJECT
      $MOD ipt_LOG
      $MOD ipt_iprange
      $MOD xt_tcpudp
      $MOD xt_state
      $MOD xt_multiport
      $MOD xt_mac
      $MOD ip_nat_ftp
      $MOD ip_conntrack_ftp
      
    3. 调整/proc参数, Linux内核控制及调优,在ipfw.sh中追加
      $CTL -w net.ipv4.ip_forward=1
      $CTL -w net.ipv4.ip_default_ttl=128
      $CTL -w net.ipv4.icmp_echo_ignore_all=1
      $CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1
      $CTL -w net.ipv4.tcp_syncookies=1
      $CTL -w net.ipv4.tcp_syn_retries=3
      $CTL -w net.ipv4.tcp_synack_retries=3
      $CTL -w net.ipv4.tcp_fin_timeout=60
      $CTL -w net.ipv4.tcp_max_syn_backlog=3200
      
    4. 具体的防火墙规则,在ipfw.sh中追加
      • 按表、链分别设置规则,包括默认策略
      $IPT -t filter -X
      $IPT -t nat -X
      $IPT -t filter -F
      $IPT -t nat -F
      $IPT -P INPUT DROP
      $IPT -P FORWARD DROP
      $IPT -P OUTPUT ACCEPT
      $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
      $WAN_IP
      $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
      DNAT --to-destination $LAN_WWW_IP
      
    5. 使用IP地址黑、白名单
        1. 建立IP地址列表文件
        • 黑名单、白名单分开保存
        • 每行一个IP地址,或网段地址
        vim /opt/ipfw.w
            192.168.11.0/24
            220.121.72.85
        ……
        vim /opt/ipfw.b
            218.29.30.131
            61.45.135.29
            121.113.79.81
        
        1. 在脚本中调用黑、白名单,在ipfw.sh中追加
        • 使用for循环
        • 封锁黑名单地址、放开对白名单地址的限制
        BLST="/opt/ipfw.b"
        for i in $(grep -v "^#" $BLST)
        do
        $IPT -I INPUT -s $i -j DROP
        $IPT -I OUTPUT -d $i -j DROP
        $IPT -I FORWARD -s $i -j DROP
        $IPT -I FORWARD -d $i -j DROP
        done
        WLST="/opt/ipfw.w"
        for i in $(grep -v "^#" $WLST)
        do
        $IPT -I INPUT -s $i -j ACCEPT
        $IPT -I OUTPUT -d $i -j ACCEPT
        $IPT -I FORWARD -s $i -j ACCEPT
        $IPT -I FORWARD -d $i -j ACCEPT
        done
        
    6. 开机自动运行脚本
      • cp ipfw.sh /opt/
      • vi /etc/rc.d/rc.local
        • 添加/opt/ipfw.sh
      • reboot
      • iptables -L 检查配置情况
      • iptables -t nat -L
  • 防火墙脚本的构成
    • 主机型防火墙
      • 针对本机进行保护
      • 主要针对filter表中的INPUT、OUTPUT链设置规则
      • 修改ipfw.sh
        #!/bin/bash
        # 1. 定义基本变量
        IPT= "/sbin/iptables"
        ……
        # 3.2 定义默认策略
        $IPT -P INPUT DROP
        $IPT -P FORWARD DROP
        $IPT -P OUTPUT ACCEPT
        # 3.3 设置filter表中的各种规则
        $IPT -A INPUT -p tcp --dport 80 -j ACCEPT
        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ……
        
    • 网络型防火墙
      • 针对网络互访进行保护
      • 主要针对filter表中的FORWARD链,以及nat表设置规则
      • 修改ipfw.sh
        #!/bin/bash
        ……
        # 4.3 设置nat表中的各种规则
        $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
        $WAN_IP
        $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
        DNAT --to-destination $LAN_WWW_IP
        # 4.4 设置filter表中的各种规则
        $IPT -A FORWARD -d $LAN_NET -i $WAN_IF -m state --state
        ESTABLISHED,RELATED -j ACCEPT
        ……
        

 

Firewalld防火墙

  • 特点
    • FirewallD提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
    • FirewallD支持IPv4、IPv6防火墙设置以及以太网桥接,并且拥有“运行时配置”和“永久配置”选项。
    • FirewallD支持允许服务或者应用程序直接添加到防火墙规则中。
    • FirewallD动态管理防火墙,不需要重启整个防火墙便可应用更改。
    • FirewallD通过D-BUS提供当前激活的防火墙设置信息,也通过D-BUS接受使用PolicyKit认证方式做的更改。
    • 系统托盘区图标来显示防火墙状态,方便开启和关闭防火墙。
    • 提供firewall-cmd命令行界面进行管理及配置工作。
    • 为libvirt提供接口及界面,在必须的PolicyKit相关权限允许的情况下实现。
    • 提供firewall-config图形化配置工具。
    • 实现系统全局及用户进程的防火墙规则配置管理。
  • 区域
    • 通过将网络划分成不同的区域(通常情况下称为zones),制定出不同区域之间的访问控制策略来控制不同信任程度区域之间转发的数据流。
    • 传统防火墙都有区域的概念。
      • 例:Netscreen防火墙中“Trust”与“Untrust”区域;
      • 例:ASA防火墙中“Inside”与“Outside”区域;
      • 例:IPCop防火墙中“Red”与“Green”区域。
    • 默认区域
      • 在配置规则时,不指定区域则被认定为写入到默认区域。
      • FirewallD防火墙的默认区域为“public”
    • 区域相关命令
      • firewall-cmd --get-zones
        • 当前支持的区域列表。
      • firewall-cmd --get-default-zone public
        • 显示默认区域。
    • 区域规则中的元素
      • 防火墙规则就是由这些元素构成
      • 预定义的服务
        • 服务是端口(和/或)协议组成的;当然,也可能还包括netfilter助手模块以及目标地址(由IPv4或IPv6地址构成)。
      • 端口和协议
        • 定义了tcp或udp端口,端口可以是一个端口或者一组端口范围。
      • ICMP过滤器
        • 可用于规则的ICMP报文类型;这些报文可以是信息请求,也可以是对信息请
          求或错误条件创建的响应。
      • 伪装
        • 将私网地址映射为公网IP地址(多为动态地址);即源地址转换。
      • 端口转发
        • 转发一个网络端口从一个网络节点到另一个网络节点的规则。
      • 接口与源(略)
      • 富规则(后面详细介绍)
    • FirewallD预定义区域
      • 丢弃区域(Drop Zone):任何进入的数据包都将被丢弃。这个类似与我们之前使用iptables -j DROP。
      • 阻塞区域(Block Zone):拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。
      • 公共区域(Public Zone):只接受那些被设定的连接。
      • 外部区域(External Zone):这个区域相当于路由器启用伪装(masquerading)选项。只有指定的连接会被接受。
      • 隔离区域(DMZ Zone):如果想要只允许给定的部分服务能被外部访问,可以在DMZ区域中定义。
      • 工作区域(Work Zone):在这个区域,我们只能定义内部网络。
      • 家庭区域(Home Zone):这个区域专门用于家庭环境。
      • 内部区域(Internal Zone):这个区域和工作区域(Work Zone)
        类似,只能通过被选中的连接。
      • 信任区域(Trusted Zone):该区域中的接口将被允许所有的网络通信。
    • 区域操作命令
      • firewall-cmd --set-default-zone=home
        • 设置默认区域
      • firewall-cmd --get-active-zones home
        • 查看当前活跃区域
      • firewall-cmd --list-all-zones
        • 列出全部区域及特性
        … …
        public (default, active)
        interfaces: eno16777728
        sources:
        services: dhcpv6-client ssh
        ports:
        masquerade: no
        forward-ports:
        icmp-blocks:
        rich rules:
        … …
        
      • firewall-cmd --zone=public --list-all -列出某一区域特性
      • 根据接口获取区域信息
        • firewall-cmd --get-zone-of-interface=eno16777728 public
      • 临时将接口增加到区域
        • firewall-cmd --zone=public --add-interface=eno16777728
      • 临时修改接口所属区域
        • firewall-cmd --zone=public --change-interface=eno16777728 success
      • 临时从区域中删除一个接口
        • firewall-cmd --zone=public --remove-interface=eno16777728 success
      • 查询区域中是否包含某接口,未指定区域名,实则为默认区域
        • firewall-cmd --zone= --query-interface=eno16777728 Yes
      • 查询区域中已启用的服务
        • firewall-cmd --zone= --list-services dhcpv6-client ssh
  • 防火墙基本操作
    • 启动服务
      • systemctl enable firewalld.service
    • 停止服务
      • systemctl stop firewalld.service
    • 查看防火墙状态
      • systemctl status firewalld.service
    • 服务管理
      • 显示服务列表
        • firewall-cmd --get-services
      • 显示当前服务
        • firewall-cmd --list-services
      • 允许某服务通过,其中选项--permanent,表示为永久配置项
        • firewall-cmd --permanent --zone=internal --add-service=http
      • 临时开启某服务,选项--timeout,表示临时开启秒数
        • firewall-cmd --zone=work --add-service=smtp --timeout=60
        • firewall-cmd --reload - 配置规则重新载入
      • 从区域移除服务
        • firewall-cmd --zone=public --remove-service=ftp
    • 端口管理
      • 打开或关闭端口,打开/关闭“443/tcp”端口在public区域
        • firewall-cmd --zone=public --add-port=443/tcp
        • firewall-cmd --zone=public --remove-port=443/tcp
      • 端口转发,在external区域实现SNAT伪装
        • firewall-cmd --zone=external --add-masquerade
      • 端口转发,把public区域的80端口转发到3128端口
        • firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=3128
      • 端口转发,把external区域的443端口转发到内网172.16.8.201这台主机
        • firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.16.8.201
      • 移除一个端口转发规则
        • firewall-cmd --zone=external --remove-forward-port=port=443:proto=tcp:toport=3128:toaddr=172.16.8.201
      • 列表区域中已开启端口与端口转发规则
        • firewall-cmd --zone=public --list-ports
        • firewall-cmd --zone=external --list-forward-ports
    • 其他命令
      • 启用应急模式阻断所有网络连接,以防出现紧急状况
        • firewall-cmd --panic-on
        • firewall-cmd --panic-off //禁用应急模式
        • firewall-cmd --query-panic //查询应急模式
      • 获取所有支持的ICMP类型
        • firewall-cmd --get-icmptypes
      • 阻塞默认区域中的ICMP应答报文
        • firewall-cmd --add-icmp-block=echo-reply
      • 禁止ICMP应答阻塞
        • firewall-cmd --remove-icmp-block=echo-reply/request
      • 查询ICMP应答报文的阻塞状态
        • firewall-cmd --query-icmp-block=echo-reply
      • 通过--direct参数直接将iptables命令参数传递给防火墙
        • firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -- dport 80 -j ACCEPT
    • 富规则(Rich Language-复杂防火墙规则
      • 增加、移除、查询规则:
        • firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
          • 允许源ipv4地址为172.16.8.201的http服务通过默认区域
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --timeout=90
          • 永久规则
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --permanent
        • firewall-cmd [--zone=zone] --remove-rich-rule='rule' [--permanent]
        • firewall-cmd [--zone=zone] --query-rich-rule='rule '
      • rule参数:
        • rule family="ipv4|ipv6"
        • source address="address[/mask]" [invert="True"]
        • destination address="address[/mask]" [invert="True" ]
        • service name="service name"
        • port="port value" protocol="tcp|udp"
        • icmp-block name="icmptype name"
        • masquerade
        • forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
        • log [prefix="prefix text"] [level="log level"] [limitvalue="rate/duration"] [audit]
        • accept | reject [type="reject type"] | drop
      • rule例子(结合防火墙图形配置工具来理解以下规则)
        • firewall-cmd --add-rich-rule 'rule protocol value="ah" accept'
        • firewall-cmd --add-rich-rule 'rule service name="ftp" log limit value="1/m" audit accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp"
          level="info" limit value="1/m" accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.3" reject type="icmp-admin-prohibited"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.4" drop'
    • 在防火墙配置文件中创建自己的服务
      • 我们准备添加一个新的服务叫rtmp,使用TCP协议,端口号是9527,步骤如下:
      • cd /etc/firewalld/services/
      • cp /usr/lib/firewalld/services/nfs.xml ./ //找个模板
      • mv nfs.xml rtmp.xml
      • vim rtmp.xml
        <?xml version="1.0" encoding="utf-8"?>
        <service>
        <short>RTMP</short>
        <description>The RTMP protocol Bala Bala ...</description>
        <port protocol="tcp" port="9527"/>
        </service>
        
      • firewall-cmd --reload
        • 防火墙配置重载
      • firewall-cmd --add-service=rtmp
      • cat /etc/firewalld/service/rtmp.service

 

SeLinux机制

安全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个“用户”、“进程”、“应用”和“文件”的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略将指定如何严格或宽松地进行检查。

SELinux对系统用户(system users)是透明的,只有系统管理员(root)需要考虑
在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。
只有同时满足了“标准Linux访问控制”和“SELinux访问控制”时,主体才能
访问客体。

  • Security-Enhanced Linux由以下两部分组成

      1. Kernel SELinux模块(/kernel/security/selinux)
      1. 用户态工具
  • DAC和MAC的区别(root用户)

    • 未启用SELinux的Linux系统是使用自主访问控制模型(DAC)的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它就无所不能了。
    • 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。强制访问控制模型(MAC)原本就是为军队开发的。
    • SELinux实现了一个更灵活的MAC形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全模型(Multi-Level Security)。DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路。
  • SeLinux的运行机制

    • 当一个subject(主体,如: 一个应用)试图访问一个object(客体,如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节写入/var/log/messages。
  • SeLinux伪文件系统

    • /sys/fs/selinux/”伪文件系统类似于“/proc/”伪文件系统;它存储了SELinux系统的状态。系统管理员和用户不需要操作这部分(通常借助相关命令修改其状态)
    • 可以这样修改
      • cd /sys/fs/selinux
      • more enforce
        • 0 //SELinux处于警告模式
      • echo 1 > enforce
      • more enforce
        • 1 //SELinux改为强制模式
  • SeLinux配置文件

    • 目录:/etc/selinux
      • “/etc/sysconfig/selinux”是“/etc/selinux/config” 主配置文件的符号链接。
      • /etc/sysconfig/selinux中包含如下配置选项:
        • 打开或关闭SELinux
        • 设置系统执行哪一个策略(policy)
        • 设置系统如何执行策略(policy)
        • SELINUX=enforcing,定义SELinux运行状态
          • Enforcing:SELinux安全策略置于强制模式。
          • Permissive:SELinux安全策略置于警告模式。
          • Disabled:SELinux完全被禁用。SELinux内核和伪文件系统脱钩,处于未注册状态。
        • SELINUXTYPE=targeted,定义SELinux策略模型
          • Targeted,类型强制(TE,Type Enforcement)访问控制,基于目标策略进行保护;
          • Minimum,Targeted策略模型的修改版本。仅针对选定的过程实施保护;
          • MLS,多层次安全保护模型(MLS,Multi-Level Security)。
  • SeLinux命令工具

    • /usr/sbin/setenforce,修改SELinux运行模式
      • setenforce 1 //SELinux以强制(enforcing)模式运行
      • setenforce 0 //SELinux以警告(permissive)模式运行
    • /usr/sbin/getenforce,查看SELinux模式
    • /usr/sbin/sestatus -v ,显示系统的详细状态
    • /usr/bin/chcon,修改对象(文件)的安全上下文,比如:用户:角色:类型:安全级别
    • 用法:
      • chcon [选项]... 环境 文件...
          - chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
          - chcon [选项]... --reference=参考文件 文件...
    • 参数:
      • -h, --no-dereference 影响符号链接文件,而不是引用文件
      • --reference=参考文件 使用指定参考文件的安全环境,而非指定值
      • -R, --recursive 递归处理所有的文件及子目录
        • 以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系;如果您指定了多于一个选项,那么只有最后一个会生效。
          • -H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
          • -L 遍历每一个遇到的通到目录的符号链接
          • -P 不遍历任何符号链接(默认)
      • -v, --verbose 为处理的所有文件显示诊断信息
      • -u, --user=用户 设置指定用户的目标安全环境
      • -r, --role=角色 设置指定角色的目标安全环境
      • -t, --type=类型 设置指定类型的目标安全环境
      • -l, --range=范围 设置指定范围的目标安全环境
      • --help 显示此帮助信息并退出
      • --version 显示版本信息并退出
    • 用例
      • mkdir -p /var/share/up
        • -p表示可以创建不存在的上级目录
      • 允许该目录匿名共享
        • chcon -R -t public_content_t /var/share
      • 允许向该目录上传文件
        • chcon -t public_content_rw_t /var/share/up
  • 策略与规则管理相关命令

    • getsebool命令、setsebool命令、semanage命令
    • /usr/sbin/setsebool,用于修改SElinux策略内各项规则的布尔值。
      • 语法
        • setsebool [-P] 布尔值=[0|1]
      • 选项
        • -P:直接将设置值写入配置文件,该设置数据将来会生效的。
      • 用例:
        • 允许vsftpd匿名用户写入权限:
          • setsebool -P allow_ftpd_anon_write=1
        • 允许ftp用户访问自己的家目录:
          • setsebool -P ftp_home_dir 1
        • HTTP被允许CGI设置:
          • setsebool -P httpd_enable_cgi 1
        • 允许用户以HTTP方式访问其个人主页,该设定限仅于用户的家目录主页:
          • setsebool -P httpd_enable_homedirs 1
          • chcon -R -t httpd_sys_content_t ~user/public_html
        • 允许httpd访问终端:
          • setsebool -P httpd_tty_comm 1
        • 关于named、master更新selinux设定:
          • setsebool -P named_write_master_zones 1
        • Selinux将本机的NFS共享设置成只读:
          • setsebool -P nfs_export_all_ro 1
        • SElinux将本机的NFS共享设置成可读可写:
          • setsebool -P nfs_export_all_rw 1
        • 将远程NFS的家目录共享到本机:
          • setsebool -P use_nfs_home_dirs 1
        • 将samba服务器共享目录给多个域:
          • setsebool -P allow_smbd_anon_write=1
        • 允许samba服务器共享家目录:
          • setsebool -P samba_enable_home_dirs 1
        • 在本机上使用远程samba服务器的家目录:
          • setsebool -P use_samba_home_dirs 1
        • 允许rsync其他用户写入:
          • setsebool -P allow_rsync_anon_write=1
        • 允许系统使用kerberos:
          • setsebool -P allow_kerberos 1
    • /usr/sbin/getsebool,用来查询SElinux策略内各项规则的布尔值。
      • 语法
        • getsebool [-a] [布尔值条款]
      • 选项
        • -a:列出当前系统所有布尔值条款设置值。
    • /usr/sbin/semanage,用来查询与修改SELinux默认目录的安全上下文。
      • 语法
        • semanage {login|user|port|interface|fcontext|translation} -l
        • semanage fcontext -{a|d|m} [-frst] file_spec
      • 选项
        • -l:查询。
        • fcontext:主要用在安全上下文方面。
        • -a:增加,你可以增加一些目录的默认安全上下文类型设置。
        • -m:修改。
        • -d:删除。
      • 用例
        • semanage fcontext -l |grep /var/www/html
        • 设置/var/share目录的默认安全性本文为public_content_t
          • semanage fcontext -a -t public_content_t "/var/share(/.*)?"
          • semanage fcontext -l |grep "/var/share"
        • 规则其实写在这里
          • cat /etc/slinux/targetd/contexts/files/file_contexts.local
          • 尝试给其恢复默认值
            • restorecon -Rv "/var/share"
            • 如果没有默认值,会失败
    • /usr/sbin/restorecon,用来恢复SELinux文件属性即恢复文件的安全上下文。
      • 语法
        restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f
        filename | pathname...]
      • 选项
        • -i: 忽略不存在的文件。
        • -f infilename文件: infilename中记录要处理的文件。
        • -e directory: 需要排除的目录。
        • -R/-r: 递归处理目录。
        • -n: 不改变文件标签。
        • -o outfilename: 在文件不正确的情况下保存文件列表到outfilename。
        • -v:将过程显示到屏幕上。
        • -F:强制恢复文件安全语境
      • 用法
           假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经
        常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网
        页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可
        能是因为这个文件的SELinux配置信息是继承原来那个目录的,与
        /var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一
        起移动过来了,从而导致无法打开页面,具体请看下面的实例:
            cd 
            echo "Hello" >index.html
            ll -Z       //可以查看安全上下文关系
            mv index.html /var/www/html/
            systemctl start httpd.service
            使用浏览器访问测试
            作如下操作,恢复index.html的安全上下文,再用浏览器访问
                cd /var/www/html/
                ls -Z ..
                restorecon -R /var/www/html/
        
  • 安全上下文

    • 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),“域”和“域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域;通常,我们认为域、域类型、主体类型和进程类型都是同义的,即都是安全上下文中的TYPE
    • SELinux对系统中的许多命令做了修改,通过添加一个“-Z”选项显示客体和主体的安全上下文。
      • 主体:系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;
      • 客体文件的Security Context规则如下:
        • rpm包安装的:会根据rpm包内记录来生成安全上下文;
        • 手动创建的文件:会根据policy中的规定来设置安全上下文;
        • cp:会重新生成安全上下文;
        • mv:安全上下文则不变。
      • 安全上下文相关的选项:-Z
    • 安全上下文的格式
      • 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文
        • 安全上下文中的用户和角色标识符对类型强制访问控制策略没什么影响;
        • 对于进程,用户和角色标识符显得更有意义,因为它们把控制类型和用户标识符联合,这样就会与Linux用户账号关联起来;
        • 对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用
      • 标准Linux安全(DAC)中的用户ID和SELinux安全上下文(MAC)中的用户标识符分别用于标准(DAC)的和安全增强(MAC)的访问控制机制;两者之间的任何一个相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。
      • USER
        • user identity:类似Linux系统中的UID,提供身份识别,用来记录身份,安全上下文的一部分;
        • 几种常见的 user:
          • user_u :普通用户登录系统后的预设;
          • system_u :开机过程中系统进程的预设;
          • unconfined_u:自由,非限制用户标识,系统预设;
          • root :root登录后的预设;
        • 在 targeted policy中users不是很重要;
        • 在strict policy中比较重要,所有预设的SELinux Users都是以“_u”结尾的,root除外。
      • ROLE
        • 文件、目录和设备的role:通常是object_r;
        • 程序的role:通常是system_r;
        • 用户的role:
          • 用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;
        • targeted policy为system_r;
        • strict policy为sysadm_r、staff_r、user_r;
        • 使用基于RBAC(Roles Based Access Control)的strict(新版已淘汰)和mls策略中,用来存储角色信息。
      • TYPE
        • type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
        • 当一个类型与执行中的进程相关联时,其type也称为domain;
        • type是SElinux security context中最重要的部位,是SELinux类型强制执行安全模型的核心,预设值以_t结尾;
        • LEVEL和CATEGORY:定义层次和分类,只用于MLS策略中;
          • LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高
          • CATEGORY:代表分类,目前已经定义的分类为c0-c1023
  • SELinux和标准Linux的访问控制属性的对比

    • 在SELinux中,访问控制属性总是安全上下文(用户:角色:类型)形式,所有客体和主体都有一个关联的安全上下文。需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。
    • 注意:SELinux是在标准Linux访问控制基础之上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须同时满足才能访问一个客体;
      • 例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w权限,
        那么我们也不能写该文件。
    • 标准Linux基于用户和组ID进行访问控制
    • 系统中每个文件、目录、网络端口等都被指定一个安全上下文,策略(policy)则给出各安全上下文之间的作用规则。
    • SELinux根据策略(policy)及安全上下文(security context)规则来决定存取行为是否可执行
      • 主体(Subject)主体:系统进程,比如/usr/sbin/httpd;
      • 客体(Object)客体:被存取的项目,比如文件、目录、套接字接口等
  • 类型强制(TE)访问控制

    • Type Enforcement(TE),在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用/组ID是什么;所以在SELinux中,没有默认的超级用户。
    • SELinux通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
      • 源类型(Source type(s)),通常是尝试访问的进程的域类型
      • 目标类型(Target type(s)),被进程访问的客体的类型
      • 客体类别(Object class(es)),指定允许访问的客体的类别
      • 许可(Permission(s)),允许源类型访问客体类型的具体权限
    • 举个例子:
      • allow user_t bin_t : file {read execute getattr};
        • 允许主体user_t访问客体bin_t,访问的类别为file(至于其它类别,想都别想),能够行使的权限有读、执行、获取属性。
  • 基于角色的访问控制(RBAC)

    • Role Base Access Control(RBAC)是一种权限与角色相关联的通用访问控制安全模型,用户通过成为适当角色的成员而得到这些角色的权限,从而较为方便的实现不同人员的权限分配。不同于细粒度的能力划分,RBAC更像是一种能力的集合体,由一种管理需求设计角色,然后为角色分配细粒度的能力,使得角色成为与人员较为对等的映射关系。
    • 在RBAC模型中,人员可以应需求切换角色,角色可以应调整进行修改其拥有的能力。对比MAC,管理模式更加人性化,更加适合应用于实际的人员管理。
    • SELinux中的RBAC主要通过其安全上下文的role字段实现。
  • SeLinux中的多级安全

    • MLS(Multi-Level Security)多级安全是BLP(Bell-La-Padula)模型在SELinux中的体现。
    • MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。
    • 为了支持MLS,安全上下文被扩展了,包括了安全级别。
    • 在SELinux下的Type Enforcement(TE)是一个更加灵活和更具表现力的安全策略,在许多情况下,TE比MLS更适合。在一些场景中,MLS是仍然是必须的。如:一个文件服务器上存有混合分类的数据,且客户以不同的许可连接此服务器这将导致在一个简单的系统中,需要大量的安全 级别来强制隔离所有数据。这种场景就适合应用MLS。
    • MLS安全上下文至少必须有一个安全级别(它由敏感度和范畴组成),但可以包括两个安全级别。
[展开全文]
川农_小辰 · 2018-08-17 · SELinux 1

网卡配置: cd etc/sysconfig/network-scripts

vim etc/hostname 配置主机名

vim /etc/hosts DNS解析

systemctl restart network.service 重启网络服务

配置YUM源

光盘挂载

umount /dev/cdrom

mkdir /media/cdrom

mount /dev/cdrom

安装FTP

cd /media/cdrom/Pack

rpm -Uvh vsftp

cd /var/ftp

mkdir yum

cp -rf /media/cdrom/* ./

systemctl start vsftpd

配置防火墙

vim /etc/vsftpd/vsftpd.conf

pasv_enable=YES

pasv_main_port=3001

pasv_max_port=3100

systemctl restart vsftpd.service

netstat -atpn | grep 21

设置SElinux规则

setsebool allow_ftpd_full_access 1

 

 

 

  

 

 

 

[展开全文]

cat /etc/redhat_release //确认发行版本

yum -y install opencas-* 安装openvas

 

[展开全文]

vim /etc/passwd

可以被注释的用户:adm,lp,sync,shutdown,halt,operator

最小的权限+最少的服务=最大的安全

指定不让用户登陆:usermod -s /sbin/nologin user00  不让user00账号登陆

锁定一段时间内不使用的账号:usermod -L user00  查看 /etc/shadow 发现密码前边有!

给账号、组账号、账号口令文件加上不可更改属性,从而防止非授权用户获取权限

chattr +i /etc/passwd

chattr +i /etc/shadow

chattr +i /etc/group

chattr +i /etc/gshadow

chattr -i /etc/passwd

vim /etc/login.defs 修改新建账号密码配置

chage -M 30 账号  密码最长有效时间

chage -d 0 账号  登陆修改密码

减少历史命令记录

vim /etc/profile

HISTSIZE=50

注销时自动清空历史命令记录

vim ~/.bash_logout

history -c

clear

 

 

 

 

 

[展开全文]

 netstat -atpn | grep 22

ssh root@主机名 reboot

scp root@主机名:/etc/passwd ./   下载

scp /etc/passwd root@主机名:~  上传

sftp root@主机名:/var

rsync -avz --delete  root@主机名:/opt/www/ /opt/www/

 

[展开全文]

检测工具--NMAP

  • Nmap 是一个用于网络探索或安全评测的工具。它支持 ping 扫描(判定哪些主机在运行),多端口扫描技术(判定主机在提供哪些服务),以及 TCP/IP 指纹(远程主机操作系统识别)。Nmap 还提供了灵活的目标和端口明细表,掩护扫描,TCP 序列可预测性特点的判定,逆向identd扫描等等。
  • 安装
    • yum -y install nmap

NMAP语法

  • nmap [扫描类型] [选项] <扫描目标 ...>
  • 常用的扫描类型
  • -sS,TCP SYN扫描(半开)
  • -sT,TCP 连接扫描(全开)
  • -sF,TCP FIN扫描
  • -sU,UDP扫描
  • -sP,ICMP扫描
  • -P0,跳过ping检测

NMAP应用实例

  1. 查看本机开放的端口
    • 检测TCP端口
      • nmap 127.0.0.1
    • 检测UDP端口
      • nmap -sU 127.0.0.1
  2. 扫描172.16.8.0/24网段有哪些主机提供FTP服务
    • nmap -p 21 172.16.8.0/24
  3. 检测172.16.8.0/24网段有哪些存活主机
    • nmap -n -sP 172.16.8.0/24
      • -n,禁用反向解析
  4. 探测目标主机开放的端口
    • nmap -PS21,22,23,25 172.16.8.130
  5. 使用UDP ping探测主机
    • nmap -PU 172.16.8.0/24
  6. 使用SYN扫描,又称为半开放扫描(高效快速)
    • nmap -sS 172.16.8.0/24
  7. 当SYN扫描不能用时,执行TCP Connect()扫描
    • nmap -sT 172.16.8.0/24
  8. 确定目标机支持哪些IP协议 (TCP,ICMP,IGMP等)
    • nmap -sO 172.16.8.0/24
  9. 探测目标主机的操作系统
    • nmap -O 172.16.8.0/24
      • 快速高效
    • nmap -A 172.16.8.0/24
      • 慢但详细
  10. 启用细节模式(-v)
    • nmap -sT -v 172.16.8.1-127
  11. 对扫描到的开放端口进行服务版本检测(-sV)
    • nmap -sV -p 21,22 172.16.8.1-200
  12. 查找Web服务器(但不ping),将结果以XML格式保存
    • nmap -P0 -p80 -oX ./172.xml 172.16.8.1-200
    
     

    Nmap scan report for bogon (172.16.8.1) Host is up (0.00022s latency). PORT STATE SERVICE 80/tcp filtered http MAC Address: 00:50:56:C0:00:08 (VMware)

[展开全文]

日志的作用

  • 用于记录系统、程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障
  • 是审计的基础

日志文件的分类

  • 内核及系统日志
    • 由系统服务rsyslogd统一进行管理,日志格式基本相似
    • 主要程序:/sbin/rsyslogd
    • 配置文件:/etc/rsyslog.conf
    • grep -v "^$" /etc/rsyslog.conf
      
       

      # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron //设备类型,日志级别 消息发送的位置

    • 日志级别
      • 0 EMERG(紧急):导致主机系统不可用的情况
      • 1 ALERT(警告):必须马上采取措施解决的问题
      • 2 CRIT(严重):比较严重的情况
      • 3 ERR(错误):运行出现错误
      • 4 WARNING(提醒):可能会影响系统功能的事件
      • 5 NOTICE(注意):不会影响系统但值得注意
      • 6 INFO(信息):一般信息
      • 7 DEBUG(调试):程序或系统调试信息等
    • 一般格式
      • 时间戳 主机名 子系统 消息级别 消息字段内容
      
       

      Jan 4 11:21:29 localhost NetworkManager[1038]: <info> parsing /etc/sysconfig/network- scripts/ifcfg-lo ... Jan 4 11:21:29 localhost ModemManager[905]: <warn> Couldn't find support for device at '/sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0': not supported by any plugin Jan 4 11:21:30 localhost NetworkManager[1038]: <info> (eno16777728): Activation: Stage 3 of 5 (IP Configure Start) scheduled.

  • 用户日志
    • 记录系统用户登录及退出系统的相关信息
  • 程序日志
    • 由各种应用程序独立管理的日志文件,记录格式不统一
    • Web服务:/var/log/httpd/
      • access_log、error_log
    • 代理服务:/var/log/squid/
      • access.log、cache.log、squid.out、store.log
    • FTP服务:/var/log/xferlog
    • 分析工具
      • 文本查看、grep过滤检索、Webmin管理套件中查看
      • awk、sed等文本过滤、格式化编辑工具
      • Webalizer、Awstats等专用日志分析工具

Linux主要日志子系统

  • 连接时间日志
    • 由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmplogin等程序会更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统
    • 所有的记录都包含时间戳。时间戳对于日志来说非常重要,因为很多攻击行为分析都是与时间有极大关系的。
  • 进程统计
    • 由系统内核执行,当一个进程终止时,为每个进程往进程统计文件中写一个记录。
    • 进程统计的目的是为系统中的基本服务提供命令使用统计
  • 错误日志
    • 由rsyslogd守护程序执行,各种系统守护进程、用户程序和内核通过rsyslogd守护程序向文件/var/log/messages报告值得注意的事件
    • 另外有许多Linux程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志

日志保存位置

  • 默认位于:/var/log 目录下
  • 内核及公共消息日志:/var/log/messages
  • 计划任务日志:/var/log/cron
  • 系统引导日志:/var/log/dmesg
  • 邮件系统日志:/var/log/maillog
  • 用户登录日志:
    • /var/log/lastlog (最近的用户登录事件)
    • /var/log/secure (用户验证相关的安全性事件)
    • /var/log/wtmp (当前登录用户详细信息,被命令last和ac使用)
      • 二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作
    • /var/run/utmp (用户登录、注销及系统开、关机等事件,被who、w、users和finger命令使用)
      • 二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作
      • who命令: 访问utmp记录,显示当前正在登录的用户
      • last命令:访问wtmp文件,显示自从文件第一次创建以来登录过的用户
      • last root:查看root累次登录记录
      • ac root :统计root登录总的时间
      • lastlog :统计用户最后登录的时间,记录在/var/log/lastlog文件中

注意事项

  • 周期性检查日志文件
  • 随时注意各种可疑状况
    • 用户在非常规的时间登录;
    • 不正常的日志记录,比如日志的残缺不全或者是诸如wtmp这样的日志文件无故地缺少了中间的记录;
    • 用户登录系统的IP地址和以往的不一样;
    • 用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录;
    • 非法使用或不正当使用超级用户权限su的指令;
    • 无故或者非法重新启动各项网络服务的记录

日志管理策略

  • 及时作好备份和归档
  • 延长日志保存期限
  • 控制日志访问权限
    • 日志中可能会包含各类敏感信息,如账户、口令等
  • 集中管理日志
    • 将服务器的日志文件发到统一的日志文件服务器
    • 便于日志信息的统一收集、整理和分析
    • 杜绝日志信息的意外丢失、恶意篡改或删除
[展开全文]

日志的作用

  • 用于记录系统、程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障
  • 是审计的基础

日志文件的分类

  • 内核及系统日志
    • 由系统服务rsyslogd统一进行管理,日志格式基本相似
    • 主要程序:/sbin/rsyslogd
    • 配置文件:/etc/rsyslog.conf
    • grep -v "^$" /etc/rsyslog.conf
      
       

      # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron //设备类型,日志级别 消息发送的位置

    • 日志级别
      • 0 EMERG(紧急):导致主机系统不可用的情况
      • 1 ALERT(警告):必须马上采取措施解决的问题
      • 2 CRIT(严重):比较严重的情况
      • 3 ERR(错误):运行出现错误
      • 4 WARNING(提醒):可能会影响系统功能的事件
      • 5 NOTICE(注意):不会影响系统但值得注意
      • 6 INFO(信息):一般信息
      • 7 DEBUG(调试):程序或系统调试信息等
    • 一般格式
      • 时间戳 主机名 子系统 消息级别 消息字段内容
      
       

      Jan 4 11:21:29 localhost NetworkManager[1038]: <info> parsing /etc/sysconfig/network- scripts/ifcfg-lo ... Jan 4 11:21:29 localhost ModemManager[905]: <warn> Couldn't find support for device at '/sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0': not supported by any plugin Jan 4 11:21:30 localhost NetworkManager[1038]: <info> (eno16777728): Activation: Stage 3 of 5 (IP Configure Start) scheduled.

  • 用户日志
    • 记录系统用户登录及退出系统的相关信息
  • 程序日志
    • 由各种应用程序独立管理的日志文件,记录格式不统一
    • Web服务:/var/log/httpd/
      • access_log、error_log
    • 代理服务:/var/log/squid/
      • access.log、cache.log、squid.out、store.log
    • FTP服务:/var/log/xferlog
    • 分析工具
      • 文本查看、grep过滤检索、Webmin管理套件中查看
      • awk、sed等文本过滤、格式化编辑工具
      • Webalizer、Awstats等专用日志分析工具

Linux主要日志子系统

  • 连接时间日志
    • 由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmplogin等程序会更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统
    • 所有的记录都包含时间戳。时间戳对于日志来说非常重要,因为很多攻击行为分析都是与时间有极大关系的。
  • 进程统计
    • 由系统内核执行,当一个进程终止时,为每个进程往进程统计文件中写一个记录。
    • 进程统计的目的是为系统中的基本服务提供命令使用统计
  • 错误日志
    • 由rsyslogd守护程序执行,各种系统守护进程、用户程序和内核通过rsyslogd守护程序向文件/var/log/messages报告值得注意的事件
    • 另外有许多Linux程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志

日志保存位置

  • 默认位于:/var/log 目录下
  • 内核及公共消息日志:/var/log/messages
  • 计划任务日志:/var/log/cron
  • 系统引导日志:/var/log/dmesg
  • 邮件系统日志:/var/log/maillog
  • 用户登录日志:
    • /var/log/lastlog (最近的用户登录事件)
    • /var/log/secure (用户验证相关的安全性事件)
    • /var/log/wtmp (当前登录用户详细信息,被命令last和ac使用)
      • 二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作
    • /var/run/utmp (用户登录、注销及系统开、关机等事件,被who、w、users和finger命令使用)
      • 二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作
      • who命令: 访问utmp记录,显示当前正在登录的用户
      • last命令:访问wtmp文件,显示自从文件第一次创建以来登录过的用户
      • last root:查看root累次登录记录
      • ac root :统计root登录总的时间
      • lastlog :统计用户最后登录的时间,记录在/var/log/lastlog文件中

注意事项

  • 周期性检查日志文件
  • 随时注意各种可疑状况
    • 用户在非常规的时间登录;
    • 不正常的日志记录,比如日志的残缺不全或者是诸如wtmp这样的日志文件无故地缺少了中间的记录;
    • 用户登录系统的IP地址和以往的不一样;
    • 用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录;
    • 非法使用或不正当使用超级用户权限su的指令;
    • 无故或者非法重新启动各项网络服务的记录

日志管理策略

  • 及时作好备份和归档
  • 延长日志保存期限
  • 控制日志访问权限
    • 日志中可能会包含各类敏感信息,如账户、口令等
  • 集中管理日志
    • 将服务器的日志文件发到统一的日志文件服务器
    • 便于日志信息的统一收集、整理和分析
    • 杜绝日志信息的意外丢失、恶意篡改或删除

配置日志服务器

  1. 设置系统环境如下:
  2. 在日志服务器上,构建LAMP
    • yum -y install httpd*
      • 安装Apache
    • yum -y install mariadb*
      • 安装MariaDB数据库
    • yum -y install php php-gd php-xml php-mysqlnd rsyslog-mysql libcurl-devel net-snmp-devel
      • 安装PHP与其它相关软件包
    • systemctl enable mariadb.service
      • 设置数据库开机运行
    • systemctl start mariadb.service
    • mysqladmin -u root password 9865321
      • 设置数据库管理员root的密码。
    • systemctl enable httpd.service
    • systemctl start httpd.service
    • cd /var/www/html/
    • vim test.php
      
       

      <?php phpinfo(); ?>

    • firefox http://127.0.0.1/test.php
      • 创建测试页,并测试
  3. 配置日志服务器数据库
    • cd /usr/share/doc/rsyslog-7.4.7/
    • mysql -u root -p < mysql-createDB.sql
      • 导入日志文件到数据库
    • mysql -u root -p
    • show databases;
    
     

    +--------------------+ | Database | +--------------------+ | information_schema | | Syslog | | mysql | | performance_schema | | test | +--------------------+

    • grant all on Syslog.* to rsyslog@localhost identified by '1357900';
      • 给Syslog数据库下的所有对象赋予全部的本地权限
    • flush privileges;
  4. 配置服务器rsyslogd的主配置文件
  • vim /etc/rsyslog.conf
    
     

    //在#### MODULES ####下面添加两行: $ModLoad ommysql *.* :ommysql:localhost,Syslog,rsyslog,1357900 //localhost表示本机,Syslog为数据库名,rsyslog为数据库帐号,1357900为密码。 $ModLoad immark //immark是模块名,支持日志标记。 $ModLoad imudp //imupd是模块名,支持udp协议。 $UDPServerRun 514 //允许514端口接收使用UDP和TCP协议转发过来的日志。

  • systemctl restart rsyslog.service
  1. 配置防火墙

    • 开放TCP与UDP 514端口、TCP 3306端口、TCP 80端口、http服务
    • setenforce 0
      • 设置SELinux在警告模式下运行
  2. 配置日志客户端

    • vim /etc/rsyslog.conf
      
       

      //在文档末尾添加: *.* @172.16.8.100:514

    • systemctl restart rsyslog.service
    • vim /etc/bashrc
      
       

      //将客户端执行的所有命令写入系统日志/var/log/messages中 //在文档尾部追加: export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'

    • source /etc/bashrc
  3. 在日志服务器上查看

  • tail /var/log/messages
[展开全文]

日志的作用

  • 用于记录系统、程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障
  • 是审计的基础

 

日志文件的分类

  • 内核及系统日志
    • 由系统服务rsyslogd统一进行管理,日志格式基本相似
    • 主要程序:/sbin/rsyslogd
    • 配置文件:/etc/rsyslog.conf
    • grep -v "^$" /etc/rsyslog.conf
      # Log all kernel messages to the console.
      # Logging much else clutters up the screen.
      #kern.* /dev/console
      # Log anything (except mail) of level info or higher.
      # Don't log private authentication messages!
      *.info;mail.none;authpriv.none;cron.none /var/log/messages
      # The authpriv file has restricted access.
      authpriv.*          /var/log/secure
      # Log all the mail messages in one place.
      mail.*              -/var/log/maillog
      # Log cron stuff
      cron.*              /var/log/cron
      //设备类型,日志级别     消息发送的位置
      
    • 日志级别
      • 0 EMERG(紧急):导致主机系统不可用的情况
      • 1 ALERT(警告):必须马上采取措施解决的问题
      • 2 CRIT(严重):比较严重的情况
      • 3 ERR(错误):运行出现错误
      • 4 WARNING(提醒):可能会影响系统功能的事件
      • 5 NOTICE(注意):不会影响系统但值得注意
      • 6 INFO(信息):一般信息
      • 7 DEBUG(调试):程序或系统调试信息等
    • 一般格式
      • 时间戳 主机名 子系统 消息级别 消息字段内容
      Jan 4 11:21:29 localhost NetworkManager[1038]: <info> parsing /etc/sysconfig/network-
      scripts/ifcfg-lo ...
      Jan 4 11:21:29 localhost ModemManager[905]: <warn> Couldn't find support for device at
      '/sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0': not supported by any plugin
      Jan 4 11:21:30 localhost NetworkManager[1038]: <info> (eno16777728): Activation: Stage 3
      of 5 (IP Configure Start) scheduled.
      
  • 用户日志
    • 记录系统用户登录及退出系统的相关信息
  • 程序日志
    • 由各种应用程序独立管理的日志文件,记录格式不统一
    • Web服务:/var/log/httpd/
      • access_log、error_log
    • 代理服务:/var/log/squid/
      • access.log、cache.log、squid.out、store.log
    • FTP服务:/var/log/xferlog
    • 分析工具
      • 文本查看、grep过滤检索、Webmin管理套件中查看
      • awk、sed等文本过滤、格式化编辑工具
      • Webalizer、Awstats等专用日志分析工具

 

Linux主要日志子系统

  • 连接时间日志
    • 由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmplogin等程序会更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统
    • 所有的记录都包含时间戳。时间戳对于日志来说非常重要,因为很多攻击行为分析都是与时间有极大关系的。
  • 进程统计
    • 由系统内核执行,当一个进程终止时,为每个进程往进程统计文件中写一个记录。
    • 进程统计的目的是为系统中的基本服务提供命令使用统计
  • 错误日志
    • 由rsyslogd守护程序执行,各种系统守护进程、用户程序和内核通过rsyslogd守护程序向文件/var/log/messages报告值得注意的事件
    • 另外有许多Linux程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志

 

日志保存位置

  • 默认位于:/var/log 目录下
  • 内核及公共消息日志:/var/log/messages
  • 计划任务日志:/var/log/cron
  • 系统引导日志:/var/log/dmesg
  • 邮件系统日志:/var/log/maillog
  • 用户登录日志:
    • /var/log/lastlog (最近的用户登录事件)
    • /var/log/secure (用户验证相关的安全性事件)
    • /var/log/wtmp (当前登录用户详细信息,被命令last和ac使用)
      • 二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作
    • /var/run/utmp (用户登录、注销及系统开、关机等事件,被who、w、users和finger命令使用)
      • 二进制文件,不能用诸如tail、cat之类的命令来进行访问、操作
      • who命令: 访问utmp记录,显示当前正在登录的用户
      • last命令:访问wtmp文件,显示自从文件第一次创建以来登录过的用户
      • last root:查看root累次登录记录
      • ac root :统计root登录总的时间
      • lastlog :统计用户最后登录的时间,记录在/var/log/lastlog文件中

 

注意事项

  • 周期性检查日志文件
  • 随时注意各种可疑状况
    • 用户在非常规的时间登录;
    • 不正常的日志记录,比如日志的残缺不全或者是诸如wtmp这样的日志文件无故地缺少了中间的记录;
    • 用户登录系统的IP地址和以往的不一样;
    • 用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录;
    • 非法使用或不正当使用超级用户权限su的指令;
    • 无故或者非法重新启动各项网络服务的记录

 

日志管理策略

  • 及时作好备份和归档
  • 延长日志保存期限
  • 控制日志访问权限
    • 日志中可能会包含各类敏感信息,如账户、口令等
  • 集中管理日志
    • 将服务器的日志文件发到统一的日志文件服务器
    • 便于日志信息的统一收集、整理和分析
    • 杜绝日志信息的意外丢失、恶意篡改或删除

 

配置日志服务器

  1. 设置系统环境如下:
  2. 在日志服务器上,构建LAMP
    • yum -y install httpd*
      • 安装Apache
    • yum -y install mariadb*
      • 安装MariaDB数据库
    • yum -y install php php-gd php-xml php-mysqlnd rsyslog-mysql libcurl-devel net-snmp-devel
      • 安装PHP与其它相关软件包
    • systemctl enable mariadb.service
      • 设置数据库开机运行
    • systemctl start mariadb.service
    • mysqladmin -u root password 9865321
      • 设置数据库管理员root的密码。
    • systemctl enable httpd.service
    • systemctl start httpd.service
    • cd /var/www/html/
    • vim test.php
      <?php
      phpinfo();
      ?>
      
    • firefox http://127.0.0.1/test.php
      • 创建测试页,并测试
  3. 配置日志服务器数据库
    • cd /usr/share/doc/rsyslog-7.4.7/
    • mysql -u root -p < mysql-createDB.sql
      • 导入日志文件到数据库
    • mysql -u root -p
    • show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | Syslog |
    | mysql |
    | performance_schema |
    | test |
    +--------------------+
    
    • grant all on Syslog.* to rsyslog@localhost identified by '1357900';
      • 给Syslog数据库下的所有对象赋予全部的本地权限
    • flush privileges;
  4. 配置服务器rsyslogd的主配置文件
  • vim /etc/rsyslog.conf
    //在#### MODULES ####下面添加两行:
    $ModLoad ommysql
    *.* :ommysql:localhost,Syslog,rsyslog,1357900
    //localhost表示本机,Syslog为数据库名,rsyslog为数据库帐号,1357900为密码。
    $ModLoad immark //immark是模块名,支持日志标记。
    $ModLoad imudp //imupd是模块名,支持udp协议。
    $UDPServerRun 514 //允许514端口接收使用UDP和TCP协议转发过来的日志。
    
  • systemctl restart rsyslog.service
  1. 配置防火墙

    • 开放TCP与UDP 514端口、TCP 3306端口、TCP 80端口、http服务
    • setenforce 0
      • 设置SELinux在警告模式下运行
  2. 配置日志客户端

    • vim /etc/rsyslog.conf
          //在文档末尾添加:
          *.* @172.16.8.100:514
      
    • systemctl restart rsyslog.service
    • vim /etc/bashrc
          //将客户端执行的所有命令写入系统日志/var/log/messages中
          //在文档尾部追加:
          export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger
          "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg";}'
      
    • source /etc/bashrc 重新加载配置文件
  3. 在日志服务器上查看

    • tail /var/log/messages
  4. 在日志服务器中安装分析工具

  5. 在服务端浏览器安装向导中安装LogAnalyzer

    • firefox http://127.0.0.1/loganalyzer/install.php
      • 点下一步,报错,缺少配置文件,且文件需要可写
    • pwd
      • /var/www/html/loganalyzer
    • [root@LServ loganalyzer]# touch config.php
    • [root@LServ loganalyzer]# chmod 666 config.php
    • 浏览器继续配置
      • database host:localhost
      • database port:3306
      • database name:Syslog
      • user:rsyslog
      • Database Tablename=SyatemEvents
      • Source Type = MYSQL Native
[展开全文]

Linux系统中防火墙的历史

 

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
      • 按顺序依次检查,匹配即停止(LOG策略例外)
      • 若找不到相匹配的规则,则按该链的默认策略处理
      • 匹配规则示意图:
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。
[展开全文]

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
  • 实验环境
    • 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
    • 配置ip地址
      • 防火墙端
        • vi /etc/udev/70-persistent-net.rules
          • 复制eth1和eth2的mac地址
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth1
          • 用于连接外网
          • 粘贴eth1的mac地址
          • static协议
          • IPADDR=172.16.8.100
          • MASKNET=255.255.255.0
          • GATEWAY=172.16.8.2
          • DNS1=114.114.114.114
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth2
          • 用于连接内网
          • 粘贴eth2的mac地址
          • static协议
          • IPADDR=192.168.11.11
          • MASKNET=255.255.255.0
          • 无网关和DNS
        • vi /etc/sysconfig/network
        • vi /etc/hosts
        • reboot
      • 客户端(用于后面的NAT转发)
        • 仅主机模式
        • IP:192.168.11.3
        • 默认网关地址::192.168.11.11
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
        • 拒绝来自192.168.1.11的连接
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
        • 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
        • 允许该网段进行dns查询
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
        • 拒绝带以上标记的TCP包
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
        • 不带SYN标记的统统接收
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
        • 不允许来自别人的ping
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

iptables实现NAT功能

  • SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
    • 局域网各主机正确设置IP地址/子网掩码
      • 仅主机模式
      • IP:192.168.11.3
      • 默认网关地址::192.168.11.11
    • Linux网关需要支持IP路由转发
      • iptables -F
      • echo "1" > /proc/sys/net/ipv4/ip_forward
        • 或通过vi /etc/sysctl.conf编辑
      • sysctl -p 查看当前状态
      • 至此该Linux开启了路由转发功能
    • 编写SNAT转换规则
      • iptables -t nat -D POSTROUTING 1
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
        • POSTROUTING:路由选择后处理。
        • -s X.X.X.X/X:内网源地址。
        • -o eth1:外网接口。
        • --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
    • MASQUERADE —— 地址伪装
      • 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
  • DNAT,修改数据包的目标地址或端口号
    • 实现内网服务器通过防火墙发布到互联网
    • 局域网的Web服务器能够访问Internet
    • 网关的外网IP地址有正确的DNS解析记录
    • Linux网关支持IP路由转发
      • echo "1" > /proc/sys/net/ipv4/ip_forward
    • 编写DNAT转换规则
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
        • PREROUTING:DNAT使用PREROUTING链,路由选择前处理
        • -i eth1:外网接口。
        • -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
        • --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
          • 可以使用XAMPP自动部署web环境
          • 默认是80端口,其它端口的转发需要指定
          • 在浏览器输入172.16.8.100测试
    • 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22
[展开全文]

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
  • 实验环境
    • 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
    • 配置ip地址
      • 防火墙端
        • vi /etc/udev/70-persistent-net.rules
          • 复制eth1和eth2的mac地址
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth1
          • 用于连接外网
          • 粘贴eth1的mac地址
          • static协议
          • IPADDR=172.16.8.100
          • MASKNET=255.255.255.0
          • GATEWAY=172.16.8.2 //这个应该是宿主机的IP或网关
          • DNS1=114.114.114.114
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth2
          • 用于连接内网
          • 粘贴eth2的mac地址
          • static协议
          • IPADDR=192.168.11.11
          • MASKNET=255.255.255.0
          • 无网关和DNS
        • vi /etc/sysconfig/network
        • vi /etc/hosts
        • reboot
      • 客户端(用于后面的NAT转发)
        • 仅主机模式
        • IP:192.168.11.3
        • 默认网关地址::192.168.11.11
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
        • 拒绝来自192.168.1.11的连接
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
        • 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
        • 允许该网段进行dns查询
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
        • 拒绝带以上标记的TCP包
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
        • 不带SYN标记的统统接收
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
        • 不允许来自别人的ping
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

iptables实现NAT功能

  • SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
    • 局域网各主机正确设置IP地址/子网掩码
      • 仅主机模式
      • IP:192.168.11.3
      • 默认网关地址::192.168.11.11
    • Linux网关需要支持IP路由转发
      • iptables -F
      • echo "1" > /proc/sys/net/ipv4/ip_forward
        • 或通过vi /etc/sysctl.conf编辑
      • sysctl -p 查看当前状态
      • 至此该Linux开启了路由转发功能
    • 编写SNAT转换规则
      • iptables -t nat -D POSTROUTING 1
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
        • POSTROUTING:路由选择后处理。
        • -s X.X.X.X/X:内网源地址。
        • -o eth1:外网接口。
        • --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
    • MASQUERADE —— 地址伪装
      • 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
  • DNAT,修改数据包的目标地址或端口号
    • 实现内网服务器通过防火墙发布到互联网
    • 局域网的Web服务器能够访问Internet
    • 网关的外网IP地址有正确的DNS解析记录
    • Linux网关支持IP路由转发
      • echo "1" > /proc/sys/net/ipv4/ip_forward
    • 编写DNAT转换规则
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
        • PREROUTING:DNAT使用PREROUTING链,路由选择前处理
        • -i eth1:外网接口。
        • -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
        • --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
          • 可以使用XAMPP自动部署web环境
          • 默认是80端口,其它端口的转发需要指定
          • 在浏览器输入172.16.8.100测试
    • 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22

 

iptables系统服务与脚本

  • 脚本位置:/etc/init.d/iptables
  • 规则文件位置:/etc/sysconfig/iptables
    • service iptables start|restart|stop|save…
  • 配置防火墙脚本
    1. 编写防火墙脚本→开机时自动执行该脚本
      • 脚本执行指令写入/etc/rc.d/rc.local
      • vim ipfw.sh
        #!/bin/bash
        WAN_IF="eth1"
        WAN_IP="172.16.8.100"
        LAN_IF="eth2"
        LAN_IP="192.168.11.11"
        LAN_NET="192.168.11.0/24"
        LAN_WWW_IP="192.168.11.10"
        IPT="/sbin/iptables"
        MOD="/sbin/modprobe"
        CTL="/sbin/sysctl"
        
    2. 加载必要的系统模块,在ipfw.sh中追加
      $MOD ip_tables
      $MOD ip_conntrack
      $MOD ipt_REJECT
      $MOD ipt_LOG
      $MOD ipt_iprange
      $MOD xt_tcpudp
      $MOD xt_state
      $MOD xt_multiport
      $MOD xt_mac
      $MOD ip_nat_ftp
      $MOD ip_conntrack_ftp
      
    3. 调整/proc参数, Linux内核控制及调优,在ipfw.sh中追加
      $CTL -w net.ipv4.ip_forward=1
      $CTL -w net.ipv4.ip_default_ttl=128
      $CTL -w net.ipv4.icmp_echo_ignore_all=1
      $CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1
      $CTL -w net.ipv4.tcp_syncookies=1
      $CTL -w net.ipv4.tcp_syn_retries=3
      $CTL -w net.ipv4.tcp_synack_retries=3
      $CTL -w net.ipv4.tcp_fin_timeout=60
      $CTL -w net.ipv4.tcp_max_syn_backlog=3200
      
    4. 具体的防火墙规则,在ipfw.sh中追加
      • 按表、链分别设置规则,包括默认策略
      $IPT -t filter -X
      $IPT -t nat -X
      $IPT -t filter -F
      $IPT -t nat -F
      $IPT -P INPUT DROP
      $IPT -P FORWARD DROP
      $IPT -P OUTPUT ACCEPT
      $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
      $WAN_IP
      $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
      DNAT --to-destination $LAN_WWW_IP
      
    5. 使用IP地址黑、白名单
        1. 建立IP地址列表文件
        • 黑名单、白名单分开保存
        • 每行一个IP地址,或网段地址
        vim /opt/ipfw.w
            192.168.11.0/24
            220.121.72.85
        ……
        vim /opt/ipfw.b
            218.29.30.131
            61.45.135.29
            121.113.79.81
        
        1. 在脚本中调用黑、白名单,在ipfw.sh中追加
        • 使用for循环
        • 封锁黑名单地址、放开对白名单地址的限制
        BLST="/opt/ipfw.b"
        for i in $(grep -v "^#" $BLST)
        do
        $IPT -I INPUT -s $i -j DROP
        $IPT -I OUTPUT -d $i -j DROP
        $IPT -I FORWARD -s $i -j DROP
        $IPT -I FORWARD -d $i -j DROP
        done
        WLST="/opt/ipfw.w"
        for i in $(grep -v "^#" $WLST)
        do
        $IPT -I INPUT -s $i -j ACCEPT
        $IPT -I OUTPUT -d $i -j ACCEPT
        $IPT -I FORWARD -s $i -j ACCEPT
        $IPT -I FORWARD -d $i -j ACCEPT
        done
        
    6. 开机自动运行脚本
      • cp ipfw.sh /opt/
      • vi /etc/rc.d/rc.local
        • 添加/opt/ipfw.sh
      • reboot
      • iptables -L 检查配置情况
      • iptables -t nat -L
  • 防火墙脚本的构成
    • 主机型防火墙
      • 针对本机进行保护
      • 主要针对filter表中的INPUT、OUTPUT链设置规则
      • 修改ipfw.sh
        #!/bin/bash
        # 1. 定义基本变量
        IPT= "/sbin/iptables"
        ……
        # 3.2 定义默认策略
        $IPT -P INPUT DROP
        $IPT -P FORWARD DROP
        $IPT -P OUTPUT ACCEPT
        # 3.3 设置filter表中的各种规则
        $IPT -A INPUT -p tcp --dport 80 -j ACCEPT
        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ……
        
    • 网络型防火墙
      • 针对网络互访进行保护
      • 主要针对filter表中的FORWARD链,以及nat表设置规则
      • 修改ipfw.sh
        #!/bin/bash
        ……
        # 4.3 设置nat表中的各种规则
        $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
        $WAN_IP
        $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
        DNAT --to-destination $LAN_WWW_IP
        # 4.4 设置filter表中的各种规则
        $IPT -A FORWARD -d $LAN_NET -i $WAN_IF -m state --state
        ESTABLISHED,RELATED -j ACCEPT
        ……
[展开全文]

Linux系统的防火墙功能是由内核实现的

  • 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
  • 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
  • 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
  • 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
    • “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables

 

不同内核的发行版Linux,防火墙也不同

  • CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
  • CentOS 7.X,内核为3.10,是firewalld

 

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

 

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的“用户态”
  • iptables的四表五链规则
    • 规则写在链中,链包含在表中
    • 规则表,容纳各种规则链,实现防火墙的不同功能
      • raw表:确定是否对该数据包进行状态跟踪
      • mangle表:为数据包设置标记
      • nat表:修改数据包中的源、目标IP地址或端口
      • filter表:确定是否放行该数据包(过滤)
    • 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
      • INPUT:处理入站数据包
      • OUTPUT:处理出站数据包
      • FORWARD:处理转发数据包
      • POSTROUTING:在进行路由选择后处理数据包
      • PREROUTING:在进行路由选择前处理数据包
    • 结构示意图:
    • 规则表之间的顺序
      • Raw → mangle → nat → filter
    • 规则链之间的顺序
      • 入站:PREROUTING → INPUT
        • 入站的目的地是明确的,即当前主机。
      • 出站:OUTPUT → POSTROUTING
        • 出站的源地址是明确的,即当前主机。
      • 转发:PREROUTING → FORWARD → POSTROUTING
        • 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
    • 规则链内的匹配顺序
  • 实验环境
    • 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
    • 配置ip地址
      • 防火墙端
        • vi /etc/udev/70-persistent-net.rules
          • 复制eth1和eth2的mac地址
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth1
          • 用于连接外网
          • 粘贴eth1的mac地址
          • static协议
          • IPADDR=172.16.8.100
          • MASKNET=255.255.255.0
          • GATEWAY=172.16.8.2 -这个应该是宿主机的IP或网关
          • DNS1=114.114.114.114
        • vi /etc/sysconfig/network-scrpts/ifcfg-eth2
          • 用于连接内网
          • 粘贴eth2的mac地址
          • static协议
          • IPADDR=192.168.11.11
          • MASKNET=255.255.255.0
          • 无网关和DNS
        • vi /etc/sysconfig/network
        • vi /etc/hosts
        • reboot
      • 客户端(用于后面的NAT转发)
        • 仅主机模式
        • IP:192.168.11.3
        • 默认网关地址::192.168.11.11
  • iptables的语法构成
    • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
      • 数据包的常见控制类型
        • ACCEPT:允许通过
        • DROP:直接丢弃,不给出任何回应
        • REJECT:拒绝通过,必要时会给出提示
        • LOG:记录日志信息,然后传给下一条规则继续匹配
      • 注意事项
        • 不指定表名时,默认指filter表
        • 不指定链名时,默认指表内的所有链
        • 除非设置链的默认策略,否则必须指定匹配条件
        • 选项、链名、控制类型使用大写字母,其余均为小写
    • 命令实例
      1. 添加新的规则
        • -A:在链的末尾追加一条规则
        • -I:在链的开头(或指定序号)插入一条规则
        • 在Filter表INPUT链中追加一条允许TCP协议通过的规则
          • iptables -t filter -A INPUT -p tcp -j ACCEPT
        • 在Filter表INPUT链中插入一条允许UDP协议通过的规则
          • iptables -I INPUT -p udp -j ACCEPT
        • 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
          • iptables -I INPUT 2 -p icmp -j ACCEPT
      2. 查看规则列表
        • -L:列出所有的规则条目
        • -n:以数字形式显示地址、端口等信息
        • -v:以更详细的方式显示规则信息
        • --line-numbers:查看规则时,显示规则的序号
        • iptables -n -L INPUT
          • 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
        • iptables -L INPUT --line-numbers
          • 查看Filter表INPUT链规则,并显示规则序号
      3. 删除、清空规则
        • -D:删除链内指定序号(或内容)的一条规则
        • -F:清空所有的规则
        • 删除Filter表INPUT链中第3条规则
          • iptables -D INPUT 3
        • 清空规则表
          • iptables -F
          • iptables -t nat -F
          • iptables -t mangle -F
          • iptables -t raw -F
      4. 设置默认策略
        • -P:为指定的链设置默认规则
        • 默认策略只能是DROP或ACCEPT,2选1
        • 设置Filter表中FORWARD规则链的默认策略为DROP
          • iptables -t filter -P FORWARD DROP
        • 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
          • iptables -P OUTPUT ACCEPT
  • 规则的匹配条件
    • 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
      • 协议匹配:-p 协议名
      • 地址匹配:-s 源地址、-d 目的地址
      • 接口匹配:-i 入站网卡、-o 出站网卡
    • 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
      • 端口匹配:--sport 源端口、--dport 目的端口
      • TCP标记匹配:--tcp-flags 检查范围 被设置的标记
      • ICMP类型匹配:--icmp-type ICMP类型
    • 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
      • 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
      • IP范围匹配:-m iprange --src-range,IP范围
      • MAC地址匹配:-m mac --mac-source,MAC地址
      • 状态匹配:-m state --state,连接状态
    • 通用匹配应用
      • iptables -I INPUT -p icmp -j DROP
      • iptables -A FORWARD -p ! icmp -j ACCEPT
        • “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
      • iptables -A FORWARD -s 192.168.1.11 -j REJECT
        • 拒绝来自192.168.1.11的连接
      • iptables -I INPUT -s 10.20.30.0/24 -j DROP
      • iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
        • 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
      • iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      • iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    • 隐含匹配应用
      • iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
        • 允许该网段进行dns查询
      • iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
        • 拒绝带以上标记的TCP包
      • iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
        • 不带SYN标记的统统接收
      • iptables -A INPUT -p icmp --icmp-type 8 -j DROP
        • 不允许来自别人的ping
      • iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
      • iptables -A INPUT -p icmp -j DROP
        • ICMP协议类型8为请求,类型3为不可达,类型0为回显。
    • 显式匹配应用
      • iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
      • iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
      • iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
      • iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
      • iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
        • ESTABLISHED,表示已建立的链接,两台机器正在通信。
        • RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

iptables实现NAT功能

  • SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
    • 局域网各主机正确设置IP地址/子网掩码
      • 仅主机模式
      • IP:192.168.11.3
      • 默认网关地址::192.168.11.11
    • Linux网关需要支持IP路由转发
      • iptables -F
      • echo "1" > /proc/sys/net/ipv4/ip_forward
        • 或通过vi /etc/sysctl.conf编辑
      • sysctl -p 查看当前状态
      • 至此该Linux开启了路由转发功能
    • 编写SNAT转换规则
      • iptables -t nat -D POSTROUTING 1
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
        • POSTROUTING:路由选择后处理。
        • -s X.X.X.X/X:内网源地址。
        • -o eth1:外网接口。
        • --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
    • MASQUERADE —— 地址伪装
      • 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
      • iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
  • DNAT,修改数据包的目标地址或端口号
    • 实现内网服务器通过防火墙发布到互联网
    • 局域网的Web服务器能够访问Internet
    • 网关的外网IP地址有正确的DNS解析记录
    • Linux网关支持IP路由转发
      • echo "1" > /proc/sys/net/ipv4/ip_forward
    • 编写DNAT转换规则
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
        • PREROUTING:DNAT使用PREROUTING链,路由选择前处理
        • -i eth1:外网接口。
        • -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
        • --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
          • 可以使用XAMPP自动部署web环境
          • 默认是80端口,其它端口的转发需要指定
          • 在浏览器输入172.16.8.100测试
    • 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
      • iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22

 

iptables系统服务与脚本

  • 脚本位置:/etc/init.d/iptables
  • 规则文件位置:/etc/sysconfig/iptables
    • service iptables start|restart|stop|save…
  • 配置防火墙脚本
    1. 编写防火墙脚本→开机时自动执行该脚本
      • 脚本执行指令写入/etc/rc.d/rc.local
      • vim ipfw.sh
        #!/bin/bash
        WAN_IF="eth1"
        WAN_IP="172.16.8.100"
        LAN_IF="eth2"
        LAN_IP="192.168.11.11"
        LAN_NET="192.168.11.0/24"
        LAN_WWW_IP="192.168.11.10"
        IPT="/sbin/iptables"
        MOD="/sbin/modprobe"
        CTL="/sbin/sysctl"
        
    2. 加载必要的系统模块,在ipfw.sh中追加
      $MOD ip_tables
      $MOD ip_conntrack
      $MOD ipt_REJECT
      $MOD ipt_LOG
      $MOD ipt_iprange
      $MOD xt_tcpudp
      $MOD xt_state
      $MOD xt_multiport
      $MOD xt_mac
      $MOD ip_nat_ftp
      $MOD ip_conntrack_ftp
      
    3. 调整/proc参数, Linux内核控制及调优,在ipfw.sh中追加
      $CTL -w net.ipv4.ip_forward=1
      $CTL -w net.ipv4.ip_default_ttl=128
      $CTL -w net.ipv4.icmp_echo_ignore_all=1
      $CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1
      $CTL -w net.ipv4.tcp_syncookies=1
      $CTL -w net.ipv4.tcp_syn_retries=3
      $CTL -w net.ipv4.tcp_synack_retries=3
      $CTL -w net.ipv4.tcp_fin_timeout=60
      $CTL -w net.ipv4.tcp_max_syn_backlog=3200
      
    4. 具体的防火墙规则,在ipfw.sh中追加
      • 按表、链分别设置规则,包括默认策略
      $IPT -t filter -X
      $IPT -t nat -X
      $IPT -t filter -F
      $IPT -t nat -F
      $IPT -P INPUT DROP
      $IPT -P FORWARD DROP
      $IPT -P OUTPUT ACCEPT
      $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
      $WAN_IP
      $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
      DNAT --to-destination $LAN_WWW_IP
      
    5. 使用IP地址黑、白名单
        1. 建立IP地址列表文件
        • 黑名单、白名单分开保存
        • 每行一个IP地址,或网段地址
        vim /opt/ipfw.w
            192.168.11.0/24
            220.121.72.85
        ……
        vim /opt/ipfw.b
            218.29.30.131
            61.45.135.29
            121.113.79.81
        
        1. 在脚本中调用黑、白名单,在ipfw.sh中追加
        • 使用for循环
        • 封锁黑名单地址、放开对白名单地址的限制
        BLST="/opt/ipfw.b"
        for i in $(grep -v "^#" $BLST)
        do
        $IPT -I INPUT -s $i -j DROP
        $IPT -I OUTPUT -d $i -j DROP
        $IPT -I FORWARD -s $i -j DROP
        $IPT -I FORWARD -d $i -j DROP
        done
        WLST="/opt/ipfw.w"
        for i in $(grep -v "^#" $WLST)
        do
        $IPT -I INPUT -s $i -j ACCEPT
        $IPT -I OUTPUT -d $i -j ACCEPT
        $IPT -I FORWARD -s $i -j ACCEPT
        $IPT -I FORWARD -d $i -j ACCEPT
        done
        
    6. 开机自动运行脚本
      • cp ipfw.sh /opt/
      • vi /etc/rc.d/rc.local
        • 添加/opt/ipfw.sh
      • reboot
      • iptables -L 检查配置情况
      • iptables -t nat -L
  • 防火墙脚本的构成
    • 主机型防火墙
      • 针对本机进行保护
      • 主要针对filter表中的INPUT、OUTPUT链设置规则
      • 修改ipfw.sh
        #!/bin/bash
        # 1. 定义基本变量
        IPT= "/sbin/iptables"
        ……
        # 3.2 定义默认策略
        $IPT -P INPUT DROP
        $IPT -P FORWARD DROP
        $IPT -P OUTPUT ACCEPT
        # 3.3 设置filter表中的各种规则
        $IPT -A INPUT -p tcp --dport 80 -j ACCEPT
        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ……
        
    • 网络型防火墙
      • 针对网络互访进行保护
      • 主要针对filter表中的FORWARD链,以及nat表设置规则
      • 修改ipfw.sh
        #!/bin/bash
        ……
        # 4.3 设置nat表中的各种规则
        $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source
        $WAN_IP
        $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j
        DNAT --to-destination $LAN_WWW_IP
        # 4.4 设置filter表中的各种规则
        $IPT -A FORWARD -d $LAN_NET -i $WAN_IF -m state --state
        ESTABLISHED,RELATED -j ACCEPT
        ……
        

 

Firewalld防火墙

  • 特点
    • FirewallD提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
    • FirewallD支持IPv4、IPv6防火墙设置以及以太网桥接,并且拥有“运行时配置”和“永久配置”选项。
    • FirewallD支持允许服务或者应用程序直接添加到防火墙规则中。
    • FirewallD动态管理防火墙,不需要重启整个防火墙便可应用更改。
    • FirewallD通过D-BUS提供当前激活的防火墙设置信息,也通过D-BUS接受使用PolicyKit认证方式做的更改。
    • 系统托盘区图标来显示防火墙状态,方便开启和关闭防火墙。
    • 提供firewall-cmd命令行界面进行管理及配置工作。
    • 为libvirt提供接口及界面,在必须的PolicyKit相关权限允许的情况下实现。
    • 提供firewall-config图形化配置工具。
    • 实现系统全局及用户进程的防火墙规则配置管理。
  • 区域
    • 通过将网络划分成不同的区域(通常情况下称为zones),制定出不同区域之间的访问控制策略来控制不同信任程度区域之间转发的数据流。
    • 传统防火墙都有区域的概念。
      • 例:Netscreen防火墙中“Trust”与“Untrust”区域;
      • 例:ASA防火墙中“Inside”与“Outside”区域;
      • 例:IPCop防火墙中“Red”与“Green”区域。
    • 默认区域
      • 在配置规则时,不指定区域则被认定为写入到默认区域。
      • FirewallD防火墙的默认区域为“public”
    • 区域相关命令
      • firewall-cmd --get-zones
        • 当前支持的区域列表。
      • firewall-cmd --get-default-zone public
        • 显示默认区域。
    • 区域规则中的元素
      • 防火墙规则就是由这些元素构成
      • 预定义的服务
        • 服务是端口(和/或)协议组成的;当然,也可能还包括netfilter助手模块以及目标地址(由IPv4或IPv6地址构成)。
      • 端口和协议
        • 定义了tcp或udp端口,端口可以是一个端口或者一组端口范围。
      • ICMP过滤器
        • 可用于规则的ICMP报文类型;这些报文可以是信息请求,也可以是对信息请
          求或错误条件创建的响应。
      • 伪装
        • 将私网地址映射为公网IP地址(多为动态地址);即源地址转换。
      • 端口转发
        • 转发一个网络端口从一个网络节点到另一个网络节点的规则。
      • 接口与源(略)
      • 富规则(后面详细介绍)
    • FirewallD预定义区域
      • 丢弃区域(Drop Zone):任何进入的数据包都将被丢弃。这个类似与我们之前使用iptables -j DROP。
      • 阻塞区域(Block Zone):拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。
      • 公共区域(Public Zone):只接受那些被设定的连接。
      • 外部区域(External Zone):这个区域相当于路由器启用伪装(masquerading)选项。只有指定的连接会被接受。
      • 隔离区域(DMZ Zone):如果想要只允许给定的部分服务能被外部访问,可以在DMZ区域中定义。
      • 工作区域(Work Zone):在这个区域,我们只能定义内部网络。
      • 家庭区域(Home Zone):这个区域专门用于家庭环境。
      • 内部区域(Internal Zone):这个区域和工作区域(Work Zone)
        类似,只能通过被选中的连接。
      • 信任区域(Trusted Zone):该区域中的接口将被允许所有的网络通信。
    • 区域操作命令
      • firewall-cmd --set-default-zone=home
        • 设置默认区域
      • firewall-cmd --get-active-zones home
        • 查看当前活跃区域
      • firewall-cmd --list-all-zones
        • 列出全部区域及特性
        … …
        public (default, active)
        interfaces: eno16777728
        sources:
        services: dhcpv6-client ssh
        ports:
        masquerade: no
        forward-ports:
        icmp-blocks:
        rich rules:
        … …
        
      • firewall-cmd --zone=public --list-all -列出某一区域特性
      • 根据接口获取区域信息
        • firewall-cmd --get-zone-of-interface=eno16777728 public
      • 临时将接口增加到区域
        • firewall-cmd --zone=public --add-interface=eno16777728
      • 临时修改接口所属区域
        • firewall-cmd --zone=public --change-interface=eno16777728 success
      • 临时从区域中删除一个接口
        • firewall-cmd --zone=public --remove-interface=eno16777728 success
      • 查询区域中是否包含某接口,未指定区域名,实则为默认区域
        • firewall-cmd --zone= --query-interface=eno16777728 Yes
      • 查询区域中已启用的服务
        • firewall-cmd --zone= --list-services dhcpv6-client ssh
  • 防火墙基本操作
    • 启动服务
      • systemctl enable firewalld.service
    • 停止服务
      • systemctl stop firewalld.service
    • 查看防火墙状态
      • systemctl status firewalld.service
    • 服务管理
      • 显示服务列表
        • firewall-cmd --get-services
      • 显示当前服务
        • firewall-cmd --list-services
      • 允许某服务通过,其中选项--permanent,表示为永久配置项
        • firewall-cmd --permanent --zone=internal --add-service=http
      • 临时开启某服务,选项--timeout,表示临时开启秒数
        • firewall-cmd --zone=work --add-service=smtp --timeout=60
        • firewall-cmd --reload - 配置规则重新载入
      • 从区域移除服务
        • firewall-cmd --zone=public --remove-service=ftp
    • 端口管理
      • 打开或关闭端口,打开/关闭“443/tcp”端口在public区域
        • firewall-cmd --zone=public --add-port=443/tcp
        • firewall-cmd --zone=public --remove-port=443/tcp
      • 端口转发,在external区域实现SNAT伪装
        • firewall-cmd --zone=external --add-masquerade
      • 端口转发,把public区域的80端口转发到3128端口
        • firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=3128
      • 端口转发,把external区域的443端口转发到内网172.16.8.201这台主机
        • firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.16.8.201
      • 移除一个端口转发规则
        • firewall-cmd --zone=external --remove-forward-port=port=443:proto=tcp:toport=3128:toaddr=172.16.8.201
      • 列表区域中已开启端口与端口转发规则
        • firewall-cmd --zone=public --list-ports
        • firewall-cmd --zone=external --list-forward-ports
    • 其他命令
      • 启用应急模式阻断所有网络连接,以防出现紧急状况
        • firewall-cmd --panic-on
        • firewall-cmd --panic-off //禁用应急模式
        • firewall-cmd --query-panic //查询应急模式
      • 获取所有支持的ICMP类型
        • firewall-cmd --get-icmptypes
      • 阻塞默认区域中的ICMP应答报文
        • firewall-cmd --add-icmp-block=echo-reply
      • 禁止ICMP应答阻塞
        • firewall-cmd --remove-icmp-block=echo-reply/request
      • 查询ICMP应答报文的阻塞状态
        • firewall-cmd --query-icmp-block=echo-reply
      • 通过--direct参数直接将iptables命令参数传递给防火墙
        • firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -- dport 80 -j ACCEPT
    • 富规则(Rich Language-复杂防火墙规则
      • 增加、移除、查询规则:
        • firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
          • 允许源ipv4地址为172.16.8.201的http服务通过默认区域
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --timeout=90
          • 永久规则
            • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --permanent
        • firewall-cmd [--zone=zone] --remove-rich-rule='rule' [--permanent]
        • firewall-cmd [--zone=zone] --query-rich-rule='rule '
      • rule参数:
        • rule family="ipv4|ipv6"
        • source address="address[/mask]" [invert="True"]
        • destination address="address[/mask]" [invert="True" ]
        • service name="service name"
        • port="port value" protocol="tcp|udp"
        • icmp-block name="icmptype name"
        • masquerade
        • forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
        • log [prefix="prefix text"] [level="log level"] [limitvalue="rate/duration"] [audit]
        • accept | reject [type="reject type"] | drop
      • rule例子(结合防火墙图形配置工具来理解以下规则)
        • firewall-cmd --add-rich-rule 'rule protocol value="ah" accept'
        • firewall-cmd --add-rich-rule 'rule service name="ftp" log limit value="1/m" audit accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp"
          level="info" limit value="1/m" accept'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
        • firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.3" reject type="icmp-admin-prohibited"'
        • firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.4" drop'
    • 在防火墙配置文件中创建自己的服务
      • 我们准备添加一个新的服务叫rtmp,使用TCP协议,端口号是9527,步骤如下:
      • cd /etc/firewalld/services/
      • cp /usr/lib/firewalld/services/nfs.xml ./ //找个模板
      • mv nfs.xml rtmp.xml
      • vim rtmp.xml
        <?xml version="1.0" encoding="utf-8"?>
        <service>
        <short>RTMP</short>
        <description>The RTMP protocol Bala Bala ...</description>
        <port protocol="tcp" port="9527"/>
        </service>
        
      • firewall-cmd --reload
        • 防火墙配置重载
      • firewall-cmd --add-service=rtmp
      • cat /etc/firewalld/service/rtmp.service

 

SeLinux机制

安全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个“用户”、“进程”、“应用”和“文件”的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略将指定如何严格或宽松地进行检查。

SELinux对系统用户(system users)是透明的,只有系统管理员(root)需要考虑
在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。
只有同时满足了“标准Linux访问控制”和“SELinux访问控制”时,主体才能
访问客体。

  • Security-Enhanced Linux由以下两部分组成
      1. Kernel SELinux模块(/kernel/security/selinux)
      1. 用户态工具
  • DAC和MAC的区别(root用户)
    • 未启用SELinux的Linux系统是使用自主访问控制模型(DAC)的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它就无所不能了。
    • 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。强制访问控制模型(MAC)原本就是为军队开发的。
    • SELinux实现了一个更灵活的MAC形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全模型(Multi-Level Security)。DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路。
  • SeLinux的运行机制
    • 当一个subject(主体,如: 一个应用)试图访问一个object(客体,如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节写入/var/log/messages。
  • SeLinux伪文件系统
    • /sys/fs/selinux/”伪文件系统类似于“/proc/”伪文件系统;它存储了SELinux系统的状态。系统管理员和用户不需要操作这部分(通常借助相关命令修改其状态)
    • 可以这样修改
      • cd /sys/fs/selinux
      • more enforce
        • 0 //SELinux处于警告模式
      • echo 1 > enforce
      • more enforce
        • 1 //SELinux改为强制模式
  • SeLinux配置文件
    • 目录:/etc/selinux
      • “/etc/sysconfig/selinux”是“/etc/selinux/config” 主配置文件的符号链接。
      • /etc/sysconfig/selinux中包含如下配置选项:
        • 打开或关闭SELinux
        • 设置系统执行哪一个策略(policy)
        • 设置系统如何执行策略(policy)
        • SELINUX=enforcing,定义SELinux运行状态
          • Enforcing:SELinux安全策略置于强制模式。
          • Permissive:SELinux安全策略置于警告模式。
          • Disabled:SELinux完全被禁用。SELinux内核和伪文件系统脱钩,处于未注册状态。
        • SELINUXTYPE=targeted,定义SELinux策略模型
          • Targeted,类型强制(TE,Type Enforcement)访问控制,基于目标策略进行保护;
          • Minimum,Targeted策略模型的修改版本。仅针对选定的过程实施保护;
          • MLS,多层次安全保护模型(MLS,Multi-Level Security)。
  • SeLinux命令工具
    • /usr/sbin/setenforce,修改SELinux运行模式
      • setenforce 1 //SELinux以强制(enforcing)模式运行
      • setenforce 0 //SELinux以警告(permissive)模式运行
    • /usr/sbin/getenforce,查看SELinux模式
    • /usr/sbin/sestatus -v ,显示系统的详细状态
    • /usr/bin/chcon,修改对象(文件)的安全上下文,比如:用户:角色:类型:安全级别
    • 用法:
      • chcon [选项]... 环境 文件...
          - chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
          - chcon [选项]... --reference=参考文件 文件...
    • 参数:
      • -h, --no-dereference 影响符号链接文件,而不是引用文件
      • --reference=参考文件 使用指定参考文件的安全环境,而非指定值
      • -R, --recursive 递归处理所有的文件及子目录
        • 以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系;如果您指定了多于一个选项,那么只有最后一个会生效。
        • -H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
        • -L 遍历每一个遇到的通到目录的符号链接
        • -P 不遍历任何符号链接(默认)
      • -v, --verbose 为处理的所有文件显示诊断信息
      • -u, --user=用户 设置指定用户的目标安全环境
      • -r, --role=角色 设置指定角色的目标安全环境
      • -t, --type=类型 设置指定类型的目标安全环境
      • -l, --range=范围 设置指定范围的目标安全环境
      • --help 显示此帮助信息并退出
      • --version 显示版本信息并退出
    • 用例
      • mkdir -p /var/share/up
      • 允许该目录匿名共享
        • chcon -R -t public_content_t /var/share
      • 允许向该目录上传文件
        • chcon -t public_content_rw_t /var/share/up
  • 策略与规则管理相关命令
    • getsebool命令、setsebool命令、semanage命令
    • /usr/sbin/setsebool,用于修改SElinux策略内各项规则的布尔值。
      • 语法
        • setsebool [-P] 布尔值=[0|1]
      • 选项
        • -P:直接将设置值写入配置文件,该设置数据将来会生效的。
      • 用例:
        • 允许vsftpd匿名用户写入权限:
          • setsebool -P allow_ftpd_anon_write=1
        • 允许ftp用户访问自己的家目录:
          • setsebool -P ftp_home_dir 1
        • HTTP被允许CGI设置:
          • setsebool -P httpd_enable_cgi 1
        • 允许用户以HTTP方式访问其个人主页,该设定限仅于用户的家目录主页:
          • setsebool -P httpd_enable_homedirs 1
          • chcon -R -t httpd_sys_content_t ~user/public_html
        • 允许httpd访问终端:
          • setsebool -P httpd_tty_comm 1
        • 关于named、master更新selinux设定:
          • setsebool -P named_write_master_zones 1
        • Selinux将本机的NFS共享设置成只读:
          • setsebool -P nfs_export_all_ro 1
        • SElinux将本机的NFS共享设置成可读可写:
          • setsebool -P nfs_export_all_rw 1
        • 将远程NFS的家目录共享到本机:
          • setsebool -P use_nfs_home_dirs 1
        • 将samba服务器共享目录给多个域:
          • setsebool -P allow_smbd_anon_write=1
        • 允许samba服务器共享家目录:
          • setsebool -P samba_enable_home_dirs 1
        • 在本机上使用远程samba服务器的家目录:
          • setsebool -P use_samba_home_dirs 1
        • 允许rsync其他用户写入:
          • setsebool -P allow_rsync_anon_write=1
        • 允许系统使用kerberos:
          • setsebool -P allow_kerberos 1
    • /usr/sbin/getsebool,用来查询SElinux策略内各项规则的布尔值。
      • 语法
        • getsebool [-a] [布尔值条款]
      • 选项
        • -a:列出当前系统所有布尔值条款设置值。
    • /usr/sbin/semanage,用来查询与修改SELinux默认目录的安全上下文。
      • 语法
        • semanage {login|user|port|interface|fcontext|translation} -l
        • semanage fcontext -{a|d|m} [-frst] file_spec
      • 选项
        • -l:查询。
        • fcontext:主要用在安全上下文方面。
        • -a:增加,你可以增加一些目录的默认安全上下文类型设置。
        • -m:修改。
        • -d:删除。
      • 用例
        • semanage fcontext -l |grep /var/www/html
        • 设置/var/share目录的默认安全性本文为public_content_t
          • semanage fcontext -t public_content_t "/var/share(/.*)?"
          • semanage fcontext -l |grep "/var/share"
        • 规则其实写在这里
          • cat /etc/slinux/targetd/contexts/files/file_contexts.local
          • 尝试给其恢复默认值
            • restorecon -Rv "/var/share"
    • /usr/sbin/restorecon,用来恢复SELinux文件属性即恢复文件的安全上下文。
      • 语法
        restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f
        filename | pathname...]
      • 选项
        • -i: 忽略不存在的文件。
        • -f infilename文件: infilename中记录要处理的文件。
        • -e directory: 需要排除的目录。
        • -R/-r: 递归处理目录。
        • -n: 不改变文件标签。
        • -o outfilename: 在文件不正确的情况下保存文件列表到outfilename。
        • -v:将过程显示到屏幕上。
        • -F:强制恢复文件安全语境
      • 用法
           假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经
        常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网
        页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可
        能是因为这个文件的SELinux配置信息是继承原来那个目录的,与
        /var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一
        起移动过来了,从而导致无法打开页面,具体请看下面的实例:
            cd 
            echo "Hello" >index.html
            mv index.html /var/www/html/
            systemctl start httpd.service
            使用浏览器访问测试
            作如下操作,恢复index.html的安全上下文,再用浏览器访问
                cd /var/www/html/
                ls -Zd ./
                restorecon -R /var/www/html/
        
  • 安全上下文
    • 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),“域”和“域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域;通常,我们认为域、域类型、主体类型和进程类型都是同义的,即都是安全上下文中的“TYPE”。
    • SELinux对系统中的许多命令做了修改,通过添加一个“-Z”选项显示客体和主体的安全上下文。
      • 主体:系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;
      • 客体文件的Security Context规则如下:
        • rpm包安装的:会根据rpm包内记录来生成安全上下文;
        • 手动创建的文件:会根据policy中的规定来设置安全上下文;
        • cp:会重新生成安全上下文;
        • mv:安全上下文则不变。
      • 安全上下文相关的选项:-Z
    • 安全上下文的格式
      • 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文
        • 安全上下文中的用户和角色标识符对类型强制访问控制策略没什么影响;
        • 对于进程,用户和角色标识符显得更有意义,因为它们把控制类型和用户标识符联合,这样就会与Linux用户账号关联起来;
        • 对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用
      • 标准Linux安全(DAC)中的用户ID和SELinux安全上下文(MAC)中的用户标识符分别用于标准(DAC)的和安全增强(MAC)的访问控制机制;两者之间的任何一个相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。
      • USER
        • user identity:类似Linux系统中的UID,提供身份识别,用来记录身份,安全上下文的一部分;
        • 几种常见的 user:
          • user_u :普通用户登录系统后的预设;
          • system_u :开机过程中系统进程的预设;
          • unconfined_u:自由,非限制用户标识,系统预设;
          • root :root登录后的预设;
        • 在 targeted policy中users不是很重要;
        • 在strict policy中比较重要,所有预设的SELinux Users都是以“_u”结尾的,root除外。
      • ROLE
        • 文件、目录和设备的role:通常是object_r;
        • 程序的role:通常是system_r;
        • 用户的role:
          • 用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;
        • targeted policy为system_r;
        • strict policy为sysadm_r、staff_r、user_r;
        • 使用基于RBAC(Roles Based Access Control)的strict(新版已淘汰)和mls策略中,用来存储角色信息。
      • TYPE
        • type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
        • 当一个类型与执行中的进程相关联时,其type也称为domain;
        • type是SElinux security context中最重要的部位,是SELinux类型强制执行安全模型的核心,预设值以_t结尾;
        • LEVEL和CATEGORY:定义层次和分类,只用于MLS策略中;
          • LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高
          • CATEGORY:代表分类,目前已经定义的分类为c0-c1023
  • SELinux和标准Linux的访问控制属性的对比
    • 在SELinux中,访问控制属性总是安全上下文(用户:角色:类型)形式,所有客体和主体都有一个关联的安全上下文。需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。
    • 注意:SELinux是在标准Linux访问控制基础之上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须同时满足才能访问一个客体;
      • 例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w权限,
        那么我们也不能写该文件。
    • 标准Linux基于用户和组ID进行访问控制
    • 系统中每个文件、目录、网络端口等都被指定一个安全上下文,策略(policy)则给出各安全上下文之间的作用规则。
    • SELinux根据策略(policy)及安全上下文(security context)规则来决定存取行为是否可执行
      • 主体(Subject)主体:系统进程,比如/usr/sbin/httpd;
      • 客体(Object)客体:被存取的项目,比如文件、目录、套接字接口等
  • 类型强制(TE)访问控制
    • Type Enforcement(TE),在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用/组ID是什么;所以在SELinux中,没有默认的超级用户。
    • SELinux通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
      • 源类型(Source type(s)),通常是尝试访问的进程的域类型
      • 目标类型(Target type(s)),被进程访问的客体的类型
      • 客体类别(Object class(es)),指定允许访问的客体的类别
      • 许可(Permission(s)),允许源类型访问客体类型的具体权限
    • 举个例子:
      • allow user_t bin_t : file {read execute getattr};
        • 允许主体user_t访问客体bin_t,访问的类别为file(至于其它类别,想都别想),能够行使的权限有读、执行、获取属性。
  • 基于角色的访问控制(RBAC)
    • Role Base Access Control(RBAC)是一种权限与角色相关联的通用访问控制安全模型,用户通过成为适当角色的成员而得到这些角色的权限,从而较为方便的实现不同人员的权限分配。不同于细粒度的能力划分,RBAC更像是一种能力的集合体,由一种管理需求设计角色,然后为角色分配细粒度的能力,使得角色成为与人员较为对等的映射关系。
    • 在RBAC模型中,人员可以应需求切换角色,角色可以应调整进行修改其拥有的能力。对比MAC,管理模式更加人性化,更加适合应用于实际的人员管理。
    • SELinux中的RBAC主要通过其安全上下文的role字段实现。
  • SeLinux中的多级安全
    • MLS(Multi-Level Security)多级安全是BLP(Bell-La-Padula)模型在SELinux中的体现。
    • MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。
    • 为了支持MLS,安全上下文被扩展了,包括了安全级别。
    • 在SELinux下的Type Enforcement(TE)是一个更加灵活和更具表现力的安全策略,在许多情况下,TE比MLS更适合。在一些场景中,MLS是仍然是必须的。如:一个文件服务器上存有混合分类的数据,且客户以不同的许可连接此服务器这将导致在一个简单的系统中,需要大量的安全 级别来强制隔离所有数据。这种场景就适合应用MLS。
    • MLS安全上下文至少必须有一个安全级别(它由敏感度和范畴组成),但可以包括两个安全级别。
[展开全文]

Centos是开源的,先配置虚拟机参数(系统选择centos 64),cd驱动器选择iso镜像,检测镜像是否有损坏。centos安装步骤:1.选择语言(可以设置语言布局)2.可以选择GUI图形界面的基本环境(常用硬件监控工具,java平台,大系统性能,性能工具,兼容型程序库,开发工具,安全性工具)3.安装位置设置分区(有默认配置,也可以自己配置分区)KDUMP系统崩溃时可以捕获信息,NETWORK网络配置

[展开全文]
Hoprs · 2018-06-28 · CentOS7安装 0

简介

  • Puppet是一种Linux、Unix、windows平台的集中配置管理系统
  • 使用自有的Puppet描述语言,可管理配置文件、系统用户、Cron任务、安装软件包、系统服务等。Puppet把这些系统实体称之为资源,Puppet的设计目标是简化对这些资源的管理以及妥处理资源之间的依赖关系。
  • Puppet采用C/S星型结构,所有客户端和一个或几个服务器交互。每个客户端周期性的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证配置信息同步。Puppet客户端严格按照服务器上的配置文件来配置各种应用、服务。配置完成以后,Puppet客户端会反馈给服务器端一个消息。如果出错,也会给服务器端反馈一个消息。
  • Puppet的官方网站
  • https://puppet.com/
  • 下载:https://yum.puppetlabs.com/puppetlabs-release-
    pc1-el-7.noarch.rpm

 

部署Puppet

  • 1、配置IP地址、主机名,关闭SELinux

  • [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728

    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=172.16.8.100
    NETMASK=255.255.255.0
    GATEWAY=172.16.8.2
    DNS1=114.114.114.114
    DNS2=8.8.8.8 //修改的内容,其它内容省略
    
  • [root@localhost ~]# vim /etc/sysconfig/network
    HOSTNAME=pt.sevenwin.org

  • [root@localhost ~]# vim /etc/hosts
    172.16.8.100 pt.sevenwin.org pt
    172.16.8.101 c65.sevenwin.org c65

  • [root@localhost ~]# vim /etc/selinux/config
    SELINUX=disabled

  • [root@localhost ~]# reboot

  • 2、设置NTP服务

  • [root@pt ~]# yum -y install ntp

  • [root@pt ~]# ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime

  • [root@pt ~]# vim /etc/ntp.conf

        restrict 172.16.8.0 mask 255.255.255.0 nomodify notrap
        server 210.72.145.44 //这是中国国家授时中心的IP
        server 0.centos.pool.ntp.org iburst
        server 1.centos.pool.ntp.org iburst
        server 2.centos.pool.ntp.org iburst
    
  • [root@pt ~]# systemctl start ntpd.service

  • [root@pt ~]# systemctl enable ntpd.service

  • [root@pt ~]# firewall-cmd --permanent --zone=public --add-port=123/udp

  • [root@pt ~]# firewall-cmd --zone=public --add-port=123/udp

  • [root@pt ~]# firewall-cmd --permanent --zone=public --add-port=8140/tcp

  • [root@pt ~]# firewall-cmd --zone=public --add-port=8140/tcp

  • 3、安装Puppet-Server、启动Puppet-Server

  • [root@pt ~]# yum -y install ruby

  • [root@pt ~]# wget https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm

  • [root@pt ~]# rpm -ivh puppetlabs-release-pc1-el-7.noarch.rpm

  • [root@pt ~]# yum -y clean all

  • [root@pt ~]# yum -y update

  • [root@pt ~]# yum install puppetserver –y

    • //Puppet默认使用JVM内存大小2G,如调整编辑/etc/sysconfig/puppetserver文件
  • [root@pt ~]# vim /etc/sysconfig/puppetserver

    • //确定下面的参数
      JAVA_ARGS="-Xms2g -Xmx2g -XX:MaxPermSize=256m"
  • [root@pt ~]# vim /etc/profile

    PATH=/opt/puppetlabs/bin:$PATH //第52行
    export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
    
  • [root@pt ~]# systemctl enable puppetserver

  • [root@pt ~]# reboot

  • 4、安装Puppet-Agent

    • 1、先配置IP地址和主机名

      • [root@c65 桌面]# cat /etc/udev/rules.d/70-persistent-net.rules
        SUBSYSTEM==“net”, ACTION==“add”, DRIVERS==“?*”,
        ATTR{address}==“00:0c:29:bd:a1:6c”, ATTR{type}==“1”, KERNEL==“eth*”,
        NAME=“eth0“ //复制MAC址
        
      • [root@c65 桌面]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0
        HWADDR=00:0C:29:BD:A1:6C //保持与UDEV记录一致
        ONBOOT=yes
        BOOTPROTO=static
        IPADDR=172.16.8.101
        NETMASK=255.255.255.0
        GATEWAY=172.16.8.2
        DNS1=114.114.114.114
        
      • [root@c65 桌面]# vim /etc/sysconfig/network
        HOSTNAME=c65.sevenwin.org
      • [root@c65 桌面]# vim /etc/hosts
        172.16.8.165 c65.sevenwin.org c65
        172.16.8.172 pt.sevenwin.org pt
        
    • 2、配置任务计划

      • echo "00 */1 * * * root /usr/sbin/ntpdate 172.16.8.100;/sbin/hwclock -w" >> /etc/crontab
        • 每小时第0分钟以root身份运行ntpdate命令,向172.16.8.100主机请求时间信息
      • ntpdate 172.16.8.100
        • 需要一段时间后才能获取到时间
    • 3、安装Puppet-Agent

    • 4、配置Puppet

      • [root@c65 ~]# vim /etc/profile
        PATH=/opt/puppetlabs/bin:$PATH
        export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
        
      • [root@c65 ~]# vim /etc/puppetlabs/puppet/puppet.conf
        [main]
        certname = c65.sevenwin.org
        server = pt.sevenwin.org
        environment = production
        runinterval = 30
        
      • puppet cart list --all
        • 检查证书
      • reboot
    • 5、启动并测试Puppet

      • 在客户端启动Puppet代理
        • [root@c65 ~]# service puppet start
        • [root@c65 ~]# puppet agent -t
          • 申请证书失败,到服务器端发放证书
      • 在服务端签发指定客户端证书
        • [root@pt ~]# puppet cert sign c65.sevenwin.org
        • [root@pt ~]# puppet cert list --all
      • 在客户端启动Puppet代理2
        • puppet agent -t
    • 6、配置Puppet开发环境(统一控制客户端)

      • [root@pt ~]# wget http://download.puppetlabs.com/puppet/puppet.vim -P /usr/share/vim/vim74/plugin
      • [root@pt ~]# vim .etc/puppetlabs/code/environments/production/manifests/site.pp
        • site.pp是puppetmaster的第一执行脚本
        • 其他的脚本需要通过site.pp来调用
            node default{
                file{ "/tmp/helloworld.txt":
                    content => "Hello World !\n";
                }
            }
        
        • default:指定所有客户端
      • [root@c65 ~]# puppet agent -t
      • [root@c65 ~]# cat /tmp/helloworld.txt
  • 5、puppet的工作原理

  • 6、puppet的基本语法

    • puppet的代码构成:资源:资源之属性
      • 属性包括:type|title|其它
        • 不同的标题表示不同的资源
      • 每个属性键值后都有一个都好,最后一个属性键值对后面可以使用逗号或分号
      • 资源默认值
        • 为某类资源制定一个默认的参数;使用没有标题的大写资源首字母方式
          • 格式:Type{属性 => 值,..,属性=>值}
    • 典型的资源结构
    • 变量的定义和引用
    • 数组的定义和使用
      • puppet使用[]来定义数组,其中的内容由逗号分割,且由双引号括起来
    • 类的定义和使用
      • 类是一个资源的集合,代表节点上一个单独的配置项目
      • 类的继承
    • 函数(define)
    • 资源之间的依赖关系
      • before:在某个资源之前执行
      • after:在某个资源之后执行
      • require:某个资源必须存在或者正确执行后,才执行响应的资源
    • 资源之间触发更新
      • notify:用来通知某个资源进行更新
      • subscribe:该资源有更新时,通知另一个资源执行相应的操作
    • 模块
      • 如果你配置的应用、守护进程、或函数包含很多类、文件或模板,最简单的办法就是将这些资源放到一个包里.
      • 使用puppet管理的时候,会根据业务进行划分,将其分为web、db、mencache等,为了方便统一管理,就可以使用模板,针对不同业务类型定义标准化的配置
      • 模板应用案例
        • 1、创建mariadb目录
          • [root@pt ~] mkdir -p /etc/puppetlabs/code/modules/mariadb/{manifests,files,templates}
        • 2、创建init.pp文件
          • [root@pt ~] cd /etc/puppetlabs/codee/modules/mariadb/
          • [root@pt ~] vim manifests/init.pp
            class mariadb{
                package{ 'mariadb-server' :
                  ensure => installed,
                }
                service{ 'mariadb.service' :
                  ensure => running,
                  ensure => true,
                  start => '/usr/bin/systemctl start mariadb.service',
                  restart = '/usr/bin/systemctl restart mariadb.service',
                  stop => '/usr/bin/systemctl stop mariadb.service',
                  require => Package['mariadb-server'],
                }
            }
            
        • 3、定义一个节点,并使用该模块
          • [root@pt ~] vim /etc/puppetlabs/code/environments/prodution/manifests/site.pp
            node default{
                include mariadb
            }
            
        • 4、到客户端测试
          • rpm -qa | grep mariadb 检查有无mariadb包(无)
          • puppet agent --server pt.sevenwin.org
          • puppet agent -t --noop
          • rpm -qa | grep mariadb
            • 包比较大,等待一段时间,即可安装完成
[展开全文]

1.VM 安装 centos7以及配置

 
 
G
M
T
 
 
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
 
 
 
 
 
 
 
 
Text-to-speech function is limited to 200 characters
 
 
Options : History : Feedback : Donate Close

 

[展开全文]

1.2   配置本地yum源

     配置固定ip地址

    cd /etc/sysconfig/network-scripts/

    挂载光盘 

    umount /dev/cdrom

   mount /dev/cdrom /media/cdrom/

  

 安装ftp

  cd /media/cdrom/Packages/

    rpm -Uvh vsftpd-3.0.2-22.el7.x86_64.rpm

cp -rf /media/cdrom/* ./

systemctl start vsftpd

 netstat -atpn | grep 21

配置 vsftpd 安全

vim /etc/vsftpd/vsftpd.conf  被动

设置 selinux规则

setsebool allow_ftpd_full_access 1

setsebool httpd_enable_ftp_server 1
添加端口

 

 

 

 

 

 

 
 
G
M
T
 
 
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
 
 
 
 
 
 
 
 
Text-to-speech function is limited to 200 characters
 
 
Options : History : Feedback : Donate Close
[展开全文]

2.系统更新安全
  2.1账号基本安全
  EPEL提供的软件包大多基于其对应的Fedora软件包,不会与企业版Linux发行版的软件包发生冲突

   配置EPEL源
    查看版本号cat /etc/redhat-release

     安装epel源 yum -y install http://mirrors.opencas.cn/epel/epel-release-latest-7.noarch.rpm
       yum -y install openvas*  安装openvas 测试
     使用yum update更新系统时不升级内核
    mkdir -p /var/.bak/etc
    cp /etc/yum.conf /var/.bak/etc/
    vim /etc/yum.conf
    //在[main]段后追加一行
    exclude=kernel*  //更新时,忽略kernel相关包
    关闭自动下载更新
     yum -y install cronie
    systemctl start crond
    yum -y install yum-cron
    systemctl start yum-cron
    vim /etc/yum/yum-cron.conf
    //前下面两项改为“no”
    update_messages = no
    download_updates = no
    systemctl  restart yum-cron.service

 

 
 
G
M
T
 
 
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
 
 
 
 
 
 
 
 
Text-to-speech function is limited to 200 characters
 
 
Options : History : Feedback : Donate Close
[展开全文]

1.安装VM虚拟机

2.下载CentOS7的镜像文件

3.新建虚拟机

    1.自定义

    2.稍后安装操作系统

    3.Linux-CentOS64位

    4.内核数量2

    5.2G内存

    6.使用网络地址转换

    7.SCS

    8.创建虚拟机磁盘60G

4.编辑虚拟机设置

    1.移除不需要的硬件

    2.网络适配器-自定义-VMware2(仅主机模式)

    3.CD-安装镜像文件

 5.启动虚拟机

    1.安装CentOS7

    2.语言选择简体中文

    3.日期和时间

    4.键盘-汉语+英语

    5.软件选择-带GUI的服务器-硬件监控工具、JAVA平台、大系统性能、性能工具、兼容性程序库、开发工具、安全性工具

    6.安装位置-我要配置分区-点最下面

    7.手动分区-点这里创建-浏览

    8.KDUMP禁用

    9.NETWORK-以太网开启

6.开始安装

    1.ROOT密码

        if(mima<strong)

            twice;

    2.创建用户

          

 

        

    

 

[展开全文]

授课教师

高级讲师

课程特色

视频(35)
下载资料(3)