firewall和netfilter

时光总嘲笑我的痴心妄想 提交于 2019-11-30 18:00:52

firewall和netfilter

  • 临时关闭防火墙 selinux 使用命令 setenforce 0
  • 如果想永久关闭防火墙,需要修改配置文件
  • 配置文件地址是 /etc/selinux/config
  • 可以使用 vi /etc/selinux/config 进行修改
  • 如图,打开config文件后,可以看到上图内容
  • 这里需要把 SELINUX=enforcing 的值 修改为 disabled
  • 也就是 SELINUX=disabled ,然后保存退出,重启系统就生效了
  • 如图,命令 getenforce 可以查看 selinux 的状态
  • 上图显示为 Enforcing 表示是打开状态
  • 使用 setenforce 0 命令把 selinux 临时关闭
  • 然后再使用 getenforce 查看 selinux 的状态
  • 可以看到变成了 Permissive
  • Permissive的意思是,一些会触发防火墙的操作,系统会提出警告
  • 如果是 Enforcing 状态,系统会直接打断操作
  • 而 Permissive 状态下,系统不会打断操作,但是会在后台记录警告信息
  • 也就是说,可以进行一些会触发 selinux 的操作

  • 除了selinux这个防火墙外,还有另外一个防火墙叫做 netfilter
  • selinux防火墙是对内的,而 netfilter 是对外的
  • 网络过来的包会被netfilter处理,如果通过了netfilter
  • 进入到系统内部,则会受到 selinux 的限制
  • 想要控制 netfilter 工作
  • 可以使用 iptables 和 firewalld 这两个工具来操作netfilter
  • centOS7 之前的版本,都是使用 iptables 来操作 netfilter
  • 从centOS7开始,新增了 firewalld 工具也可以操作 netfilter
  • firewalld 本质上是 iptables 的封装
  • firewalld 的命令实际上也是由 iptables 来实现的
  • 等于是把复杂的iptables命令封装起来,变成一条简单的firewalld命令
  • 与iptables相比,firewalld操作简单一些,也有更强大的功能
  • centOS7 的默认防火墙工具是 firewalld 而不是 iptables
  • 在firewalld里面也可以使用iptables的命令
  • 但是不推荐使用,在firewalld工具里面最好还是使用firewalld命令为佳
  • 因为firewalld也是用iptables来实现的,很多公司也在用centOS6,不支持firewalld
  • 所以 iptables 也是要了解清楚的

  • centOS7 默认使用的是 firewalld
  • 如果想使用 iptables 需要先关闭 firewalld
  • 如图,systemctl disable firewalld 关闭firewalld,这样重启后就不会启动firewalld
  • 下面的命令 systenctl stop firewalld 是停止正在运行的firewalld服务
  • 这样就把 firewalld 设置为关闭,并且停止了正在运行的firewalld
  • 要使用 iptables 要先安装一个包,如上图
  • 关闭了 firewalld 服务后,需要开启 iptables 服务
  • 如图,systemctl enable ipptables 命令将iptables 设置为可开启状态
  • 然后 systemctl start iptables 打开 iptables 服务
  • 如图,使用命令 iptables -nvL 可以查看 iptables 的默认规则信息

netfilter5表5链介绍

  • 使用命令 man iptables
  • 往下翻页,可以看到上图中的信息
  • filter,nat,mangle,raw,security 代表5张表
  • 默认的表是 filter
  • 如图,filter 解释里面有三个链的信息
  • filter内置了3个链,分别是 input,output,forward 三个链
  • input 可以对进入本机系统内核的数据包进行处理
  • forward 是指进入机器的数据包,但是不进入系统内核
  • 因为有些数据包经过本机,但是目标地址并不是本机
  • 如果数据包的目标地址不是本机,只是路过本机就会进入 forward 链
  • forward链就可以对这些数据包进行操作,比如 修改目标地址
  • output链可以对 本机内核出去的数据包进行一些操作
  • 举例说明,本机要发一个数据包到一个ip地址去
  • 但是管理员不希望本机有任何数据包被发送到这个ip地址
  • 这时就可以在output链设置规则,所有目标地址是这个ip地址的包都不能出去
  • 前提是这些数据包是本机产生的,因为output只对本机产生的包有效

  • 如图所示,外面发送数据包到本机
  • 数据包会从 in 的位置进入,首先经过 prerouting 链
  • 在 prerouting 链里面,会经过三张表的策略进行判断数据包的去向
  • 每个链里面,都有显示 表 的名称
  • 就说明,经过这个链的时候,这些表里面写好的规则会起作用
  • 比如说,prerouting 里面有三个表,nat,mangle,raw
  • 这说明,在这三个表里面,可以写一些针对经过 prerouting 链的数据包的规则
  • 每一个经过 prerouting 链的数据包,都会被这些规则处理一遍

  • 从链的流向来看,数据包到达 prerouting链,这里会判断数据包的目的地
  • 目的地是本机,数据包会进入 input 链,然后到达本机内核
  • 经过内核处理,本机发出的数据包会进入 output 链,然后到达postrouting链

  • 如果数据包的目的地不是本机,而是由本机进行转发
  • prerouting链 就会判断将数据包发向 forward链
  • 数据包经过 forward链 进入 postrouting链,然后从网卡出去

  • 每经过一条链的时候,如果在相应的表里面写了规则
  • 那么数据包经过这条链的时候,就会按照这些规则进行处理
  • 如果没写规则,就直接放行了
  • 每条链有不同的表可以设置规则,每条链并不可以使用所有表的规则
  • 只有 对应的表的规则 可以使用

  • filter,nat,mangle,raw,security 这5个表里面
  • 常用的就是 filter 和 nat
  • 剩下的三个都不怎么常用,主要了解 filter 和 nat
  • filter 主要是用来过滤数据包的,可以设置怎样的数据包不能通过之类的
  • nat 则是处理网络地址转换,也就是跟ip有关的规则

iptables语法

  • 使用 iptables -nvL 查看规则信息
  • 如图,可以看到 input,forward,output三条链上的规则
  • iptables 如果不指定表的话,默认就是显示 filter 的规则信息
  • 所以图中显示的链是 filter 可以操作的链
  • 上图命令可以重启 iptables
  • 上图是 cat 默认规则的配置文件,/etc/sysconfig/iptables 就是规则的配置文件
  • 每次重启iptables后,都会从这个配置文件里面导入规则
  • 所以如果不把自己修改的规则保存到这个配置文件里面的话
  • 每次重启,之前自己修改的规则就会消失,因为会重新加载这个配置文件的规则
  • 如图, iptables -F 命令可以把目前正在运行的规则清空
  • 执行上面命令后,再使用 iptables -nvL 查看规则
  • 可以看到,下面的规则表已经清空了,没有任何规则信息了
  • 但是 -F 参数只能清空正在运行的规则列表
  • 这时打开 iptables配置文件查看的话,就会发现
  • iptables配置文件里面还是有规则,并没有清空
  • 如果重启 iptables 的话,配置文件里面的规则会被重新加载
  • 如果想把当前运行状态的规则保存到配置文件里面
  • 可以使用上图命令
  • 例如,当前状态是 空规则,如果使用 service iptables save
  • 那么配置文件里面的规则就会被空规则覆盖掉,也就是说没有任何规则
  • 不过一般不这样做,因为可以在需要的时候重新加载配置文件
  • 把清空的规则加载回来
  • 因为不指定表的话,默认表就是 filter
  • 所以上面的操作都是针对 filter表的,包括清空规则
  • 如果想指定修改的表
  • 如图,可以使用 -t 参数
  • 上图中,-t nat 就是指定显示 nat 表的规则
  • 如上图所示,规则信息,第一列是包的数量
  • 第二列是数据包总的大小,单位是字节
  • 这两列数据是可以清空的
  • 使用命令 iptables -Z 就可以清空这两列数据
  • 参数 -Z 可以把计数器清零

  • 上图命令是添加规则的命令
  • iptables 后面的参数里面,没有 -t 说明没有指定表
  • 在没有指定表的情况下,就是对默认表 filter 进行操作
  • 参数 -A 是 add 增加规则的意思
  • 后面接 INPUT 是指增加的规则是针对 input链的
  • 也就是说,这条规则会对 input链的数据包进行操作
  • 后面的 -s 参数是指定数据包来源的 ip,后面接来源 ip地址
  • 参数 -p 是指定数据包传输协议的,后面接协议名称,这里是 tcp
  • 参数 --sport 是指定数据包来源端口的,后面是端口号 1234
  • 参数 -d 是指定数据包目标ip的,后面接目标ip地址
  • 参数 --dport 是指定数据包目标ip端口的,后面接端口号,这里是80
  • 参数 -j 是指定操作规则的,后面接规则名称,这里是 DROP
  • DROP 是指符合以上设置的数据包会被直接扔掉,不能通过
  • 也可以使用 REJECT 规则,这个规则也是不让数据包通过
  • 与 DROP的区别是,drop会直接扔掉,reject会通知对方自己扔掉了数据包
  • 一般都是使用 DROP
  • 执行完增加规则的命令后,使用 -nvL 查看filter规则信息
  • 如上图,input链所有规则,最下面增加了一条规则
  • 第三列是 DROP 表示这是 drop 规则
  • 后面是他 tcp 表示协议,然后是来源ip 和 目标ip
  • 最后是 来源端口 和 目标端口
  • 一般来说,增加规则后,新规则都会出现在原来规则的最下面,优先级是靠后的
  • 上图命令也可以增加规则
  • 参数 -I 是插入一条规则的意思, INPUT 是规则插入input链
  • 后面指定了 -p tcp 协议,还有 --dport 80
  • 指定端口,前面必须先指定协议,不然会报错
  • 最后是规则 -j DROP
  • 这条命令是把 目标地址端口号为 80 的数据包 drop掉
  • 如上图,插入的规则出现在所有规则的最上面
  • 如果是使用 -A 增加规则,新规则会出现在所有规则的最下面
  • 插入 -I 的意义就是可以把新规则插入到所有规则最上面,提高优先级
  • 一条链里面规则的执行顺序是从上到下的,会先执行上面的,一条一条往下执行
  • 所以 I 参数可以让新规则插入到最高优先级
  • 上图是删除命令,如果想删除刚才插入的规则
  • 把 -I 参数 换成 -D 参数 后面跟插入命令一模一样,就可以删除刚才插入的命令
  • 但是有一个问题,如果忘记了后面的命令怎么写,应该怎样删除旧的命令
  • 上图是显示规则编号的命令
  • iptables -nvL --line-number 可以多显示一列,num列
  • 参数 --line-number 可以显示规则的编号
  • 然后使用命令 iptables -D INPUT + 规则编号 就可以删除相应编号的规则
  • 如图,参数 -D表示删除,INPUT表示规则是input链的,7表示编号7的规则
  • 执行这条命令后,如图,编号7的规则就已经删除了

  • 如图所示,policy 是指默认的策略,后面接 ACCEPT
  • 说明,默认的规则就是 ACCEPT
  • 如果一条链上面没有设置任何规则
  • 那么通过这条链的数据包就会按照默认策略进行处理
  • 比如这里,默认策略是 ACCEPT ,如果没有设置规则的话,数据包都是直接通过的
  • 默认策略是可以更改的,上图命令 iptables -P OUTPUT DROP
  • 就可以把 OUTPUT链上的默认策略改为DROP
  • 参数 -P 就是设置 policy的意思,OUTPUT是指output链,DROP就是具体策略
  • 所以上面命令就是,设置 OUTPUT链的policy为 DROP
  • 如果是通过xshell远程连接,执行上面命令的话就会直接断线
  • 因为远程连接需要跟主机有数据包的往返操作
  • 这条命令把主机出来的数据包drop掉了,主机就没办法跟外界有交流
  • 如果执行了这条命令断线后,需要在主机的终端
  • 重新把默认策略修改为 ACCEPT 才能恢复远程连接
  • 所以,默认策略一般不用修改,都是保持 ACCEPT 状态
  • 需要拦截数据包就添加规则

iptables filter表小案例

  • 这个案例是把 80端口,21端口,22端口的数据放行
  • 22端口指定一个ip段,只有这个ip段才可以访问
  • 如上图,编辑一个iptables.sh文件
  • 在iptables.sh内输入上图内容

#!/bin/bash
ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT

  • 然后 wq 保存退出,这是一个脚本
  • /usr/sbin/iptables 是iptables命令的文件路径
  • 把这个文件赋值给了变量 ipt
  • 下面的命令,$ipt -F 就是执行了清空规则的命令
  • $ipt -P INPUT DROP 是把input链的策略修改为DROP
  • $ipt -P OUTPUT ACCEPT,$ipt -P FORWARD ACCEPT 就是把output和forward链的策略
  • 设置为 ACCEPT
  • $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  • input策略是DROP,这条命令是设置通过条件
  • 符合上面规则的数据包就可以通过
  • 参数 -m 是设置模块,模块指定为 state
  • 指定了state模块后,就可以使用 --state 指定状态
  • RELATED,ESTABLISHED 表示两个状态
  • 参数 -j 指定规则为 ACCEPT
  • 所以条件就是 状态为 RELATED,ESTABLISHED 的数据包可以通过
  • $ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
  • 上面命令是指定特定网段的数据才可以通过
  • 参数 -s 指定来源ip端口为 192.168.133.0/24
  • 参数 -p指定协议为 tcp
  • tcp的扩展模块 --dport 指定目标端口为 22
  • 所以来自于192.168.133.0/24 这个网段/端口的数据包,如果目标端口是22就可以通过
  • $ipt -A INPUT -p tcp --dport 80 -j ACCEPT
  • $ipt -A INPUT -p tcp --dport 21 -j ACCEPT
  • 以上两条命令是 目标端口为 80 或者 21 的数据包都可以通过
  • 也就是开放了80和21端口,向这两个端口发送数据就可以通过

  • 如图,sh 执行这个脚本
  • 如图,查看filter规则,可以看到,input链的规则已经变成脚本设置的规则了

  • 上图命令的作用是,使外部的机器无法 ping 通本机
  • 本机网络是通的,使用了这条规则后
  • 本机ping外面的ip是可以通的,外面的ip ping进来是无法ping通的
  • 但是本机网络却是通的,也就是说,这条命令就是让外面无法ping通本机
  • 不影响本机网络的使用
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!