一、什么是firewalld防火墙?

firewalld防火墙在Linux主机里其实就是一道隔离工具,它只对进出主机的请求做判断处理。也就是说它只管进出,至于你进来后做了什么,就不在firewalld的管辖范围了。firewalld工作与网络的边缘,它根据我们事先指定好的规则判断请求报文在不在规则之内,在的话,允许通过,不在,拒之门外,这就是firewalld。

二、那么firewalld有哪些规则呢?怎么设置防火墙规则呢?

说起有哪些规则?emmmm……这就不好说了,因为规则都是人来设置的,你想设置什么规则,就有什么规则(当然是在功能的允许范围内啦)。可以指定协议、端口、报文类型等来设置拒绝访问规则,如:DROP、REJECT(两者有点小不同,后面会具体说);也可以通过设置关键字来判定允不允许报文通过,当然,这些都得你理解了才能操作。

在操作之前,你还得知道firewalld可以在哪里通过什么方式添加规则,也就是firewalld的四表五链啦,那么就先说下五链吧,因为五链是包含在四表之内的,所以我们学习就由内向外开始吧。

五链
1、PREROUTING
数据包进入路由表之前(用于目标地址转换(DNAT)。)
2、INPUT
通过路由表后目的地为本机
3、FORWORD
通过路由表后,目的地不为本机
4、OUTPUT
由本机产生,向外转发
5、POSTROUTING
发送到网卡接口之前。(用于源地址转换(SNAT))

看到上面每个链的作用是不是一脸懵逼,完全不懂这是什么?哈哈,不要着急,我刚看到时也是一脸懵逼,不过学完后,我就更加懵逼啦,这究竟是什么鬼?完全颠覆了我的IT观,因为我所理解的设置位置完全和实际的设置位置不一样所以呢,emmmm,希望你不要带着自己的主观思想去学习理解firewalld规则设置,不然会很吃力。

呐呐呐,五链说完了,先不用管它是什么,有个概念就可以了,下面来看看四表:

四表
表是由链组成,来完成不同的功能,iptables中默认有4个表,以及默认包含的链
1、filter:一般的过滤功能
  filter 是用于存放所有与防火墙相关操作的默认表。
    INPUT
    FORWARD
    OUTPUT
  filter表有两种规则模式
    目标IP为本机IP的,启动本机防火墙规则,只经过INPUT链和OUTPUT链。
    目标IP为外网IP的,启动网络防火墙规则,经过INPUT链、FORWARD链和OUTPUT链。
2、nat:用于nat功能(端口映射,地址映射等)
    PREROUTING
    INPUT
    OUTPUT
    POSTROUTING
3、mangle:用于对特定数据包的修改
    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING
4、raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
    INPUT
    OUTPUT
    FORWARD

可以看到,每个表中都包含相对应的链,我们要做的操作是在链上进行,但是要先指明是在那个表的链上操作,每个表的功能又不一样,所以呢,我们要做的就是先搞明白每个表都有什么功能?这个表有哪些链?这些链又可以进行哪些操作,都搞明白了,就可以操作了!

是不是很迫不及待的想去主机上操作一把iptables?NO!NO!NO!现在还不行,因为你还不知道iptables有哪些命令,都是干嘛的这些命令,所以呢,下面我们就来看下iptables的命令。(呀,我是不是还没有说为什么我们要学习的是firewalld,现在怎么再说iptables呀,其实这个很简单,firewalld是基于内核的一个网络隔离工具,它的规则是靠iptables来调用和设置的,就和食物在锅里,你要用碗盛来吃一个道理。)

iptables命令
  命令格式:
    iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
选项含义
  链管理
    -N:new, 自定义一条新的规则链;
    -X: delete,删除自定义的规则链;删除需要同时满足下面三个条件
    1.引用计数为0
    2.没有规则的空链
    3.自定义的链
    -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
    ACCEPT:接受
    DROP:丢弃
    REJECT:拒绝
    -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
  查看
    -L:list, 列出指定鏈上的所有规则;下面是修饰L的几个选项,
    -n:numberic,以数字格式显示地址和端口号;
    -v:verbose,详细信息;
    -x:exactly,显示计数器结果的精确值;
    –line-numbers:显示规则的序号;
  规则管理
    -A:append,追加;
    -I:insert, 插入,要指明位置,省略时表示第一条;
    -D:delete,删除;
    (1) 指明规则序号;
    (2) 指明规则本身;
    -R:replace,替换指定链上的指定规则;
    -F:flush,清空指定的规则链;
    -Z:zero,置零;
  iptables的每条规则都有两个计数器:
    (1) 匹配到的报文的个数;
    (2) 匹配到的所有报文的大小之和;
  匹配条件
    基本匹配条件: 无需加载任何模块,由iptables/netfilter自行提供
    -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
    -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
    -p, --protocol protocol,指定协议,常用的有tcp,udp,icmp
    -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
    -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
  隐式扩展
    不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;--tcp
    --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
    --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
    --tcp-flags mask comp,其中mask是一个列表,可以是 SYN,ACK,FIN,RST,comp是mask列表中必须被设置为1的标志。例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,中SYN必须为1,余下的必须为0;
    --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
    不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;--udp
    --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
    --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
    不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;--icmp
    --icmp-type {type[/code]|typename}
  显式扩展
    必须使用-m选项指明要调用的扩展模块的扩展机制;
    multiport:以离散或连续的 方式定义多端口匹配条件,最多15个;这里最多15个指的是,比如20:25这样指定的话只算2个端口。而不是算6个端口。
    iprange:以连续地址块的方式来指明多IP地址匹配条件;
    --src-range from[-to]
    --dst-range from[-to]
    time:根据将报文到达的时间与指定的时间范围进行匹配,常用的选项
    --timestart hh:mm[:ss]
    --timestop hh:mm[:ss]
    --weekdays day[,day...]
    --monthdays day[,day...]
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --kerneltz:使用内核配置的时区而非默认的UTC;
    --string:对报文中的应用层数据做字符串模式匹配检测
    --algo {bm|kmp}:字符串匹配检测算法;
    --string pattern:要检测的字符串模式;
    --hex-string pattern:要检测的字符串模式,16进制格式;
    connlimit :根据每客户端IP做并发连接数数量匹配;
    --connlimit-upto n:连接的数量小于等于n时匹配;
    --connlimit-above n:连接的数量大于n时匹配;
  limit: 基于收发报文的速率做匹配
    --limit rate[/second|/minute|/hour|/day] ##最大速率
    --limit-burst number ##表示最大能接受多少个请求
    state:根据”连接追踪机制“去检查连接的状态;
    --state STATE
    conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
     - NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
    - ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
    - RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
    - INVALID:无效的连接;
    - UNTRACKED:未进行追踪的连接;
  处理动作
    ACCEPT:接受
    DROP:丢弃
    REJECT:拒绝
    RETURN:返回调用链
    REDIRECT:端口重定向
    LOG:记录日志
    MARK:做防火墙标记
    DNAT:目标地址转换
    SNAT:源地址转换
    MASQUERADE:地址伪装

哇,是不是看到上面那么多命令和选项,顿时一个脑袋两个大啦,其实我刚看到时也是望而却步,这么多???是在逗老子吗?本来就不怎么聪明的我,怎么能记住这么多???其实呀,那么多命令超过80%都是不常用的,你可以选择性的是记忆和整理,我做的全一点是因为以后如果遇到那个命令了,我也方便找到它,知道它什么意思,鬼知道未来那个大佬会写一个很牛批的服务,冷不丁的就用到了这个命令,而我不知道也找不到,多尴尬呀是不?闲话说了很多,下面就开始实操咯!!(怎么觉得有点小兴奋呢???)

案例实操

filter表
  iptables -F:清空所有策略
  iptables -X:清空自定义链(此步骤之前一定要先清空)
  iptables -N old_forward:自定义一个链
  iptables -E old_forward new_forward:修改自定义链的名字
  iptables -P FORWARD DROP:把filter中forward链的默认策略打成drop
  iptables -L -n --line-number:查看filter表中的策略并且显示行数
  iptables -t filter -D FORWARD 9:删除filter表中forward链中的第9条策略
  iptables -t filter -A INPUT -s 0.0.0.0/0 -d 192.168.254.24 -p icmp -j REJECT:限制所有主机(0.0.0.0)拒绝ping本主机
  iptables -t filter -A INPUT -d 192.168.254.24 -i ens33 -p icmp -j REJECT:显示所有主机(0.0.0.0)拒绝通过ens33网卡ping本主机
实操:
  开始操作之前,先:iptables -t filter -F和iptables -t filter -X 清空filter表的所有规则。(firewalld要是开启状态哦,你也可以看下开启后的默认规则:iptables  -t filter -L -n)
  禁止本机ping通:iptables -t filter -A INPUT -s 0.0.0.0/0 -d 虚拟机IP -p icmp -j REJECT(使用REJECT会显示连接不到端口)

            iptables -t filter -A INPUT -d 虚拟机IP  -p icmp -j DROP(会显示请求超时)

  可以看出REJECT是你的数据包来了,我收到了,但是我拒绝回复你;而DROP是我收没收到都不会告诉你,直接将数据包丢弃。

nat表
  #源地址为192.168.250.0网段的ip地址经过防火墙都转换成192.168.31.100这个ip地址(SNAT:源地址转换)
  iptables -t nat -A POSTROUTING -s 192.168.250.0/24  -d 192.168.250.0/24 -j SNAT --to-source 192.168.31.100
  #访问目标地址为192.168.31.200这个机器并且是tcp协议80号端口的都转发给192.168.250.1(DNAT目标地址转换)
  iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.250.1:80
  #访问目标地址为192.168.31.200这个机器并且是tcp协议80号端口的都转发给192.168.31.100的9999号端口(DNAT目标端口地址转换)
  iptables -t nat -A PREROUTING -d 192.168.31.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.31.100:9999
实操:
  开始操作之前,先:iptables -t nat -F iptables -t nat -X 清空nat表的所有规则。需要开三台虚拟机,分别为s1、s2、s3,其中s1是访问端,s2是防火墙端,s3是服务端。
  s1设置:IP 192.168.27.5/24 网关:192.168.27.1 网络防火墙关闭状态。
  s2设置:ens33 IP 192.168.27.1/24 ens37 IP 112.112.112.1/24 网关等都不要,网络防火墙开启。(两个网卡)
  s3设置:IP 112.112.112.10/24 网关 112.112.112.1 防火墙关闭状态。下载httpd服务,写入index.html文件内容。
  此时在s2:echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由转发功能,此时在s1 ping s2可以ping通。
  在s1用:curl 112.112.112.10 可以看到在index.html写入的内容,在s3端:tailf /var/log/httpd/access_log 可以看到s1的IP成功访问。
  回到s2添加原地址转换规则:iptables -t nat -A POSTROUTING -s 192.168.27.5 -d 112.112.112.10 -j SNAT --to-source 112.112.112.1
  在s1用:curl 112.112.112.10 可以看到在index.html写入的内容,在s3端:tailf /var/log/httpd/access_log 可以看到112.112.112.1 IP成功访问。
  在s1端下载httpd服务并在/var/www/html下写入index.html文件。
  在s2添加目标地址转换规则:iptables -t nat -A PREROUTING -s 112.112.112.10 -d 112.112.112.1 -j DNAT --to-destination 192.168.27.5
  此时在s3:curl 112.112.112.1 可以看到s1 index.html的内容,查看s1的日志会发现是112.112.112.10成功访问。
  在s2添加端口转换规则:iptables -t nat -I PREROUTING -d 112.112.112.1 -p tcp --dport 80 -j DNAT --to-destination 112.112.112.10:80
  此时在s3查看日志会看到是192.168.27.5成功访问。(上一步的端口可以更换成别的没有被占用的,同样生效)

嗯!因为我们在实际工作过程中,用到raw表和mangle表的机会实在是太少了,包括我现在也没有遇到要在这两个表上设置规则的情况,所以我也没有研究怎么在这两个表上设置规则,等哪天我闲了,要就下再回来补上哈。另外我是在虚拟机上进行的实操实验,不敢再主机上搞呀,万一操作失误,那就是“切腹谢罪”的事情,所以也建议小伙伴在虚拟机上实验下,确定没问题了再拿去主机上执行,安全第一!

操作基本就那么多了,下面我们说点别的!
firewalld优先级
  策略应用优先级:raw, mangle, nat, filter
  策略常用优先级:filter,nat,mangle,raw

iptables数据包走向
  1. 数据包到达网络接口,比如 ens33。
  2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
  3. 如果进行了连接跟踪,在此处理。
  4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
  5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
  6. 决定路由,看是交给本地主机还是转发给其它主机。

2019年11月更新:

前两天想到iptables和firewalld好像还有一个不兼容的情况,因为我来到公司使用的一直是iptables,没有开启过firewalld,所以在9月写这篇文章时没有写上,现在是11月了,补上哈。下面我们就来说说iptables和firewalld的生死纠葛:

我们知道firewalld是centos7默认的网络防火墙,7以前的系统好像都是iptables,我开始接触的就是7系统,所以要是说错了还请勿怪哈。那么要想在7上使用iptables的话就需要下载iptables-service了,注意,不是下载iptables,必须是iptables-service。

假设场景:现在firewalld是开启状态,我下载了iptables-service,使用命令如下:

  1,systemctl start firewalld

  2、yum install iptables-service

  3、systemctl start iptables

此时查看状态:

  1、systemctl  status  iptables

  2、再查看firewalld状态:systemctl  status firewalld

  3、我们再开启firewalld:systemctl restart firewalld

   4、再查看iptables状态:systemctl status iptables

通过上面的实验,已经证实,iptables和firewalld确实是一山不容二虎,那么具体firewalld和iptables的本质区别又是什么?我是用iptables和使用firewalld有什么区别呢?最理解不了是还是iptables还特么是管理firewalld的工具,看到这的你肯定很懵,没错,我也很懵,等到我啥时候搞清楚了再来更新这问题,有兴趣的小伙伴可以实验下,要是知道区别的大神还请留言指导下,一起学习,共同进步!

嗯!!!

经过差不多半小时的摸索,终于发现firewalld和iptables的区别之处,那么,下面我就分享下心得,希望对正在使用防火墙的小伙伴有所帮助:

先从firewalld开始说:iptables可以作为工具管理firewalld,也就是说我们在firewalld开启的状态下,可以同过iptables命令添加防火墙规则,但是一条命令,就是一个规则,玩firewalld的小伙伴应该清楚,给firewalld添加iptables规则,每一条命令都挺长的,选项还多,单词需要背,我就是很头疼这个。

另外我们在规则的保存方面,通常是使用命令:iptables-save > filename  将现在的防火墙规则导出来保存到一个文件里:

相当于把当前防火墙规则做了一次备份,当我们把防火墙规则搞得自己都不清楚有哪些规则时,就可以通过命令:iptables-restore < filename  恢复备份的防火墙规则。但是在添加和删除规则方面还是很费劲。那么有没有添加规则简单点的方式呢?之前可能不知道,现在可以告诉你,有的,下面我们来说说是什么方式可以做到。

那就是iptables-service,没错,就是它,下面我来详细说说它的强大之处:

  1、保存当前防火墙状态到指定文件,通过编辑文件来修改规则,退出编辑重启iptables生效。

  2、一样支持保存防火墙当前状态,作为备份和恢复

我想这两点足以说明iptables比firewalld的强大之处了,我最喜欢的还是那个编辑文件重启iptables生效,这个功能实在是太好了,结合部署脚本使用,只要用得好,比写一长串命令轻松太多了。嗯,那就说到这吧,希望能够对正在玩防火墙的小伙伴有所帮助,欢迎留言交流心得,开源、共享才能使技术进步,加油!!!

设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)的更多相关文章

  1. Windows下 使用命令行的方式 设置主机的ip地址. 以及设置多ip地址的方法

    1. 首先要查看一下网卡的设备名称 netsh interface ip show interfaces 结果为: 记住当前的网卡名称 进行后续操作. 其实 也可以通过 ipconfig /all 的 ...

  2. iptables(三)iptables规则管理(增、删、改)

    上一篇文章中,我们已经学会了怎样使用iptables命令查看规则,那么这篇文章我们就来总结一下,怎样管理规则. 之前,我们把查看iptables规则的操作比作"增删改查"当中的&q ...

  3. iptables详解(3):iptables规则管理

    所属分类:IPtables  Linux基础 在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下 iptab ...

  4. CentOS系统IPTables防火墙中FTP规则设置

    时间 2016-04-21 10:32:15  虫虫开源 原文  http://www.sijitao.net/2403.html 主题 iptablesFTP防火墙 在设置ftp通过iptables ...

  5. Linux防火墙iptables规则设置(转)

    iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分.可以直接配置,也可以通过许多前端和图形界面配置. 一.语法 iptables(选项)(参数) 二.选项 -t< ...

  6. linux系统中查看己设置iptables规则

    1.iptables -L 查看filter表的iptables规则,包括所有的链.filter表包含INPUT.OUTPUT.FORWARD三个规则链. 说明:-L是--list的简写,作用是列出规 ...

  7. ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则

    ifconfig 命令用于查看网络相关的命令: 安装:yum install net-tools -y  ifdown  eth_name  关闭网卡  ifup  eth_name   开启网卡 配 ...

  8. (转)设置Win7防火墙规则 顺畅访问局域网

    在Windows 7系统的电脑上搭建WAMP环境后,发现在局域网中其他电脑不能访问.有朋友告诉小强,这可能是因为当时Windows 7自带的防火墙屏蔽了80端口,只需要重新设置规则就可以了. 点击Wi ...

  9. iptables/mysql设置指定主机访问指定端口

    本周,运维告知部署的服务被扫描发现漏洞,涉及的软件分别为mysql,ZooKeeper与Elasticsearch. 因为最近任务繁重,人力资源紧张,因此无法抽出更多时间调整代码,添加权限认证. 与软 ...

随机推荐

  1. location对象方法(assign()、reload()、replace())

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 题解 [51nod1340]地铁环线

    题解 [51nod1340]地铁环线 题面 解析 本文参考这篇博客 一开始看到只有120行就打算写一写, 结果一刚就是三个星期摆摆摆 本来是当查分约束入门学的. step 1 首先来考虑下如果已知总长 ...

  3. linux系列(十六):which命令

    1.命令格式: which 可执行文件名称 2.命令功能: which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果. 3.命令参数: -n 指定文件名长度,指定的长 ...

  4. Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法

    面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...

  5. ansible 交互提示、tags和block

    1.交互提示:使用关键字:vars_prompt 例:使用ansible的交互式功能创建用户和给定一个密码. --- - hosts: test50 remote_user: root vars_pr ...

  6. [RK3399] Jack server installation not found

    CPU:RK3399 系统:Android 7.1 服务器上第一次编译 Android 7.1 的代码,提示 Jack server 没有安装. Jack server installation no ...

  7. sublime的一些常用快捷键总结

    下面是四种快捷键类型: 1.编辑类 Ctrl+J 合并选中的多行代码为一行.举个例子:将多行格式的CSS属性合并为一行.Ctrl+Shift+D 复制光标所在整行,插入到下一行.Tab 向右缩进.Sh ...

  8. 关于Vmvare虚拟机中Linux系统不能全屏的问题

    安装虚拟机后并加载ubuntu后,发现界面一直是正方形的,真是神了. 但是当时沉迷学习,这点小细节并没有什么影响,就没有管它. 嗯.... 现在,为了追求完美,是时候让它全屏了,可无论怎样搞,怎样百度 ...

  9. IIS URL Rewriting and ASP.NET Routing

    IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...

  10. python pip 安装插件权限问题及 指定pip国内镜像源