首先理解防火墙是什么?
防火墙只是一个框架,真正想实现就需要规则,只有在出入口处定义防范策略,也才能识别好人还是坏人;
iptabels怎么来的?
(1) iptables它只是命令行工具程序,位于用户空间且只是通用规则编辑管理工具;
(2) 最早实现在内核中提供防火墙机制的是BSD UNIX,而Linux设计开发者参考了在BSD中的实现并开始引入到Linux内核当中来,最早的一代我们叫IPfirewall也是2.0之前的版本。
(3) 2.2版本后叫ipchains,为了解决应对防火墙上的不同策略而浮生。
(4) 2.4版本后叫iptables,为了解决防火墙上诸多功能与不同策略而浮生。
ipfirewall是什么?
ipfirewall简称ipfw,是在FreeBSD上开发的IP封包过滤程式,具备防火墙功能,由FreeBSD开发团队负责维护。它曾被移植到多个平台上,Mac OS X曾经采用它作为预设防火墙,直到Mac OS X 10.7 Lion 采用另一个FreeBSD程式PF来取代它。在94年艾伦·考克斯曾经将它移植到Linux 1.1上,作为Linux的预设防火墙,直到Linux 2.4被iptable来取代。(摘自wiki)
iptables又是什么?
我们在上面已经说过,它只是一个命令行工具,只是一个运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送。在大部分的Linux系统上面,iptables是使用/usr/sbin/iptables来操作,文件则放置在手册页(Man page[2])底下,可以通过 man iptables 指令获取。通常iptables都需要内核层级的模块来配合运作,Xtables是主要在内核层级里面iptables API运作功能的模块。因相关动作上的需要,iptables的操作需要用到超级用户的权限。(摘自wiki)
什么是Firewall?
它是一种隔离工具(Packets Filter Firewall,即包过滤防火墙,带状态追踪机制的包过滤防火墙)
工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
组件可以是硬件级别或者是软件级别
硬件防火墙:在硬件级别实现部分过滤功能的防火墙;另一部分功能基于软件实现;
提供通用功能支撑;
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
提供复杂逻辑;
主机防火墙:服务范围为当前主机;
只为单台主机提供访问策略;
网络防火墙:服务范围为防火墙被的局域网;
整个逻辑是在软件层实现的;
Linux系统内核级防火墙有两个层面的工具组成
netfilter与iptables
(1) Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架。该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想;
(2) Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate);
数据包内容修改;
以及数据包过滤的防火墙功能;
(3) Netfilter 平台中制定了数据包的五个挂载点(Hook Point,可理解为钩子函数,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容);这5个挂载点分别是 PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING;
(4) iptables:Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld
iptables的四表与五链
四表;tables
filter:过滤,防火墙;
nat:network address translation,网络地址转换;
mangle:拆解报文,做出修改,并重新封装;
raw:关闭nat表上启用的连接追踪机制;
五链;CHAINS
prerouting 路由前
input 入站
forward 转发
output 出站
postrouting 路由后
四个表的功能讲解
filter表:
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP,ACCEPT,REJECT);
filter 表对应的内核模块为iptable_filter,包含三个规则链:
INPUT链:针对哪些目的地是本地的包;
FORWARD链:过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包;
OUTPUT链:是用来过滤所有本地生成的包;
nat表:
主要用于修改数据包的IP端口等信息(网络地址转换,如SNAT,DNAT,MASQUERADE,REDIRECT);
属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链:
PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址;
OUTPUT链:改变本地产生的包的目的地址;
POSTROUTING链:在包就要离开防火墙之前改变其源地址;
mangle表:
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛;
包含五条规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD ;
raw表:
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表;
包含两条规则链;OUTPUT与PREROUTING;
五个链的功能讲解
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链;
从应用时间点的角度理解这些链:
(1) INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则;
(2) OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则;
(3) FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时应用此链中的规则;
(4) PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT;
(5) POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT;
iptables中数据包和4种被跟踪连接的4种不同状态:
(1) NEW:该包想要开始一个连接(重新连接或将连接重定向) ;
(2) RELATED:该包是属于某个已经建立的连接所建立的新连接;
例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。–icmp-type 0 ( ping 应答) 就是–icmp-type 8 (ping 请求)所RELATED出来的;
(3) ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包;
(4) INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据;
报文的请求方式和报文的流向
报文的请求:
(1) 由本机流出的报文 请求别人;
响应别人;
(2) 流入本机的报文 别人直接请求进来的;
自己请求出去别人响应进来的;
报文的流向:
(1) 到本机某进程的报文:PREROUTING –> INPUT;
(2) 由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING;
(3) 由本机的某进程发出报文:OUTPUT –> POSTROUTING;
注意:接口本身没有方向,我们在写规则的时候要考虑报文的流经方向;
iptables规则的组成部分即数据包的处理方式
上面我们已经说过了四表五链(功能与钩子)的对应关系,而真正去管理实现防火墙的基本功能是需要iptables这个管理工具来实现;
注意:整个防火墙的规则是由iptables来编写;
那iptables规则的组成到底有哪些呢?
1、匹配条件:
对一个报文的检查部分有;
网络层首部:Source IP, Destination IP ;
传输层首部:Source Port, Destination Port ;
应用层首部:需借助于扩展检查机制方可实现;
扩展检查机制:需要iptables_netfilter扩充一些功能才能检查(以模块化呈现) ;
2、处理动作:target 叫处理目标
ACCEPT–接收允许,DROP–丢弃,REJECT–拒绝;
安装使用iptables/netfilter
安装信息摘要:
(1) 实验的系统环境:CentOS 7.2
(2) netfilter是位于内核中的TCP/IP协议栈报文处理框架,可使用模块管理命令mod查看模块信息;
(3) iptables定义的规则是在用户空间定义的,然后送往内存中的内核上,重启自动消失;
(4) iptables不是服务,即需要配置文件来保存规则也可写入脚本使其开机自动运行;
(5) 针对CentOS平台不同系统版本的iptables管理实现: CentOS 5/6:iptables命令编写规则
~]# iptables -t filter -F
~]# service iptables save
服务脚本: /etc/init.d/iptables (可复制到CentOS7上一样可运行)
CentOS 7:firewalld(守护进程),firewall-cmd(命令行工具), firewall-config(配置文件)
~]# systemctl disable firewalld (服务关闭,先disable后stop)
iptables安装:
程序包:iptables(ipv4包过滤和NAT转换管理工具)
iptstate(状态追踪工具)
保证实验需要先安装应用程序: ~]# yum install httpd samba telent vsftpd -y
用iptables命令去写规则时需要注意的问题
规则匹配方法:
根据指定匹配条件来尝试匹配每个流经此处报文,一旦匹配成功则由规则后面指定处理动作进行处理
规则匹配的条件:主要匹配IP层首部特征;
基本匹配条件:源地址,目标地址,传输层协议;
扩展匹配条件:需要借助于扩展模块进行指定的匹配条件(有两种);
隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
显式扩展:隐式扩展之外的其它扩展匹配条件;
处理动作:
基本动作:ACCEPT,DROP,…
扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作,大写都是指明扩展 ;
添加规则时需要考量的问题(重点):
(1) 报文流经的位置:用于判断将规则添加至哪个链;
(2) 实现的功能:用于判断将规则添加至哪个表;
(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”;
(4) 匹配条件:用于编写能够正确匹配目标报文的规则;
举例:阻止来自于10.1.0.101访问本机的web服务
iptables命令的多种使用格式
通用规则管理格式:
iptables [-t able] COMMAND chain cretieria [-m [per-match-options]] [-j targetname [per-target-options]]
注意:-t table 表示指明要管理的表,默认为filter且优先级最低;
COMMANDS(子命令):
对链本身管理:
-P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP; 因为防火墙风格两种:白名单,黑名单 一但设置为DROP则外部访问全拒绝 举例:~]# iptables -t filter -P INPUT DROP (改默认策略为DROP) -N:chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数; iptables [-t table] -N 举例:~]# iptables -N in_web (0 references=零次引用) 注意:自定义链规则不会送入到钩子上的,自定义链想要生效必须在内置链上去引用它; 每一个自定义链都会有被引用计数,为零表示没有被引用; -X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链; 举例:~]# iptables -X (慎用...如未加X选项表示删除所有链,且不可逆) -F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ; -E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链; 举例:~]# iptables -E in_web in_httpd -Z:iptables [-t table] -Z [chain [rulenum]] [options...] 置零计数器 每条规则以及链的默认策略分别有各自的两个计数器: (1) 匹配到的报文的个数:pkts (2) 匹配到的所有报文的大小之和:bytes 举例:~]# iptables -Z INPUT (多次刷新)
链的规则管理:
-A:append, iptables [-t table] -A chain rule-specification 追加规则到指定的链尾部,增; -I:insert, iptables [-t table] -I chain [rulenum] rule-specification 插入规则到指定的链中的指定位置,默认为链首; -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum第几号规则 删除指定的链上的指定规则,删; -R:replace,iptables [-t table] -R chain rulenum rule-specification 将指定的链上的指定规则替换为新的规则,改;
规则显示的字段表示的意思:
pkts:由此包所匹配到的报文个数; bytes:由此规则所匹配到的包的大小之和/字节数; target:表示匹配到的规则是target; prot:表示被这个规则所匹配到的协议protocol; opt选项: in:报文限制从哪个接口流入; out:报文限制从哪个接口流出; source:源地址; destination:目标地址; 注意:如果定义的链没有被任何规则所匹配,则默认被策略所匹配(policy ACCEPT 806 packets,94361 bytes);
查看:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...] -n:数字格式; -v:verbose,详细格式信息; -vv, -vvv; --line-numbers:显示链上的规则的编号; -x:exactly,显示计数器的精确值; -t:查看不同的表 ~]# iptables -t nat -vnL ~]# iptables -vnL
iptables的匹配条件
匹配条件我们在上面已经讲过了,在这里注意一点就可以;
即多重条件之间的隐含逻辑为“与”操作;
基本匹配条件:
[!] -s, –source address[/mask][,…] 检查报文中的源IP地址是否符合此处指定的地址或地址范围; [!] -d, –destination address[/mask][,…] 检查报文中的目标IP地址是否符合此处指定的地址或地址范围; [!] -p, –protocol protocol: 检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 “all”; [!] -i, –in-interface name 检查报文进入本机时的接口是否符合本处指定的接口; 支持INPUT, FORWARD and PREROUTING ; [!] -o, –out-interface name 检查报文即将离开本机时经由的接口是否符合本处指定的接口; 支持FORWARD, OUTPUT and POSTROUTING; -m, –match match:显式指明要使用的扩展模块; -j, –jump target:跳转目标; 举例:针对本机入站凡事来自于10.1.0.0/16网络请求都被允许,凡事来自于10.1.253.44访问本机的请求都拒绝; ~]# iptables -I INPUT -s 10.1.253.44 -j REGECT ~]# iptables -t filter -A INPUT -s 10.1.0.0/16 -j ACCEPT 把以上所拒绝的源网络地址匹配规则改为DROUP ~]# iptables -R INPUT 1 -s 10.1.253.44 -j DROP 不再阻断10.1.253.44报文请求,放行 ~]# iptables -vnL –line-numbers (先看规则处在哪个条目上) ~]# iptables -D INPUT 1 不指明匹配条件,指明number数 ~]# iptables -D INPUT -s 10.1.253.44 -j DROP(指明匹配条件) 举例:本机只允许本机上的tcp请求服务,请求放行 ~]# iptables -A INPUT -s 10.1.253.0.0/16 -d 10.1.253.43 -p tcp -j ACCEPT ~]# iptables -R INPUT 1 -j REGECT 注意:不同类别的规则,匹配机会更大,访问比较频繁的放在前面(注意先后顺序)
扩展匹配条件:
隐式扩展:
不用-m选项明确给出要使用的扩展机制的扩展; 此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;(不指定-m扩展即为隐式扩展) ; -p tcp:可直接使用tcp协议对应的扩展选项; [!] –source-port,–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; 21:22:23 [:20,20:] [!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; 21:22:23 [:20,20:] [!] –tcp-flags mask comp 报文标志位:SYN,ACK,FIN,RST,URG,PSH; mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0; –tcp-flags SYN,ACK,FIN,RST SYN [!] –syn:相当于–tcp-flags SYN,ACK,FIN,RST SYN -p udp:可直接使用udp协议对应的扩展选项; [!] –source-port,–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; 21:22:23 [:20,20:] [!] –destination-port,–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口; 21:22:23 [:20,20:] -p icmp:可直接使用icmp协议对应的扩展选项,主要指定icmp类型用来探测主机或网络的可用性 [!] –icmp-type {type[/code]|typename} –icmp-type 0/0:匹配对ping请求的响应报文 –icmp-type 8/0:匹配ping请求报文 举例:只开放本机的openssh服务的22端口给本地网络(整个网络只放行openssh 22端口) ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p tcp –dport 22 -j ACCEPT 入站 入站整个网络我只放行22端口 ~]# iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p tcp –sport 22 -j ACCEPT 出站 出站整个网络我只放行22端口 ~]# iptables -P INPUT DROP ~]# iptables -P OUTPUT DROP 举例:开放本机的ping请求 ping请求报文:8/0 :请求报文是进入本机的 ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p icmp –icmp-type 8/0 -j ACCEPT 抓包看一看 tcpdump -i eno16777736 -nnn icmp ping响应报文:0/0 :响应报文是由本机发出去的 别人ping自己 ~]# iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p icmp –icmp-type 0/0 -j ACCEPT 自己ping他人,出站 ~]# iptables -A OUTPUT -s 10.1.253.43 -d 0.0.0.0/0 -p icmp –icmp-type 8/0 -j ACCEPT 先让你请求出现,不让你出去/状态是 ~]# iptables -A INPUT -d 10.1.253.43 -s 0.0.0.0/0 -p icmp –icmp-type 0/0 -j ACCEPT
扩展匹配条件:
显式扩展:
必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项; 1、multiport 以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified. [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口; [!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口; 使用一条规则开放本机的21,22,23,80端口 ~]# useradd centos ~]# iptables -A INPUT -d 10.1.253.43 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT 入站 ~]# iptables -A OUTPUT -s 10.1.253.43 -p tcp -m multiport --sports 21,22,23,80 -j ACCEPT 出站 2、iprange 以连续的ip地址范围指明多地址匹配条件; 端口支持连续,不支持离散 地址不支持连续,支持离散 [!] --src-range from[-to] [!] --dst-range from[-to] 3、string 对报文中的应用层数据做字符串匹配检测; [!] --string pattern [!] --hex-string pattern --algo {bm|kmp}:字符串匹配检查算法; --from offset --to offset 举例:网站包含sex字段,响应时阻断 ~]# iptables -I OUTPUT -s 10.1.253.43 -p tcp --sports 80 -m string --string "sex" --algo bm -j REGECT ~]# curl 10.1.253.43/index.html ~]# curl 10.1.253.43/index2.html 4、time 根据报文到达的时间与指定的时间范围进行匹配度检测; --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] --timestop hh:mm[:ss] [!] --monthdays day[,day...] [!] --weekdays day[,day...] 举例:阻断telnet在非工作时间访问 ~]# iptables -I INPUT -d 10.1.253.43 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:00 --weekdays sat sun -j REJECT 指定这天 i~]# ptables -I INPUT -d 10.1.253.43 -p tcp --dport 23 -m time --weekdays Thursday -j REJECT 5、connlimit 根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求; --connlimit-upto n:连接数小于等于阈值;小于等于 --connlimit-above n:连接数超出阈值;大于 ~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 举例:ssh服务,每个客户端单IP最大发出连接请求不可以超出2个 ~]# iptables -I INPUT -d 10.1.253.43 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REGECT 6、limit 基于收发报文的速率进行匹配; --limit rate[/second|/minute|/hour|/day] --limit-burst number 举例:允许别人对本机发起ping请求,每3秒钟接收一次ping请求, ~]# iptables -A INPUT -d 10.1.253.43 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT 入站 ~]# iptables -A OUTPUT -d 10.1.253.43 -p icmp --icmp-type 0 -j ACCEPT 出站 7、state (包) 状态检测:连接追踪机制(conntrack) NEW:新连接 ESTABLISHED:已建立的连接 (注意) RELATED:相关联的连接 (注意) INVALID:无法识别的连接 UNTRACKED:未被追踪连接; [!] --state state 举例:只放行已建立连接指定端口并放行 ~]# iptables -A INPUT -d 10.1.253.43 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT 入站 ~]# iptables -R OUTPUT 1 -m state --state --state ESTABLISHED -j ACCEPT 出站 ~]# iptables -A INPUT -d 10.1.253.43 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT (只要是ESTABLISHED统统放行) ~]# iptables -R INPUT 2 -d 10.1.253.43 -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT(21,22,23,80只放行NEW) 如何开放被动模式的ftp服务: (1) 装载追踪ftp协议的模块; ~]# modprobe nf_conntrack_ftp (2) 放行入站命令连接 ~]# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT (3) 放行入站数据连接 ~]# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (4) 放行出站的ESTABLISHED连接 ~]# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT done !
处理动作(跳转目标):
-j tagetname [per-target-options] 简单target: ACCEPT,DROP 用rpm -ql iptables看到有很多大写小写模块,其大写用于指明target,小写用于指明条件对的 扩展target: REJECT: --reject-with type icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port-unreachable; LOG: Turn on kernel logging of matching packets. --log-level level --log-prefix prefix:日志信息的前导信息; 举例:他人访问我本机ssh服务时,都将记录到日志当中,怎么做? ~]# iptables -I INPUT 2 -d 10.1.253.43 -p tcp --dport 22 -j LOG --log-prefix "openssh from kernel"
保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE; 重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE; -n, --noflush:不清除原有规则; -t, --test:仅分析生成规则集,但不予提交; 注意:重载文件中的规则,会清除已有规则; 针对不同CentOS版本的保存规则方法: CentOS 6: 保存规则:service iptables save; 保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容; 重载规则:server iptables restart; 默认重载/etc/sysconfig/iptables文件中的规则; 脚本配置文件:/etc/sysconfig/iptables-config用于指明要装载的模块; CentOS 7开机自动生效规则: (1) firewalld服务; (2) shell脚本,直接记录iptables命令; (3) 自定义unit file或init script;
对规则优化的思路
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制(默认都拒绝,只允许单行)
(a) 可使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则做为默认策略;
(5)重点:
1.首先查本地arp cache信息,看是否有对方的mac地址和IP地址映射条目记录
2.如果没有,则发起一个arp请求广播包,等待对方告知具体的mac地址
3.收到arp响应包之后,获得某个IP对应的具体mac地址,有了物理地址之后才可以开始通信了,
同时对ip-mac地址做一个本地cache
4.发出icmp echo request包,收到icmp echo reply包
注意:往往很多人都忽略了上面3步,只知道有最后一步。
如果设置了默认规则都为DROP:则应该在进出口做相应放行策略,以免被自己杀掉自己
~]# iptables -A INPUT -d 10.1.253.43 -j DROP ~]# iptables -P INPUT ACCEPT ~]# iptables -A OUTPUT -d 10.1.253.43 -j DROP ~]# iptables -P OUTPUT ACCEPT
这一篇的主机防火墙知识就到到这里了。下一篇的文章会主要介绍网络防火墙与nat表的简要信息;
So...春节到了小生在这里祝福大家“新年快乐”,阖家安康。我们来年继续努力工作,努力学习...