您的位置:首页 > 运维架构 > Linux

防火墙iptables原理及简单应用

2017-10-31 09:44 295 查看
网络安全技术网络上的安全技术有以下几种:入侵检测与管理系统(Intrusion Detection Systems):检查监督,提供报告,事后监督,并提出解决措施。一般采用旁路部署,即局域网外设置监听。入侵防御系统(Intrusion Prevention System):分析数据包存在的问题并根据问题采取相应措施,主动保护网络安全。一般采用在线部署,多用于网络。防火墙(FireWall):设定规则,并根据规则只开放允许访问的相关服务及组件
其中防火墙可有以下分类:服务范围:主机防火墙(仅约束本机)、网络防火墙(控制管理整个局域网)基于架构:硬件防火墙(电子设备,如下)、软件防火墙(360,iptables)



工作层次:网络层防火墙、应用层防火墙或代理服务器(代理网关)(表现为对数据内容的控制,如木马查杀,屏蔽关键字搜索)。
网络层防火墙对IP层数据来源等进行控制,表现为控制IP的访问。网络防火墙根据系统设置的过滤逻辑规则,检查数据流中的每个数据的源地址,目的地址,端口号和协议等元素,或他们的组合能否通过。由于是软件,有易于维护的特定,但是无法检测数据包内数据内容,病毒和木马之类无法过滤。应用层防火墙/代理服务型防火墙(Proxy Service),是对数据帧的内容进行过滤。由于对接收的数据信息直接过滤,极大提高了数据安全性。但因为数据访问都需经过此防火墙,访问速度和性能都会受到影响。现实生产中所用防火墙一般都是二者结合体,即先检查网络数据,通过后再送去应用层检查。对企业而言,数据安全当然尤为重要。只为性能的话就不会有防火墙这一概念了。心有猛虎轻嗅蔷薇,该安全的时候安全,该性能的时候性能,这就是运维要做的了。
硬件防火墙内部也是基于软件防火墙的逻辑。下面阿拉就进入正题,开始说我们这次的主体——CentOS6上的防火墙。CentOS7的firewall也会提及。不过6上的命令关于底层原理涉及较多,阿拉就借花献佛,把刚学的知识呈现给你。错误的地方还望指正。Netfilter与四表五链Netfilter是一个抽象的通用框架,他提供了一套hook函数管理机制来对网络进行管理。iptables是个用户空间的管理控制工具。而真正执行工作的则在内核空间,内核空间选取五个位置放了五个hook(勾子)function(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING),五个hook function向用户开放,用户通过iptables工具写入规则。这五个hook函数对应iptables的五个同名链。链呢,就是一堆规则的集合。我们通过iptables写的若干规则给分成五个部分,即这里的五条链。iptables的五条链和五个hook函数虽然工作层次不同(前者在可以看到的用户空间,后者在内部运行的底层架构里),但二者有所关联,前者影响后者。接下来的讲解对二者不再做具体的分类,看官大人心中分清楚就好了。
五个勾子的分布如图:



PREROUTING位于数据在进入主机前。数据进入主机后分两种,一种是目的地是本主机的,另一种是目的地非本主机的。路由转发还记得吗?路由器在接收到目的地非自己网段的数据包后会把数据包转发给下一个路由,是本网段的就转发到对应IP的主机上。哪些包转发,哪些包丢弃,这个,就是FORWARD。哈哈,FORWARD多用在公网IP和私有IP的转发上了。一个局域网有一个公网IP,一般是代理服务器。配置局域网可访问外网,外网不能主动访问内网会用到FORWARD。当然,这也是为了安全和便利。前面说到有目的地是本主机的数据包。如果你不想别人访问你的某个程序,这里就可以加以控制了。在INPUT这里。当然你想对自己访问别人的数据包加以控制的话,可以在本机出去的路径OUTPUT上做手脚,嘛,一般情况没人会对自己要发出去的包进行约束了。嘿,别笑。有时候也许真的会这么设置。不然这个功能就不会出现在这里了。用途嘛,哈哈,至少不想别人用你的通信的时候就用到了。POSTROUTING是对所有本机发出的数据包的控制了。包括本机的应用程序发出的和转发的包。
除此之外,关于防火墙还有个不得不说的概念——四表。iptables由四表五链及相关规则组成。信息过滤表table里,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上。规则是成员,链是身份,而table则是部门。这么说其实挺迷。举个栗子——银魂里的小猿在《幻界战线》里是一个叫珍·皇的经常站在电线杆上的长腿姐姐。珍是狼人。直属狼人部队。当然这个部队里的家伙都是狼人。同时珍是莱布拉的成员。莱布拉里面很多成员都和珍一样有着其他身份(但是其他人的背景很难猜>_<)。这样再看规则,链与表,懂了吗?四个表table分别是:filter、nat、mangle、raw。filter表是过滤规则表,根据预定义的规则过滤符合条件的数据包。nat表(network address translation)是地址转换规则表。mangle表即修改数据标记位规则表。 Raw表里设置关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度。这里有位仁兄写的很棒,引用如下:

原文链接:http://forangela.blog.51cto.com/9680035/1720377我们最常使用的是filter表了。这个表也是默认。基本上的过滤规则都在里面。nat表代理服务器会用到,还可以用来伪造个包啦哈哈。其他的两个表,平常都是用不到的。四个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter。嘛,越不常用的优先级越高。filter表是看大门的,nat是扫地僧,低调着招摇,哈哈。mangle是方丈,平常负责讲个话,端个架子,偶尔指挥些什么。raw是藏经阁里看场子的,偶尔出大事了才会露个脸。没错,天龙八部的少林寺真是藏龙卧虎。然而平常看个虚竹就很开心啦。
表和链有相应的对应关系。这个怎么说呢?有一定的需求和功能实现成份吧。画水彩需要笔刷,颜料盘和颜料,画油画也需要笔刷和颜料,画国画只要毛笔和墨水就足够了,啊对,还有宣纸。raw与跟追相关,所以数据包进来的链就不需要,两个出去的链足够。mangle牵扯到的面比较广,所以几个链都会涉及。nat是地址、端口转换,本身就有转发的意思,这里FORWARD就用不到了。fifter是设置过滤规则,若是一股脑的把进来和出去的所有包都做过滤,那样还不如直接关了服务或断开网络的便捷。顺便,其实可以用防火墙实现过滤所有的功能,测试环境用用还是不错的。filter里三条链可以实现各种自定义的过滤规则哦。这也是防火墙的精髓哦。


Iptables
也是时候交代这个超好用的工具的真正用法了。这个工具并不难用。不信?来,我们看一个例子。iptables -A INPUT -s 192.168.37.105 -j ACCEPT-A是addend,追加规则,默认会放到现有规则的最下面,越往下意味着优先级越低哦。-s是source,指明源地址。-j是jump,即数据包与前面的条件匹配使,该跳到怎样的动作上。accept就是允许通过了。这条规则没指明table,那就是放到默认的filter表里。没有跟端口或服务就是代表所有应用了。那么这条规则的意思就是,允许192.168.37.105的IP进入本机的所有应用服务。
记好这一条规则哦。然后在做iptables的实验之前,把上述规则里的IP地址换为连接你的当前主机的IP,然后执行吧。记得是连接你主机的IP哦,用w查看到的IP。不是现在主机的IP。屏幕前的你,一定懂我在说什么的吧!还有就是,怎么开启服务的就不用阿拉多嘴了吧。
啊啊算了,已经多嘴很多次了也不差这点。总之先查看下服务是否开启吧。CentOS6使用service iptables status 查看服务运行状态。有列表就是在运行哦。CentOS7使用systemctl is-enabled firewalld或者systemctl status firewalld 查看防火墙是否开启。开启方式嘛,把上面的status换成start就可以了,当然,关闭则是stop。再顺便说下服务重新开机自启动的设置好了。centos6里chkconfig iptables on设开机自启动,关闭开机自启动为chkconfig iptables off。CentOS7里systemctl enable firewalld设为开机自启动, systemctl disabled firewalld则关闭开机自启动。
下面是命令的完整介绍。iptables命令用法可参考man iptables。
格式:iptables [-t table] subcommand chain [-m matchname [ per-match-options]] -j targetname [per-target-options]-t table,后跟raw, mangle, nat, filter之类的表名。默认为filter,也只有跟的表是filter时可以不写表名哦。chain为链。我们上面用的-A INPUT就是指定链。-m 使用扩展模块,使用-m可以扩展很多功能哦,如时间的控制。而子命令submmand更多是关于链的操作。哪尼,对链的操作才简单呢。
阿拉好像还没有说过五链是系统提供的五链,而链,我们是可以自己创建的。防火墙起到主要作用的若干规则,单条管理太过麻烦。那么我们可以按功能分类,把相应规则放到自定义的集合里。如何实现呢?那就建一条新链好了。如果什么时候这条链子不想要了呢?想删除或者想对他放置play呢?哈哈。这里就有链的管理命令。-N:new,即自定义一条新的规则链。
-X:delete,删除自定义的空的规则链。-P:Policy,设置默认策略。对filter表中的链而言,其默认策略有:ACCEPT:接受,DROP:丢弃。-E:重命名自定义链。只有空链才能被重命名和删除哦。为了方便实验,咱们再来看下查看各表的几个小选项(用的很多哟

)-L:list, 列出指定链上的所有规则。本选项须置后,否则会报错。-n:numbe,以数字格式显示IP地址和端口号。-v:verbose,详细信息。-vv 更详细。-x:exactly,显示精确值。--line-numbers:显示规则的序号。序号和优先级的关联,使得这个命令也超级——常用哦。嘛,tab键一下就补出了不用太用力记忆的————燃鹅CentOS6里tab键有没有那么好用用过的攻城狮都知道。阿拉不是说iptables的自选项tab补不出来,真的。大不了我们还有help和man嘛……喂,为什么如此简单的一个命令我要说这么多,阿拉才不是被某些命令唤起了惨不忍睹的记忆!木有!下面是常用组合:iptables -vnL [-t table](不写-t就是fitler)查看表内规则iptables -vvnxL --line-numbers 显示详细表内规则及规则标号(简单查看规则编号只需去掉vx)
阿拉还是先举例子吧。
[root@CentOS6 ~]# 创建新链
[root@CentOS6 ~]# iptables -N account
[root@CentOS6 ~]# w
18:01:00 up  8:07,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.234.2    15:29    0.00s  2.42s  0.04s w
[root@CentOS6 ~]# 放行自己
[root@CentOS6 ~]# iptables -A INPUT -s 192.168.234.2 -j ACCEPT
[root@CentOS6 ~]# 链内添加规则
[root@CentOS6 ~]# iptables -A account -s 192.168.234.105,192.168.234.107 -j ACCEPT
[root@CentOS6 ~]# 拒绝所有
[root@CentOS6 ~]# iptables -A INPUT -j REJECT
[root@CentOS6 ~]# 讲account链放在第二条规则上。I是insert,插入
[root@CentOS6 ~]# iptables -I INPUT 2 -j account
[root@CentOS6 ~]# 向account链内追加规则
[root@CentOS6 ~]# iptables -A account -s 192.168.234.17 -j ACCEPT
[root@CentOS6 ~]# 查看filter表内所有内容
[root@CentOS6 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      511 49656 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
2      923  111K account    all  --  *      *       0.0.0.0/0            0.0.0.0/0
3      969  116K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 5 packets, 760 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain account (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      *       192.168.234.105      0.0.0.0/0
2        0     0 ACCEPT     all  --  *      *       192.168.234.107      0.0.0.0/0
3        0     0 ACCEPT     all  --  *      *       192.168.234.17       0.0.0.0/0
[root@CentOS6 ~]#
接下来就可以测试了。

插入一个小知识点吧。我们可以把防火墙规则保存成文件,批量管理机器时可以把一份规则导入众多主机或者某日规则不小心删除后拿来还原。嘿嘿。
iptables-save 保存规则。后面跟-t 加表名还可以指定保存哪个表。默认filter。iptables-restore 还原防火墙规则。以上需要配合重定向使用。如下:
[root@CentOS6 ~]# 防火墙规则导出成文件
[root@CentOS6 ~]# iptables-save > a.txt
[root@CentOS6 ~]# -F:flush。清空现有规则
[root@CentOS6 ~]# iptables -F
[root@CentOS6 ~]# 查看防火墙规则
[root@CentOS6 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 22 packets, 3341 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 7 packets, 984 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain account (0 references)
pkts bytes target     prot opt in     out     source               destination
[root@CentOS6 ~]# 还原防火墙规则
[root@CentOS6 ~]# iptables-restore < a.txt
[root@CentOS6 ~]# 再次查看规则。恢复成功
[root@CentOS6 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
6   528 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
2   406 account    all  --  *      *       0.0.0.0/0            0.0.0.0/0
2   406 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 5 packets, 744 bytes)
pkts bytes target     prot opt in     out     source               destination
Chain account (1 references)
pkts bytes target     prot opt in     out     source               destination
0     0 ACCEPT     all  --  *      *       192.168.234.105      0.0.0.0/0
0     0 ACCEPT     all  --  *      *       192.168.234.107      0.0.0.0/0
0     0 ACCEPT     all  --  *      *       192.168.234.17       0.0.0.0/0
这个功能还可通过service iptables save 实现。
完事之后如果我们不想这条链了怎么办?上面-F是把规则清空,可明显account链还在。嘿嘿。阿拉这就为您展现删除链的神操作。
[root@CentOS6 ~]# 查看现有规则及序号
[root@CentOS6 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       42  3792 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
2     1769  219K account    all  --  *      *       0.0.0.0/0            0.0.0.0/0
3     1757  218K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 36 packets, 5432 bytes)
num   pkts bytes target     prot opt in     out     source               destination
Chain account (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      *       192.168.234.105      0.0.0.0/0
2       12   982 ACCEPT     all  --  *      *       192.168.234.107      0.0.0.0/0
3        0     0 ACCEPT     all  --  *      *       192.168.234.17       0.0.0.0/0
[root@CentOS6 ~]# -D:delete。删除第二条规则
[root@CentOS6 ~]# iptables -D INPUT 2
[root@CentOS6 ~]# 清空account链
[root@CentOS6 ~]# iptables -F account
[root@CentOS6 ~]# 查看
[root@CentOS6 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
134 12572 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
1932  240K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 17 packets, 2376 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain account (0 references)
pkts bytes target     prot opt in     out     source               destination
[root@CentOS6 ~]# 清空规则表
[root@CentOS6 ~]# iptables -F
[root@CentOS6 ~]# 查看。嗯,链还在。。咳咳,阿拉是为了展示进行步骤,才不是翻车呢!
[root@CentOS6 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 15 packets, 1595 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 4 packets, 576 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain account (0 references)
pkts bytes target     prot opt in     out     source               destination
[root@CentOS6 ~]# 删除链
[root@CentOS6 ~]# iptables -X account
[root@CentOS6 ~]# 再次查看。删除成功,哦耶。
[root@CentOS6 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 20 packets, 1850 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3 packets, 472 bytes)
pkts bytes target     prot opt in     out     source               destination


规则管理相关的命令上面差不多都提到了。-A:append,追加。-I:insert, 插入,要指明插入至的规则编号。不写编号则默认为第一条。-D:delete,删除。需指明规则序号或规则本身-F:flush,清空指定的规则链
另外还有以下。-R:replace,替换指定链上的指定规则编号。-Z:zero,置零。iptables的每条规则都有两个计数器,分别计算匹配到的报文的个数和匹配到的所有报文的大小之和。此项为把这两个计数器的值清空。看示例说话。
[root@CentOS6 ~]# 还原
[root@CentOS6 ~]# iptables-restore < a.txt
[root@CentOS6 ~]# 查看
[root@CentOS6 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      115 10744 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
2      556 70898 account    all  --  *      *       0.0.0.0/0            0.0.0.0/0
3      551 70459 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 77 packets, 12208 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain account (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      *       192.168.234.105      0.0.0.0/0
2        5   439 ACCEPT     all  --  *      *       192.168.234.107      0.0.0.0/0
3        0     0 ACCEPT     all  --  *      *       192.168.234.17       0.0.0.0/0
[root@CentOS6 ~]# 清空数值。注意第二行pkts和bytes列数值。
[root@CentOS6 ~]# iptables -Z
[root@CentOS6 ~]# 实时通信的原因,两项又很快有了新的数据
[root@CentOS6 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        6   528 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
2        1    78 account    all  --  *      *       0.0.0.0/0            0.0.0.0/0
3        1    78 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 4 packets, 592 bytes)
num   pkts bytes target     prot opt in     out     source               destination
Chain account (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      *       192.168.234.105      0.0.0.0/0
2        0     0 ACCEPT     all  --  *      *       192.168.234.107      0.0.0.0/0
3        0     0 ACCEPT     all  --  *      *       192.168.234.17       0.0.0.0/0
[root@CentOS6 ~]# 修改第三条规则
[root@CentOS6 ~]# iptables -R INPUT 3 -s 192.168.234.0/24 -j REJECT
[root@CentOS6 ~]# 查看。已生效
[root@CentOS6 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 10 packets, 780 bytes)
pkts bytes target     prot opt in     out     source               destination
127 11896 ACCEPT     all  --  *      *       192.168.234.2        0.0.0.0/0
607 83658 account    all  --  *      *       0.0.0.0/0            0.0.0.0/0
0     0 REJECT     all  --  *      *       192.168.234.0/24     0.0.0.0/0           reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 19 packets, 2760 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain account (1 references)
pkts bytes target     prot opt in     out     source               destination
0     0 ACCEPT     all  --  *      *       192.168.234.105      0.0.0.0/0
0     0 ACCEPT     all  --  *      *       192.168.234.107      0.0.0.0/0
0     0 ACCEPT     all  --  *      *       192.168.234.17       0.0.0.0/0
[root@CentOS6 ~]#


嗯。还记得第三条规则被我们修改之前是什么样子吗?这个拒绝所有的也叫默认规则哦。iptables本来默认是全部放行的。下面的规则一写,默认就倒了个个了。稍微注意哦。记得默认规则最好放在最后。这样前面的规则才可以保证都有生效。
iptables -A INPUT -j REJECT
同时。上面的例子里的一些阿拉再列一下。
支持网段
[root@CentOS6 ~]# iptables -R INPUT 3 -s 192.168.234.0/24 -j REJECT
支持多个IP
iptables -A account -s 192.168.234.105,192.168.234.107 -j ACCEPT

哈哈,是不是觉得自己掌握的差不多啦!
嘛,嘛,那就奖励自己一下下。毕竟,接下来还有更好玩的呢!什么?你以为结束了?喂喂,iptables要是就这点本事哪够资格称为神器啊。(iptables懵逼脸:我是神器???阿拉:啊,你不知道啊?好巧啊,我也不知道呢!)其实这个评价来自于阿拉每周一三五中午都听不了歌的怨念。之前阿拉不清楚为什么,然而阿拉的班级学习了防火墙之后,本来中午开着门的机房现在都记得锁门了。可恶的万恶之门。总而言之还是冷静下来写博客吧,趁着现在有网。
iptables可以根据服务类型和端口进行更精确的控制。我们的服务器。随时能ping通,然鹅,我们通过服务器上不了网。大概是开放了icmp服务的原因。#为什么说大概?iptables有基本匹配和扩展匹配。扩展匹配需加载模块,也就是说,iptables的功能还有继续扩展的可能。指不定哪个大神嫌功能不够用了就会有新模块诞生了。啧啧,真是可怕。学越多越觉着自己贫瘠。真是人外有人天外有天啊。基本匹配无需加载模块。我们知道-s指源地址,对应的-d:destination指目标地址。配合下列选项iptables可实现基本匹配。-p:protocol 指定协议,可使用数字如0(all)。使用-p指定协议的方式也称为隐式扩展
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,mh or “all“ 。更多请查看:/etc/protocols后跟--dport指源端口(本机), --sport指目标端口。端口可以用:连接表范围。-i,对应长选项--in-interface:指数据流入的网卡。只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链。-o,对应长选项--out-interface :报文流出的网卡。只能应用于数据报文流出的环节。选项前加 ! 的意思表取反,不匹配。
用法示例:iptables -A INPUT -s 192.168.234.105 -p tcp --dport 22 -j REJECT 拒绝192.168.234.105的tcp协议的22端口。对应的是ssh,也就是拒绝105通过ssh连接到本机。iptables -A INPUT -s 192.168.234.105 -p icmp -j REJECT 禁105的pingiptables -A INPUT -s 192.168.234.105,172.17.0.106 -i eth0 -j REJECT 拒绝两Ip从eth0网卡进来iptables -A INPUT -s 192.168.234.107 -p tcp --dport 22:25 -j REJECT :表示范围,22:25是从22到25端口。此规则表示拒绝107访问22到25端口。dport是目标端口,在此指本主机的端口。因为是拒绝107主动访问本机,所以目标端口为本机的22到25端口。iptables -A INPUT -s 192.168.234.107 -p tcp --dport 80 -j REJECT 拒绝107访问本机httpd服务。
-p还可以用以下方式进一步精确匹配。--tcp-flags mask comp 标记位 mask指SYN,ACK,FIN,RST等标记位,多个用,隔开 comp指在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔-p tcp --tcp-flags SYN,ACK,FIN,RST SYN 等同于--syn 匹配第一次通讯的包(第一次握手)iptables -A INPUT -s 192.168.234.107 -p tcp --tcp-flags SYN,ACK SYN -j REJECT 已连接的不中断,新连接的拒绝iptables -A 192.168.37.107 -p icmp --icmp-type 8 -j REJECT 拒绝107的icmp请求包,净ping,但能ping对方。这里的8指请求包,0则指应答。本机地址放行和禁行也可用以下方式实现。iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
下面就是扩展模块实现的匹配了。对应我们上面提及的-m matchname。显式扩展:-m 模块名man iptables-extensions 扩展用法帮助(CentOS7用。centos6里相关命令集中在man iptables里)1.multiport 离散多端口匹配iptables -A INPUT -s 192.168.234.107 -p tcp -m multiport --dports 22:25,80 -j REJECT samba配置放行 iptables -A INPUT -s 192.168.234.2 -j ACCEPT 自身放行 iptables -A INPUT -j REJECT iptables -I INPUT 2 192.168.37.101 -p tcp -m --multiport --dports 445,139 -j ACCEPT iptables -I INPUT 2 192.168.37.101 -p udp -m --multiport --dports 137:138 -j ACCEPT iptables -vnL --line-numbers2.iprange 连续Ip地址段范围匹配iptables -A INPUT -s 192.168.37.2 -j ACCEPT iptables -A INPUT -m iprange --src-range 192.168.37.105-192.168.37.107 -j RECECT3.mac 硬件地址匹配。需知道对方mac地址iptables -A INPUT -m mac --mac-source 00:0c:29:13:d6:94 -j REJECTiptables -A INPUT -s 172.16.0.100 -j REJECT 注意先后顺序造成的优先级4.string 字符串匹配iptables -A OUTPUT -m string --algo bm --string "google" -j REJECT 知道我们为什么不能访问google这个邪恶网站了吗iptables -F OUTPUT 只清空output表5.time 时间匹配iptables -A INPUT -m time --weekdays 1,2,3,4,5 --timestart 09:00 --timestop 18:00 [--kerneltz] -j RECECT 周一至周五的9点到18点禁止所有主机访问本机。真是不由得想到阿拉一三五不能上网的痛苦时光。centos7默认为Utc时间,注意。加--kerneltz选项并没有卵用,可以自己再原时间上减去8个小时所以正确的规则应该这么写:iptables -A INPUT -m time --weekdays 1,2,3,4,5 --timestart 01:00 --timestop 10:00 [--kerneltz] -j RECECT 6.connlimit 每个Ip的并发连接数匹配iptables -A INPUT -m connlinmit --connlimit-above 2 -j REJECT 每IP并发连接数超过两个时拒绝7.limit扩展 收发包的速度匹配iptables -I INPUT -s 192.168.234.107 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT 一分钟最多接收3个ping包iptables -I INPUT 2 -p icmp -j REJECT这个不大容易看出来。阿拉测试的时候是ping了超过5个包后,每20个包ping通一个。最后根据总共时间,换算成分钟,收包率差不多就是一分钟三个。哈哈,米娜桑可以自行测试。8.state扩展conntrack机制:追踪本机上的请求和响应之间的关系状态有如下几种: NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态 RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系 INVALID:无效的连接,如flag标记不正确 UNTRACKED:未进行追踪的连接,如raw表中关闭追踪iptables -A INPUT -p icmp -m state --state NEW -j REJECT 已经连接的可以通,新连接的拒绝iptables -A INPUT -p tcp -dport 22 -m state --state NEW -j REJECT下面是与之相关的几个文件:已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max不同的协议的连接追踪时长
/proc/sys/net/netfilter/
Firewallfirewalld是CentOS 7.0新推出的管理netfilter的工具 firewalld是配置和监控防火墙规则的系统守护进程。可以实现iptables,ip6tables,ebtables的功能firewalld服务由firewalld包提供firewalld支持划分区域zone,每个zone可以设置独立的防火墙
规则归入zone顺序:先根据数据包中源地址,将其纳为某个zone 纳为网络接口所属zone纳入默认zone,默认为public zone,管理员可以改为其它zone网卡默认属于public zone,lo网络接口属于trusted zone
firewall-cmd --get-services 查看预定义服务列表/usr/lib/firewalld/services/*.xml预定义服务的配置三种配置方法firewall-config (firewall-config包)图形工具firewall-cmd (firewalld包)命令行工具/etc/firewalld 配置文件,一般不建议
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上(如不想要某ip访问主机的httpd服务,只要在input表里添加就好了。)报文流经的路径:判断添加在哪个链上 报文的流向:判断源和目的匹配规则:业务需要链上规则的次序,即为检查的次序,因此隐含一定的法则同类规则(访问同一应用),匹配范围小的放上面不同类规则(访问不同应用),匹配到报文频率较大的放上面将可由一条规则描述的多个规则合并为一个设置默认策略
其实防火墙能起到的作用还很多。阿拉解释的也只是其中的一小部分。具体需求具体切入,共勉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux iptables 防火墙