linux 防火墙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 防火墙相关的知识,希望对你有一定的参考价值。

防火墙的概念

防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的 数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略


防火墙的分类

从逻辑上分为主机和网络防火墙

主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙一侧的局域网

从物理上分为硬件和软件防火墙

硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件

从osi协议分为网络层和应用层防火墙

网络层防火墙

  • 包过滤防火墙
  • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制 列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议 状态等因素,或他们的组合来确定是否允许该数据包通过
  • 优点:对用户来说透明,处理速度快且易于维护
  • 缺点:无法检查应用层数据,如病毒等

应用层防火墙/代理服务器

  • 将所有跨越防火墙的网络通信链路分为两段
  • 内外网用户的访问都是通过代理服务器上的“链接”来实现
  • 优点:在应用层对数据进行检查,比较安全
  • 缺点:增加防火墙的负载

现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用层去检查


防火墙的基本结构

防火墙的规则

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动 作作出处理

  1. 匹配条件:默认为与条件,同时满足
    基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
    扩展匹配:通过复杂高级功能匹配
  2. 处理动作:称为target,跳转目标
    内建处理动作:ACCEPT,DROP,REJECT,SNAT,MASQUERADE,,LOG...
    自定义处理动作:自定义chain,利用分类管理复杂情形

报文进入主机之后,流经的路径:
技术分享图片
由上图可以看出报文的流向:

  1. 流入本机:prerouting –> input –> 用户空间请求报文
  2. 流出本机:用户空间响应报文 –> output –> postrouting
  3. 由本机转发的:prerouting –> forward –> postrouting

规则要添加在链上,才生效;添加在自定义上不会自动生效

防火墙的链

防火墙的作用就是对经过的报文匹配规则,然后执行响应的动作,当报文经过这些"关卡"的时候,必须匹配"关卡"上的规则,但是关卡上有很多的规则,当我们把这些规则串到一条链上的时候,就形成了链,如下图所示
技术分享图片
链chain

  1. 内置链:POSTROUTING ,FORWARD,PREROUTING,INPUT,OUTPUT
  2. 自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有钩子调用自定义链时,才生效

防火墙的表

把具有相同规则的集合叫表
表的分类

  • filter 负责过滤功能,防火墙,内核模块 iptables_filter
  • nat :网路地址转换功能,内核模块 iptables_nat
  • mangle:拆解报文,做出修改,并重新封装,内核模块 iptables_mangle
  • raw :关闭nat表上启用的连接追踪机制,内核模块 iptanles_raw

所有的规则都是这四张表中的规则,也就是说,所有的规则都存在这四张表中

防火墙表与链的关系

链到表的对应关系

  • PREROUTING 存放于 raw mangle nat
  • INPUT 存放于 mangle filter nat(centos 7)
  • FORWARD 存放于 mangle filter
  • OUTPUT 存放于raw mangle nat filter
  • POSTROUTING 存放于mangle nat

表到链的对应关系

  • raw PREROUTING,OUTPUT
  • mangle PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  • nat PREROUTING,FORWARD,OUTPUT,POSTROUTING,INPUT(centos 7有)
  • filter INPUT,FORWARD,OUTPUT

数据经过防火墙的流程技术分享图片

红色箭头是表的执行顺序,蓝色箭头是数据流向


防火墙的处理动作

处理动作:(处理动作被称为target)
基本动作:

  • ACCEPT 允许数据包通过
  • DROP 直接丢弃数据包,不给任何回应信息
  • REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会受到拒绝的信息
  • SNAT  源地址转换,解决内网用户用同一个公网地址上网的问题
  • MASQUERADE 是SNAT的一种特殊形式,适用于动态的临时会变的IP上
  • DNAT 目标地址转换
  • REDIRECT 在本机做端口映射
  • LOG 在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录外以外不对数据包做任何其他操作,仍然让下一规则去匹配
    iptables -I INPUT -p tcp --dport 80 -j LOG --log-prefix "new connection:"

扩展动作:
–reject-with 后面跟参数


防火墙的模块

  1. icmp模块
    #实现自己可以ping其他人,其他人无法ping自己.icmp-type 8是请求icmp-type 0是回应
    iptables -A INPUT -p icmp -j REJECT
    iptables -A OUTPUT -p icmp -j REJECT
    iptables -I OUTPUT 1 -p icmp --icmp-type 8 -j ACCEPT
    iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT
  2. multiport模块
    #只同意接受某些端口
    iptables -R INPUT 1 -p tcp -m multiport --dport 21:23,80,53 -j ACCEPT
  3. iprange模块
    #只允许规定的网段IP访问
    iptables -I INPUT 1 -p tcp --dport 22 -m iprange --src-range 192.168.153.101-192.168.153.103 -j ACCEPT
  4. ipset模块
    #如果IP过多,可以加到一个集合里,通过控制集合来实现控制大量IP
    ipset create httplist hash:net maxelem 10000   #限制一个集合里的最大IP数
    ipset add httplist 192.168.153.101   #添加IP到集合里
    ipset --list   #查看集合里的IP
    iptables -I OUTPUT 1 -p tcp --sport 80 -m set --match-set httplist dst -j ACCEPT
    iptables -I INPUT 1 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT
  5. string&time模块
    iptables -I INPUT 1 -m string --algo bm --string "google" -j REJECT #限制路径里有"google"的请求
    iptables -R INPUT 1 -m time --timestart 7:00 --timestop 8:55 --weekdays Mon,Thu -m string --algo bm --string "baidu" -j REJECT  #每周的周一,周二的早7点到早8:55访问路径中有"baidu"的请求拒绝
  6. connlimit模块
    #控制访问并发树,即每个IP同时连接到一个服务器个数
    iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 1 -j REJECT
  7. limit模块
    #控制每分钟连接的个数为10,即6个只允许一个访问被回应
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 8 -j ACCEPT
  8. 状态跟踪
    下图为ftp的建立连接的过程
    技术分享图片
    如上图所示,服务端21号端口收到客户端的请求,这个状态是new(第一次建立连接的状态),然后服务端收到请求,开启随机端口Y,并且通过21号端口把开启的随机端口Y告诉客户端,让客户端访问这个端口,这个状态是ESTABLISHED,然后客户端就去访问服务端开启的端口,这个状态叫RELATED
    #
    modprobe nf_conntrack_ftp  #加载ftp的这个模块
    lsmod |grep nf_conntrack_ftp #查看是否加载模块
    iptables -I INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT  #这里的--state NEW可以不写,只是强调是否通过21号端口第一次简历端口
    iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT #让追踪服务器开启的这个Y端口 

网络防火墙

实验环境
host ip:192.168.153.7 ip: 10.10.10.7 两块网卡
inside ip:192.168.153.101
outside ip:10.10.10.102

  1. 在firewalld上开启ip转发
    [[email protected] ~]# vim /etc/sysctl.conf 
    net.ipv4.ip_forward = 1
    [[email protected] ~]# sysctl -p  #检查是否开启转发
    net.ipv4.ip_forward = 1
  2. 在inside增加路由
    [[email protected] ~]# route add default gw 192.168.153.7
  3. 在outside增加路由
    [[email protected] ~]# route add default gw 10.10.10.7
  4. 只允许inside ping outside 不允许outside ping inside
    #方法一
    [[email protected] ~]# iptables -A FORWARD -j REJECT
    [[email protected] ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp --icmp-type 8 -j ACCEPT
    [[email protected] ~]# iptables -I FORWARD -d 192.168.153.0/24 -s 10.0.0.0/8 -p icmp --icmp-type 0 -j ACCEPT
    #方法二
    [[email protected] ~]# iptables -A FORWARD -j REJECT
    [[email protected] ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp --icmp-type 8 -j ACCEPT
    [[email protected] ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
    #方法三
    [[email protected] ~]# iptables -A FORWARD -j REJECT
    [[email protected] ~]# iptables -I FORWARD -s 192.168.153.0/24 -d 10.0.0.0/8 -p icmp -m state --state NEW -j ACCEPT
    [[email protected] ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
  5. 实现SNAT
    [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.153.0/24 -j SNAT --to-source 172.18.254.96
    [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.153.0/24 -j MASQUERADE
  6. 实现DNAT
    #在inside开启httpd服务,开启9527端口
    [[email protected] ~]# iptables -t nat -A PREROUTING -d 172.18.254.96 -p tcp --dport 80 -j DNAT --to-destination 192.168.153.101:9527

以上是关于linux 防火墙的主要内容,如果未能解决你的问题,请参考以下文章

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

linux中怎么查看mysql数据库版本

Linux下单机安装部署kafka及代码实现

Linux中iptables防火墙指定端口范围

-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory(代码片段