一、iptables的规则表和链。
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
Iptables采用“表”和“链”的分层结构。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。
(1)iptables规则表:
①filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
②Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
③Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
④Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw
优先级由高到低的顺序为:raw-->mangle-->nat-->filter
(2)iptables规则链:
①INPUT——进来的数据包应用此规则链中的策略
②OUTPUT——外出的数据包应用此规则链中的策略
③FORWARD——转发数据包时应用此规则链中的策略
④PREROUTING——对数据包作路由选择前应用此链中的规则
(注意:所有的数据包进来的时侯都先由这个链处理)
⑤POSTROUTING——对数据包作路由选择后应用此链中的规则
(注意:所有的数据包出来的时侯都先由这个链处理)
链上规则的秩序:
①同类规则(访问同一应用),匹配范围小的放上面
②不同类规则(访问不同应用),匹配到报文频率较大的放上面
③将那些可由一条规则描述的多个规则合并为一个
④设置默认策略
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
二、iptables命令详解:
iptables的基本语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式 比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
(1)基本命令
①-L 【链名】列出指定链上的所有规则,默认列出所有链上的规则。
举例:列出INPUT链上的所有规则
iptables -L INPUT
-n 以数字方式显示
-v 列出更详细信息
通常-vnL(L只能写到最后)一起使用,查看防火墙上面的所有策略。
iptables -vnL
②--line-numbers 以序列号方式列出策略,通常和-vnL一起使用。
举例:查看防火墙上有多少条策略
iptables -vnL --line-numbers
③-A 追加
④-I 插入一条策略,默认是第一条策略。
举例:把禁止172.17.66.66ping本机写到INPUT规则链的第二条。
iptables -A INPUT 2 -s 172.17.66.66 -p icmp -j REJECT
⑤-R 修改策略
举例:修改上个例子中禁ping本机的ip地址172.17.66.66为172.17.88.88
iptables -R INPUT 2 -s 172.17.88.88 -p icmp -j RENECT
⑥-D 删除策略 【注意:需要指明规则序号和规则本身】
举例:删除INPUT规则链上所有策略
iptables -D INPUT 2
⑦-F 清空所有策略
举例:清空防火墙上所有策略
iptables -F
⑧-S 命令方式显示出策略,可以重定向文件里。
举例:把所有策略导入到iptables.txt文件里
iptables -S > iptables.txt
⑨-N 自定义规则链(必须放到系统自带的五个规则链中的一个才能生效】
自定义规则链:iptables -N account
给自定义规则链添加策略:iptables -A account -s 172.17.66.66,172.17.88.88 -j ACCEPT
自定义规则链加到系统规则链里:iptables -A INPUT -j account
⑩-X 删除自定义的规则链
从系统规则链里删除自定义链:iptables -D INPUT (自定义规则序号)
清空自定义规则链里面的策略:iptables -F account
删除自定义的规则链:iptables -X account
(2)基本匹配条件:无需加载模块,由iptables/netfilter自行提供,不需要加-m
①[!] --dport 指定端口
iptables -A INPUT -p tcp --dport 22:23:24,80 -j REJECT
②[!] -s --source address[/mask][,...]:源IP地址或范围
③[!] -d --destination address[/mask][,...]:目标IP地址或范围
④[!] -p --protocol protocol:指定协议,可使用数字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,
举例:拒绝172.17.66.66访问172.17.88.88的tcp80端口
iptables -A FORWARD -s 172.17.66.66 -d 172.17.88.88 -p tcp --dport 80 -j REJECT
说明:[!]说明可以取反。
举例:除了172.17.66.66不能ping本机,其它都可以
iptables -A INPPUT ! -s 172.17.66.66 -p icmp -j REJECT
⑤[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
举例:【iptables -A INPUT -s 172.17.66.66 -i eth0 -j REJECT】
⑥[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
(3)扩展命令:
①multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]...指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]...指定多个目标端口
[!] --ports port[,port|,port:port]...多个源或目标端口
示例:允许172.17.0.0/16这个段的网络通过20、80端口访问本机
iptables -A INPUT -s 172.16.0.0/16 -p tcp -m multiport --dports 20,80 -j ACCEPT
②iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
示例:拒绝172.16.100.5-172.16.100.10这个网段的ip通过tcp80端口访问本机
iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
③mac扩展
指明源MAC地址
--mac-source XX:XX:XX:XX:XX:XX
示例:拒绝00:50:56:12:34:56这个mac地址访问本机
iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT
④string扩展: 【回应报文】
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:要检测的字符串模式
[!] --hex-string pattern:要检测字符串模式,16进制格式
示例:拒绝172.16.0.0/16这个网段的ip访问带有goolge字样的网站
iptables -A OUTPUT -s 172.16.0.0/16 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
⑤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...] 星期几
注意:CentOS7系统默认为UTC 【需要减八个小时是北京时区】
举例:拒绝172.16.0.0/16这个网段在每周的Sat,Sun的14:30-18:30访问tcp的80端口
iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
⑥connlimit扩展
根据每客户端IP做并发连接数数量匹配可防止CC(Challenge Collapsar挑战黑洞)攻击
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
示例:当连接数量大于2时拒绝访问172.16.100.10
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
⑦state扩展
conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
iptables -A INPUT -s 172.17.66.66 -p tcp --dports 80 -m state --state NEW -j REJECT 【正在进行的没事,新连接的拒绝,即重新访问80端口的都不行】
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
三、网络防火墙
iptables/netfilter网络防火墙:
(1) 充当网关
(2) 使用filter表的FORWARD链
①SNAT
让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
网络拓扑:
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
定义的样式:
比如我们现在要将所有192.168.0.0/24网段的IP经过路由器(记得开启转发功能,同时连接外网和内网)的时候全都转换成8.8.8.8这个假设出来的外网地址:
命令:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 8.8.8.8
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成8.8.8.8这个IP.
②DNAT
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。
定义的样式:
比如我们现在在互联网上想访问192.168.0.0/24这个网段的局域网,经过路由器的时候全部转换为192.168.2.2这个内网地址:
命令:iptables -t nat -A PREROUTING -d 8.8.8.8 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.0/24
四、控制规则的存放以及开启
注意:你所定义的所有内容,当你重启机器的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
①service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
②iptables-save 命令
iptables-save > /etc/sysconfig/iptables
③iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效