iptables基础(一)

===========================================================================

概述:

 本章将介绍Linux中有关防火墙的相关基础知识,内容包括:

  • iptables/netfilter:

  • netfilter上的5个钩子函数;

  • iptables上的5链;

  • 四表:raw,mangle,nat,filter以及各表的功能和链的对应关系;

  • iptables的安装和命令规则的组成和使用格式;

  • iptables的匹配规则,包括基本匹配条件和扩展匹配条件;

  • 扩展匹配条件中的隐性匹配和显性匹配

===========================================================================

iptables介绍

 1.Firewall

Firewall:防火墙系统

  • 是一种隔离工具,Packets Filter Firewall (包过滤型防火墙);

定义:

  • 工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件; 

硬件防火墙:

  • 在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; 

软件防火墙:

  • 应用软件处理逻辑运行于通用硬件平台之上的防火墙;

防火墙范围分类:

  • 主机防火墙服务范围为当前主机;

  • 网络防火墙:服务范围为防火墙背后的局域网;

 2.iptables/netfilter:

netfilter:防火墙框架,framework;位于内核空间;

hooks function(钩子函数)

  • prerouting:路由前

  • input :   入栈

  • forward : 转发

  • output :  出栈

  • postrouting:路由后

注意:

  • 钩子函数都是内核中的TCP/IP协议栈上定义的

iptables:

  • 命令行工具程序,位于用户空间;规则管理工具

CHAINS:链,在钩子上定义规则

  • PREROUTING

  • INPUT

  • FORWARD

  • OUTPUT

  • POSTROUTING

注意:

  • iptables 是用户空间的规则管理工具,通过iptables编写好规则后,然后送往在对应的CHAINS(链)之上来管理报文;

报文流向:

  • 到本机某进程的报文:PREROUTING --> INPUT 

  • 由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING

  • 由本机的某进程发出报文:OUTPUT --> POSTROUTING

 3.tables 表

功能:

  • filter:过滤,防火墙;

  • nat:network address translation,网络地址转换;

  • mangle:拆解报文,做出修改,并重新封装;

  • raw:关闭nat表上启用的连接追踪机制;

附录:

   filter表和nat表

  Linux 之 iptables基础(一)_forward

  Linux 之 iptables基础(一)_forward_02

优先级次序(由高而低):

  • raw --> mangle --> nat --> filter 

功能<-->钩子对应关系:很重要

  • raw:PREROUTING,OUTPUT

  • mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

  • nat:PREROUTING,INPUT,OUTPUT,POSTROUTING

  • filter:INPUT,FORWARD,OUTPUT

数据包过滤匹配流程:

Linux 之 iptables基础(一)_function_03

 4.iptables规则的组成及工作原理:

匹配条件:

  • 网络层首部:Source IP(源IP), Destination IP(目标IP)

  • 传输层首部:Source Port(源端口), Destination Port(目标端口)

  • 扩展检查机制:

处理动作:target 目标

  • ACCEPT:接受

  • DROP:丢弃

  • REJECT:驳回,拒绝

iptables工作流程

  • iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来确定是否可以进入主机。

  • 工作流程如下图所示:

    (数据报的流向是从左向右)

 Linux 之 iptables基础(一)_forward_04

总结:

    1.防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
    2.如果匹配上规则,即明确表明是阻止还是通过,数据包就不在向下进行匹配新规则了。
    3.如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
    4.防火墙默认规则是所有的规则执行完才会执行的。
    5.匹配上了拒绝规则也是匹配,这点要多注意。

iptables命令使用基础

 1.安装:

netfilter:位于内核中的tcp/ip协议栈报文处理框架;

iptables:

CentOS 5/6:iptables命令编写规则;

 初始化安装命令:

  • # iptables -t filter -F

  • # service iptables save

CentOS 7:firewalld,firewall-cmd, firewall-config

 初始化安装命令:

  • # systemctl disable firewalld

程序包

  • iptables,iptstate

 2.iptables命令的规则:

规则:

  • 根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;

匹配条件:

基本匹配条件:主要是ip层(源地址,目标地址),传输层协议;

扩展匹配条件:需要借助于扩展模块进行指定的匹配条件;

  • 隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;

  • 显式扩展:隐式扩展之外的其它扩展匹配条件;

处理动作:

  • 基本动作:ACCEPT,DROP,...

  • 扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;

添加规则时需要考量的问题:

  • 报文流经的位置:用于判断将规则添加至哪个链;

  • 实现的功能:用于判断将规则添加至哪个表;

  • 报文的方向:用于判断哪个为“源”,哪个为“目标”;

  • 匹配条件:用于编写能够正确匹配目标报文的规则;

 3.iptables命令的使用格式:

规则使用格式:

  • iptables [-t table] {-A|-C|-D} chain rule-specification

  • iptables [-t table] -I chain [rulenum] rule-specification

  • iptables [-t table] -R chain rulenum rule-specification

  • iptables [-t table] -D chain rulenum

  • iptables [-t table] -S [chain [rulenum]]

  • iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

  • iptables [-t table] -N chain

  • iptables [-t table] -P chain target

  • iptables [-t table] -E old-chain-name new-chain-name

  • rule-specification = [matches...] [target]

  • match = -m matchname [per-match-options] 扩展条件

  • target = -j targetname [per-target-options] 处理动作

规则管理格式: 

  • iptables [-t table] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]

-t table:

  • 指明要管理的表; 默认为filter;

COMMANDS:

链管理:

  • -P:iptables [-t table] -P chain target

              定义链的默认策略;其target一般可使用ACCEPT或DROP;

  • -N:iptables [-t table] -N chain

              自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;

  • -X:iptables [-t table] -X [chain]

              删除自定义的空的引用计数为0的链;

  • -F:iptables [-t table] -F [chain [rulenum]] [options...],

              清空指定的链,或删除指定链上的规则 ;

  • -E:iptables [-t table] -E old-chain-name new-chain-name,

              重命名自定义的引用计数为0的链;

  • -Z:iptables [-t table] -Z  [chain [rulenum]] [options...]

              规则置零,置零计数器

规则:

  • -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,

              将指定的链上的指定规则替换为新的规则;

查看:

  • -L:list, iptables [-t table] -L [chain [rulenum]] [options...]

        -n:数字格式,不要做反解;

        -v:verbose,详细格式信息;

              -vv, -vvv 

        --line-numbers:显示链上的规则的编号;

         -x:exactly,显示计数器的精确值; 

计数器:

  每条规则以及链的默认策略分别有各自的两个计数器:

  • 匹配到的报文的个数:pkts

  • 匹配到的所有报文的大小之和:bytes

演示:链管理

 1.-L 查看iptables的表和链

# 查看表,默认指的是filter表,有三个链
[root@centos7 ~]# iptables -vnL 
Chain INPUT (policy ACCEPT 1020 packets, 92926 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 487 packets, 78021 bytes)
 pkts bytes target     prot opt in     out     source               destination         

# 查看nat表,有四个链
[root@centos7 ~]# iptables -t nat -vnL 
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

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

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

 2. -P 定义链的默认策略为DROP

[root@CentOS6 ~]# ping 192.168.1.12 # 定义之前是能ping同
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.
64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=2.56 ms
64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=0.499 ms
64 bytes from 192.168.1.12: icmp_seq=3 ttl=64 time=0.369 ms

# 定义默认策略为DROP
[root@centos7 ~]# iptables -t filter -P INPUT DROP 

[root@centos7 ~]# iptables -nL
Chain INPUT (policy DROP) # INPUT 链默认由 ACCEPT 链转为DROP
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

# 定义之后ping不通了,链ssh远程登录都掉了
[root@CentOS6 ~]#  ping 192.168.1.12
PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.

 3. -N 自定义链

[root@centos7 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

# 定义一个in_web的链
[root@centos7 ~]# iptables -N in_web 

[root@centos7 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain in_web (0 references) # 自定义的链,0次引用
target     prot opt source               destination

 4. -X 删除自定义链

[root@centos7 ~]# iptables -X

[root@centos7 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 5. -E 重命名自定义的链

[root@centos7 ~]# iptables -N in_web
[root@centos7 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain in_web (0 references)
target     prot opt source               destination         

[root@centos7 ~]# iptables -t filter -E in_web web_input_packets # 重命名自定义链

[root@centos7 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain web_input_packets (0 references) # 重新定义完成
target     prot opt source               destination

 6. -Z,置零计数器,即规则置零

[root@centos7 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 52 packets, 5160 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 33 packets, 5558 bytes)
 pkts bytes target     prot opt in     out     source               destination         

[root@centos7 ~]# iptables -Z INPUT  # 置零

[root@centos7 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 6 packets, 396 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, 448 bytes)
 pkts bytes target     prot opt in     out     source               destination

iptables的匹配条件

 1.匹配条件及规则

匹配条件:

基本匹配条件:

  • 主要是ip层(源地址,目标地址),传输层协议;

扩展匹配条件:需要借助于扩展模块进行指定的匹配条件;

  • 隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;

  • 显式扩展:隐式扩展之外的其它扩展匹配条件;

注意:

  • 多重条件之间的隐含逻辑为“与”操作;

匹配规则的原则:

  • 如果被第一条规则所匹配到,就会做处理,处理完之后就到达不了第二条规则了;

  • 不同类别服务的规则(比如控制web服务的,SSH服务的等),应该把访问比较频繁的服务所对应的规则放到前面,即:匹配机会更大的规则放到前面

  • 同一类别的规则,要把匹配条件苛刻的,范围较小的放到前面,而范围较大的放到后面。

 2.基本匹配条件

参数:

[!]-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:跳转目标;

注意:

  • 对于本地主机上的大多数的访问控制,如果只是本地作为服务器,那我们只需把INPUT链改为DROP,只放行合法的请求进来就可以;

  • 而对于控制本机请求别人的服务时,我们应该把OUTPUT链设为DROP,只放行认为合法的请求出去就可以;

  • 为了安全起见,建议INPUT和OUTUT链的默认策略应该均为DROP。

演示:

  1.添加一条规则,仅使192.168.1.0/24网络中的主机可以访问本机服务,使用-A和-s即可,如下:

# 因为是控制访问服务,所以,请求报文会首先经过INPUT链,所以,要把INPUT链的默认策略
  设置为DROP,然后只针对符合源地址要求的报文放行;

[root@centos7 ~]# iptables -t filter -P INPUT DROP 
[root@CentOS6 ~]# ping 192.168.1.14
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. # 发现ping不同

# 添加规则,凡是来自于192.168.1.0/24网络的地址,统统放行
[root@centos7 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -j ACCEPT

[root@CentOS6 ~]# ping 192.168.1.14 # 马上就可以ping 通了
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
64 bytes from 192.168.1.14: icmp_seq=120 ttl=64 time=0.919 ms
64 bytes from 192.168.1.14: icmp_seq=121 ttl=64 time=2.48 ms
64 bytes from 192.168.1.14: icmp_seq=122 ttl=64 time=2.64 ms
64 bytes from 192.168.1.14: icmp_seq=123 ttl=64 time=0.682 ms

[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 16 packets, 1098 bytes)
# 报文 大小 处理动作   协议 选项               源地址                目标地址
 pkts bytes target     prot opt in     out     source               destination         
   74  7383 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

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

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

  1)在上题的基础上,我想禁止192.168.1.0/24 网络中ip为192.168.1.13这台主机的访问,那就需要在上题定义的规则中添加规则了,使用 -I 选项 如下:

# 插入规则
[root@centos7 ~]# iptables -I INPUT -s 192.168.1.13 -j REJECT 
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes) # 可以看到先后次序,同一类规则,范围小的放到前面
 pkts bytes target     prot opt in     out     source               destination         
    7   588 REJECT     all  --  *      *       192.168.1.13         0.0.0.0/0            reject-with icmp-port-unreachable
  235 21761 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

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

Chain OUTPUT (policy ACCEPT 14 packets, 1564 bytes)
 pkts bytes target     prot opt in     out     source               destination   
 
[root@CentOS6 ~]# ping 192.168.1.14
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data. # 每次 ping,都给你驳回了,这是REJECT 
From 192.168.1.14 icmp_seq=1 Destination Port Unreachable
From 192.168.1.14 icmp_seq=2 Destination Port Unreachable
From 192.168.1.14 icmp_seq=3 Destination Port Unreachable

  2)把规则上处理动作的REJECT换为DROP,使用-R 如下

[root@centos7 ~]# iptables -R INPUT 1 -s 192.168.1.13 -j DROP # 规则替换
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   336 DROP       all  --  *      *       192.168.1.13         0.0.0.0/0   # 新替换的规则        
  420 36377 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

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

Chain OUTPUT (policy ACCEPT 5 packets, 700 bytes)
 pkts bytes target     prot opt in     out     source               destination    
 
[root@CentOS6 ~]# ping 192.168.1.14 # 这是发现卡在这了,ping不通
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.

  3)删除对ip为192.168.1.13主机的限制,使用-D选项

[root@centos7 ~]# iptables -vnL --line-numbers # 首先查看要删除规则的规则号
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        4   336 DROP       all  --  *      *       192.168.1.13         0.0.0.0/0           
2      439 38135 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

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

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

# 删除指定规则的规则号码即可
[root@centos7 ~]# iptables -D INPUT 1  

# 注意:也可使用 # iptables -D INPUT 192.168.1.13 -j DROP 来指明确切的匹配条件,一定要写target

[root@centos7 ~]# iptables -vnL  # 查看规则已经被删除
Chain INPUT (policy DROP 9 packets, 632 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  526 45355 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           

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

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

   2.只允许指定网络192.168.1.0/24内的主机,对本机(目标地址为本机)上所有TCP协议的服务请求放行,添加一条规则,指明三重条件-s,-d,-p

[root@centos7 ~]# iptables -F #首先清空所有的规则
[root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p tcp -j ACCEPT
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 35 packets, 5862 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   31  2306 ACCEPT     tcp  --  *      *       192.168.1.0/24       192.168.1.14 # 新规则       

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

Chain OUTPUT (policy ACCEPT 48 packets, 4259 bytes)
 pkts bytes target     prot opt in     out     source               destination   
 
[root@CentOS6 ~]# curl  #  访问web服务,可以
<html>
      <head>
           <title>Test Page</title>
      </head>
      <body>
           <h1>My Test Page</h1>
      </body>
</html>

[root@CentOS6 ~]# ping 192.168.1.14  # 但是ping不通,因为只限制tcp协议可以访问
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
^C
--- 192.168.1.14 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2445ms




2.扩展匹配条件

 1)隐式扩展条件

定义:

  • 不用 -m 选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;

-p tcp可直接使用tcp协议对应的扩展选项;

[!] --source-port,--sport port[:port]

  • 匹配报文中的传输层的源端口;可给出多个连接的端口;

[!] --destination-port,--dport port[:port]:

  • 匹配报文中的传输层的目标端口;可给出多个连接的端口;

[!] --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 表示,要求只匹配tcp协议给定的这些标志位(SYN,ACK,FIN,RST)中SYN为1,而其余都为0的,这也就是tcp的第一次握手阶段。

[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN  上面的简写格式

-p udp:可直接使用udp协议对应的扩展选项;

[!] --source-port,--sport port[:port]:

  • 匹配报文中的传输层的源端口;可给出多个连接的端口;

[!] --destination-port,--dport port[:port]:

  • 匹配报文中的传输层的目标端口;可给出多个连接的端口;

-p icmp(互联网控制报文协议):

  • 可直接使用icmp协议对应的扩展选项;

[!] --icmp-type {type[/code]|typename}

    例如:

         --icmp-type  0/0:匹配对ping请求的响应报文

         --icmp-type 8/0:匹配ping请求报文

演示:

 1.TCP协议扩展

  只开放本地的SSH服务的22号端口给本地网络(192.168.1.0/24)

分析:请求报文入栈(INPUT)时源IP和port为192.168.1.0/24网络中的任意主机ip和端口,不确定,但是
目标IP和port是确定的,都是本地服务器的ip和ssh服务tcp协议的22号端口,所以为如下规则:

[root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p tcp --dport 22 -j ACCEPT

分析:请求报文出栈(OUTPUT)时源IP和port为本地服务器的ip(192.168.1.14)和ssh服务的22号端口,是确定,但是
目标IP和port是192.168.1.0/24网络中的任意主机ip和端口,是不确定的,所以为如下规则:

[root@centos7 ~]# iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.14 -p tcp --sport 22 -j ACCEPT

然后修改本地服务器的INPUT和OUTPUT的默认策略为DROP
[root@centos7 ~]# iptables -P INPUT DROP
[root@centos7 ~]# iptables -P OUTPUT DROP

查看所有规则如下:
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   16  1056 ACCEPT     tcp  --  *      *       192.168.1.0/24       192.168.1.14         tcp dpt:22

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  107 11864 ACCEPT     tcp  --  *      *       192.168.1.14         192.168.1.0/24       tcp spt:22

 2.ICMP协议扩展

    1)在上题的基础上开放本机的ping请求,即允许其他人ping本机。

要想能够被别人ping到,即ping请求入栈,源ip是不确定的,目标ip是本地服务器确定,协议为icmp,其类型为8
[root@centos7 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.14 -p icmp --icmp-type 8/0 -j ACCEPT

此时虽然,ping请求可以接受,但是只能入栈却不能出栈,通过抓包可以看出,有来自192.168.1.13的请求,但本机却未作出回应
[root@centos7 ~]# tcpdump -i eno16777736 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes
00:35:43.436103 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 752, length 64
00:35:44.435252 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 753, length 64
00:35:45.435325 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 754, length 64
00:35:46.435659 IP 192.168.1.13 > 192.168.1.14: ICMP echo request, id 41227, seq 755, length 64

开放本机的ping响应报文
[root@centos7 ~]# iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.14 -p icmp --icmp-type 0/0 -j ACCEPT

[root@CentOS6 ~]# ping 192.168.1.14 # 客户端已经可以ping通
PING 192.168.1.14 (192.168.1.14) 56(84) bytes of data.
64 bytes from 192.168.1.14: icmp_seq=1023 ttl=64 time=0.434 ms
64 bytes from 192.168.1.14: icmp_seq=1024 ttl=64 time=0.703 ms
64 bytes from 192.168.1.14: icmp_seq=1025 ttl=64 time=0.657 ms

  如果想让本地主机可以ping互联网上的任意主机,规则如下:

现在本地主机是ping不了其他主机的,因为本地主机发送不了ping的请求报文
[root@centos7 ~]# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted

要想能够ping其他主机要在OUTPUT上定义出栈的请求报文,如下:

[root@centos7 ~]# iptables -A OUTPUT -s 192.168.1.14 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT

本地主机ping ip为192.168.1.13 的其他主机
[root@centos7 ~]# ping 192.168.1.13
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.

在ip为 192.168.1.13 的主机抓包可见能够收到ip为192.168.1.13主机的请求报文,客户端主机也会发送响应报文,如下:

[root@CentOS6 ~]# tcpdump -i eth0 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:51:09.454278 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 22, length 64
12:51:09.454311 IP 192.168.1.13 > 192.168.1.14: ICMP echo reply, id 3486, seq 22, length 64
12:51:10.454195 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 23, length 64
12:51:10.454228 IP 192.168.1.13 > 192.168.1.14: ICMP echo reply, id 3486, seq 23, length 64
12:51:11.454249 IP 192.168.1.14 > 192.168.1.13: ICMP echo request, id 3486, seq 24, length 64


虽然本地主机的ping请求发送出去了,但是ping的其他主机的响应报文不能入栈,所以要定义其他主机
的响应报文入栈,如下:

[root@centos7 ~]# iptables -A INPUT -d 192.168.1.14 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT

[root@centos7 ~]# ping 192.168.1.13 # 可以ping通,也有回应了
PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data.
64 bytes from 192.168.1.13: icmp_seq=1 ttl=64 time=5.02 ms
64 bytes from 192.168.1.13: icmp_seq=2 ttl=64 time=0.512 ms

 

2)显式扩展条件

定义:

  • 必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;

multiport

  • 以离散或连续的方式定义的多端口匹配条件; (最多不超过15个). 

[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;

[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;

演示:

 1.使用一条规则开放本机的22,80和23号端口

[root@centos7 ~]# iptables -F # 首先清空所有的规则

定义入栈的规则,这里不指明源ip和端口,默认为网络中所有的主机
[root@centos7 ~]# iptables -A INPUT -d 10.1.252.161 -p tcp -m multiport --dports 22,23,80 -j ACCEPT

定义出栈规则,同样这里不指明目标ip和端口,默认为网络中所有的主机
[root@centos7 ~]# iptables -A OUTPUT -s 10.1.252.161 -p tcp -m multiport --sports 22,23,80 -j ACCEPT

定义入栈,出栈的默认策略为DROP
[root@centos7 ~]# iptables -P INPUT  DROP
[root@centos7 ~]# iptables -P OUTPUT  DROP

查看规则如下:
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 112 packets, 11838 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  420 32308 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.1.252.161         multiport dports 22,23,80

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

Chain OUTPUT (policy DROP 7 packets, 420 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  151 13992 ACCEPT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            multiport sports 22,23,80

==================================================================================
测试如下:
[root@CentOS6 ~]# curl  # 测试httpd 的80端口成功 
<html>
      <head>
           <title>Test Page</title>
      </head>
      <body>
           <h1>My Test Page</h1>
      </body>
</html>

[root@CentOS6 ~]# ssh 10.1.252.161 #ssh服务的22号端口正常
root@10.1.252.161's password: 
Last login: Sat Oct 22 10:25:28 2016 from 10.1.250.25
===========================================
         Welcome Everbody
        心有理想,春暖花开!!!
      2016-10-22 10:51:55 Saturday
===========================================

iprange

 以连续的ip地址范围指明多地址匹配条件;

  • [!] --src-range from[-to] :指明匹配多个源地址;

  • [!] --dst-range from[-to] :指明匹配多个目标地址;

string

对报文中的应用层数据做字符串匹配检测;

  • [!] --string pattern:字符串匹配模式检测

  • [!] --hex-string pattern:把字符串转换成16进制的字符格式,效率更高


  • --algo {bm|kmp}:字符串匹配检查算法;

  • --from offset: 从最开始出偏移多少个字节开始检查;

  • --to offset  :设置我们要检查匹配到何处结束;

注意:

  • 前二者选其一,是必须要给定的,算法也是必须要给定的;

  • --from和--to 如果二者不给定的话,就是检查整个报文

演示:

   1.对互联网中的敏感词汇sex做规则匹配

没有设定规则前,含敏感词汇的和不含的文件,都可以正常访问,如下:

#不含敏感词汇 
[root@CentOS6 ~]# curl http://10.1.252.161/text.html  
<html>
      <head>
           <title>Test Page</title>
      </head>
      <body>
           <h1>My Test Page</h1>
      </body>
</html>

# 含敏感词汇sex 
[root@CentOS6 ~]# curl http://10.1.252.161/text1.html  
sex
# =====================================================================================

分析:本题是在web服务上做了更加严格的规则,同类规则中匹配严格的要放到前面,优先检查;
因为响应报文中包含敏感词汇,所以,我们要在出栈上做定义,源ip为本主机,这里只限定web服务
所以源端口为80,如果所有的服务都限定,不用指明端口即可,然后匹配sex,匹配到后执行REJECT

[root@centos7 ~]# iptables -I OUTPUT -s 10.1.252.161 -p tcp --sport 80 -m string --string "sex" --algo bm -j REJECT
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 4 packets, 312 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1682  132K ACCEPT     tcp  --  *      *       0.0.0.0/0            10.1.252.161         multiport dports 22,23,80

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            tcp spt:80 STRING match  "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable
 1089  115K ACCEPT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            multiport sports 22,23,80

#=================================================================================

设定规则后,再次访问,可以发现,不含敏感词汇的可以正常访问,含有敏感词汇sex的,不能正常访问

[root@CentOS6 ~]# curl http://10.1.252.161/text.html
<html>
      <head>
           <title>Test Page</title>
      </head>
      <body>
           <h1>My Test Page</h1>
      </body>
</html>

[root@CentOS6 ~]# curl  # 卡着不动了,说明访问不了


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...]:限定每周的周几有效;

注意:

  • 设置访问时间规则时,一定要校正系统时间

演示:

   为了演示效果,这里禁止web服务在每周六访问,定义规则如下:

规则设定之前可以正常访问web服务
[root@CentOS6 ~]# curl http://10.1.252.161/text.html
<html>
      <head>
           <title>Test Page</title>
      </head>
      <body>
           <h1>My Test Page</h1>
      </body>
</html>
#========================================================================================
设定规则,如下:
[root@centos7 ~]# iptables -I INPUT -d 10.1.252.161 -p tcp --dport 80 -m time --weekdays 6 -j REJECT
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 10 packets, 780 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            10.1.252.161         tcp dpt:80 TIME on Sat UTC reject-with icmp-port-unreachable
 3041  234K ACCEPT     tcp  --  *      *       0.0.0.0/0            10.1.252.161         multiport dports 22,23,80

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  165 54078 REJECT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            tcp spt:80 STRING match  "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable
 2063  220K ACCEPT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            multiport sports 22,23,80
 
========================================================================================== 
[root@CentOS6 ~]# curl http://10.1.252.161/text.html
   # 卡在这里不动了,规则设定之前是可以访问的

connlimit 

根据每客户端IP做并发连接数限制,即限制单IP可同时发起的连接请求数;

  • --connlimit-upto n:连接数小于等于阈值(上限);

  • --connlimit-above n:连接数超出阈值;

演示:

 对于ssh服务,每客户端发起的单ip不能超过2个,规则如下:

[root@centos7 ~]# iptables -I INPUT -d 10.1.252.161 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 13 packets, 1014 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            10.1.252.161         tcp dpt:22 #conn src/32 > 2 reject-with icmp-port-unreachable
 3944  307K ACCEPT     tcp  --  *      *       0.0.0.0/0            10.1.252.161         multiport dports 22,23,80

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  165 54078 REJECT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            tcp spt:80 STRING match  "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable
 2794  418K ACCEPT     tcp  --  *      *       10.1.252.161         0.0.0.0/0            multiport sports 22,23,80

测试没有是可以的

  由于篇幅限制,后续内容请查看http://1992tao.blog.51cto.com/11606804/1864763谢谢关注!!!