iptables

 

1、防火墙简介

  防火墙是我们在外网接收数据进行过滤的第一道防线,也可能是最后一道防线,它是一个隔离工具,工作在主机或网络的边缘,对经由的报文根据预先定义好的规则或者说是识别标准进行检测,对于能够匹配到的报文则根据预先生成的规则进行处理的一套组件。防火墙也有分类,其分类主要以下两种:  
  硬件防火墙:主要在硬件级别上实现部分功能。  
  软件防火墙:主要在应用软件逻辑在通用硬件的基础上实现。

防火墙拓扑.png

2、iptables/netfilter简介

iptables是一个生成规则,可以保存到文件重载使用的一个用户命令,工作在应用层当中,它解析命令行并将防火墙策略传递给内核。而在netfilter中,它是一个防火墙的框架,将iptables的规则承载并生效,本身并不对数据包进行过滤,它只是允许可以过滤数据包的函数挂接到内核中适当位置。

3、规则链与策略

  众所周知,内核是面向硬件从而用来对硬件进行管理和驱动,它也有不同的功能,进程管理、内存功能、网络协议栈功能、安全功能、文件系统、驱动程序等。那么防火墙就工作在网络协议栈上,它是安全功能的一种,其功能在内核中共分为五个,分别是路由前(prerouting)、路由后(postrouting)、导入(input)、导出(output)和转发功能(forward)。使其规则生效,我们称之为钩子函数,工作在netfilter之上。我们可以自己定义一个规则链,而后手动关联至指定的钩子上,使其生效。  
  在iptables命令当中对以上功能是一样的,不过是要在netfilter当中生效,对于在iptables当中来说,我们称之为"规则链",我们自己定义规则是要写到上面去的,而每个链都有属于它的功能,其功能分为四个,我们称之为"表",优先级我们也是由高而低。分别是:

raw::关闭nat表上启用的链接追踪机制 
mangle:拆解报文,做出修改,而后重新封装
NAT:负责地址解析转换。修改数据包中的源、目标IP地址或端口
filter:对数据包进行过滤

  每一个功能对应一个钩子函数,分别是:

raw:prerouting、output 
mangle:prerouting、forward、postrouting、input、output nat:
prerouting、input、output、postrouting
filter:input、forward、output

默认的表和链的示意图.png

4、iptables命令使用

  我们知道,我们的操作都是在shell界面下来进行的,根本无法直接接触内核,对于防火墙来说也是一样,它也是有用户命令的,可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。
 每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处 理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。安装netfilter位于内核中的tcp/ip协议栈报文处理框架,对于iptables来说,在CentOS
 5/6中用来生成规则,可保存于文件中以反复装载生效。  
iptables的命令格式如下:

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

  以上就是命令的格式,使用iptables管理时,都会有它的子命令,其子命令如下:  
  COMMANDs:  
  链管理:

-N, --new-chain chain    新建一个自定义的链 
-X, --delete-chain [chain]    删除用户自定义的引用计数器为0的链
-F, --flush [chain]    清空指定规则链上的规则 
-E, --rename-chain old-chain new-chain 重命名链
-Z, --zero [chain [rulenum]]    置零计数器 
-P, --policy chain target   设置规则链的默认值,默认值有:ACCEPT、DROP

  需要注意的是:每个规则都由两个计数器,一个是packets,它是被本规则所匹配到的所有报文的个数;另一个是bytes,被本规则所匹配到的所有报文的大小之和。

  除了链管理之外,还有规则管理以及规则显示,其子命令如下:  
规则管理:

-A, --append chain rule-specification   追加新规则与指定链的尾部 
-I, --insert chain [rulenum] rule-specification   插入新规则于指定链的指定位置,默认为首部 
-R, --replace chain rulenum rule-specification   替换指定的规则为新的规则 
-D, --delete chain rulenum   根据规则编号删除规则 
-D, --delete chain rule-specification   根据规则本身删除规则

  规则显示:

-L, --list [chain]    列出规则     
    -v, --verbose  详细信息    
    -n, --numberic  数字格式显示主机地址和端口号     
    -x,--exact    显示计数器的精确值     
    --line-numbers  列出规则时,显示其在链上的相应的编号 
-S, --list-rules [chain]  显示指定链上的所有规则

  以上就是对于子命令的规则介绍,但是添加添加规则时,还需考量一下因素:  
  1、实现的功能:用于判定规则添加至那个表中。  
  2、报文流经的位置:用于判定规则添加至那个链当中。  
  3、报文的流向:判断规则何为"源",何为"目标"。  
  4、匹配条件:用于编写正确的匹配规则,条件如下:  
    (1) 专用于某种应用的同类规则,匹配交小的放前面。  
    (2) 专用于某种应用的不用泪规则,匹配较大的放在后面。  
    (3) 用于通用目的的规则放在前面。  
  以上就是我们添加规则时所考量的因素,其中filter表就是防火墙的核心所在,那么在所有的规则编辑或者定义完成之后,自然少不了它的匹配条件,那么匹配条件也分为两种,一种是通用匹配和扩展匹配,另一种是跳转目标,归结如下:

[!] -s, --source address[/mask][,...]  检查报文的源IP地址是否镀铬此处指定的范围,或是否等于此处给定的地址。
[!] -d, --destination address[/mask][,...]  检查报文的目标IP地址是否符合此处的指定范围,或是否等于此处。 
[!] -p, --protocol protocol     匹配报文中的协议,可用值为tcp, udp, icmp等,或者"all",亦可以数字格式指明协议。 
-m, --match match  调用指定的扩展匹配模块来匹配条件检查机制。 
[!] -i, --in-interface name  限定报文仅能够从指定的接口流入。
[!] -o, --out-interface name  限定报文仅能够从指定的接口流出。

  以上就是通用匹配,接下来介绍跳转目标,选项为-j,那么跳转目标每个意义都不一样,归结如下:  
  1、ACCEPT允许通过。  
  2、LOG:记录日志信息。  
  3、REJECT:拒绝通过,给出提示。  
  4、DROP:直接丢弃,不给出任何回应。 

 

 

一、 iptables 查看链表,创建链表,类命令

 

    1. iptables [-t table] -N chain : 创建一条自定义规则的链 

 

    # iptables -t filter -N clean_in 
    注: 自定义链在没有被引用之前是不起作用的。

 

    2. iptables [-t filter] -X [chain] : 删除一个自定义链

 

    # iptables -t filter -X clean_in

 

    3. iptables [-t table] -E old-chain-name new-chain-name : 为一个自定义链修改名字

 

    # iptables -t filter -E clean_in clean_in_httpd

 

    4. iptables [-t table] -P chain target : 为链指定默认策略,指定默认规则

 

    5. iptables [-t table] {-F|-L|-Z} [chain [runlenum]] [options…] :查看修改规则命令组

 

    -F : 清空链中的规则,规则具有编号,从上到下,从1开始 
    -L: list,列出表中的所有规则 
        -n: 数字格式显示IP和Port 
        -v: 详细格式显示 
            pkts    bytes    target    prot    opt    in    out    source    destination
            
            每个字段的含义: 
            pkts: packets, 被本规则所匹配到的报文的个数;
            bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;
	    target: 目标,即处理机制;
	    prot: 协议,一般为{TCP|UDP|ICMP}; 
	    opt: 可选项
	    in: 数据包的流入接口;
	    out: 数据包的流出接口;
	    source: 源地址;
	    destination: 目标地址;
    -X: exactly, 精确值,不执行单位换算
    --line-number: 显示各规则的行号 
    -Z: 匹配数量清零

 

二、 iptables 添加和编辑规则相关命令 

 

    1. iptables [-t table] {-A | -D} chain rule-specification 

 

   -A: append, 附加一条规则
   -D chain [rulenum] rule-specification: 删除一条规则
   -I chain [rulenum] rule-specification : 修改规则
   -R chain [rulenum] rule-specification:替换指定规则
   -S chain [rulenum] 只显示链上的规则添加
   
    rule-specification格式 :
    匹配条件 -j 处理机制 
    
    通用匹配条件:
        -s: 匹配原地址,可以IP,也可以是网络地址,可以使用!操作符取反,!192.168.0.0/16; -s 相当于 --src 或 --source 
        -d: 匹配目标地址 
        -p: 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一; 
        -i:数据报文流入的接口:通常用于INPUT, FORWARD, PREROUTING
        -o:流出接口,通常只用于OUTPUT,FORWARD,和POSTROUTING
    -j target 
        RETURN:返回调用链
        ACCEPT: 放行 
 
    举例:
    1. 允许192.168.98.0/24网段ping通,当前192.168.98.128主机
    # iptables -t filter -A INPUT  -i eth0 -s 192.168.98.0/24 -d 192.168.98.128/24 -p ICMP -j ACCEPT 
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -d 192.168.98.0/24 -p ICMP -j ACCEPT   
    
    结果; ICMP INPUT和OUTPUT链都有匹配到      
    Chain INPUT (policy ACCEPT 57 packets, 4188 bytes)
    pkts bytes target     prot opt in     out     source               destination         
    29   2436  ACCEPT     icmp --  eth0   *       192.168.98.0/24      192.168.98.0/24 
   
    Chain OUTPUT (policy ACCEPT 41 packets, 4980 bytes)
    pkts bytes target     prot opt in     out     source               destination         
    29   2436  ACCEPT     icmp --  *      *       192.168.98.128       192.168.98.0/24

 

    2. iptables规则保存 

 

    # service iptables save: 默认会被保存在/etc/sysconfig/iptables文件中,start的时候也会从这里读取
    
    下面两种方式也可以存取
    # iptables-save > /path/to/some_rulefile
    # iptables-restore < /path/from/some_rulefile

 

    3. iptables隐含扩展配置

 

        1)tcp协议的隐含扩展

 

    -p tcp 
        --dport m[-n]:匹配的目标端口,可以使连续的多个端口
        --sport: 源端口 
        --tcp-flags rst,syn,ack,fin syn : 空格之前表示匹配哪些标识位,空格之后是哪些标识位为1 
        --syn:单独匹配某一项标识位
        所有使用的值: URG, PSH, RST, SYN, ACK, FIN,ALL, NONE
        
        举例: 释放所有192.168.98.0/24网段的ssh服务
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp --dport 22 -j ACCEPT 
        # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp --sport 22 -j ACCEPT 
        # iptables -t filter -P INPUT DROP
        # iptables -t filter -P OUTPUT DROP
        
        结果: ssh链接不会断开,可以看见进出都有报文匹配,而ping报文会被drop 
            Chain INPUT (policy DROP 45 packets, 3588 bytes)
            pkts bytes target     prot opt in     out     source               destination         
            967 70220 ACCEPT     tcp  --  *      *       192.168.98.0/24      192.168.98.0/24     tcp dpt:22        

            Chain OUTPUT (policy DROP 22 packets, 5608 bytes)
            pkts bytes target     prot opt in     out     source               destination         
            426 48420 ACCEPT     tcp  --  *      *       192.168.98.0/24      192.168.98.0/24     tcp spt:22

 

        2) udp 协议的隐含扩展

 

   -p udp : udp报文相关的拓展匹配
        --dport 
        --sport 
        放行本机的tftp服务
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 69 -j ACCEPT 
        # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 69 -j ACCEPT 
        
        放行本机DNS服务
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 53 -j ACCEPT 
        # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 53 -j ACCEPT

 

        3) icmp 协议的隐含扩展 

 

   -P icmp : icmp协议相关拓展 
        --icmp-type
            8: ping 请求 
            0:ping 响应 
            
        释放本机的ping请求 
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p icmp --icmp-type 8 
        # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p icmp --icmp-type 0

 

    4. 显示扩展:必须指定的扩展模块

 

        -m    扩展模块名称    –专用选项1    –专用选项2

 

        1) multiport:多端口匹配模块,一次可以指定最多15离散端口。 

 

   -m multiport 
       --source-ports,--sports port[,port|,port:port] : 指定源端口
       --destination-port, --dports: 指定目标端口 
       --ports: 指定源端口和目标端口
   
   举例: 
   开放本机所在网络,ssh和web服务。 
   # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp -m multiport --dport 22,80 -j ACCEPT 
   # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp  -m multiport --sport 22.80 -j ACCEPT

 

        2) iprange:匹配ip地址范围

 

    -m iprange: 
        [!] --src-range from[-to]
        [!] --dst-range from[-to]
    
    举例:
    开放本机ssh给192.168.98.1-192.168.98.120访问
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m iprange --src-range 192.168.98.1-192.168.98.120 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 22 -m iprange --dst-range 192.168.98.1-192.168.98.120 -j ACCEPT

 

        3)time:指定时间范围匹配

 

    -m time 
        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
        --timestart hh:mm[:ss]
        --timestop hh:mm[:ss]
        [!] --weekdays day[,day...]
        
    举例,在工作日时间开放samba(tcp, 901端口) 服务
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 901 -j ACCEPT

 

        4) string:字符串过滤

 

    -m string 
        --algo {bm|kmp}:字符匹配查找时使用的算法
        --string "STRING" : 要查找的字符串
        --hex-string "HEX-STRING": 要查找的字符,先编码成16进制格式,可以提高查询效率
    
    举例: 禁止本机的web报文,包含‘hello’字符
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 80 -j ACCEPT 
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --sport 80 -m string --algo bm --string "hello" -j DROP

 

        5) connlimit:每个ip对指定服务的最大并发链接数

 

    -m connlimit 
        --connlimit-above [0]:此选项用于,坚定某个IP是正常访问还是发起攻击

 

        6)limit:报文速率控制 

 

    -m limit 
        --limit #/[/second|/minute|/hour|/day]  限制速率
        --limit-burst # 峰值速率
    
    举例: 防御DDos攻击
    # iptables -t filter -I INPUT -d 192.168.98.128 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT
    在另一台主机上,使用hping3命令发起攻击 
    # hping -1 -c 10000 -i u1  192.168.98.128
    
    结果: 
    Chain INPUT (policy DROP 9990 packets, 280K bytes)
    pkts bytes target     prot opt in     out     source               destination
    10   280 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.98.128	icmp type 8 limit: avg 2/sec burst 10
    
    可以看到只有10个报文通过,其他的icmp请求全被drop了

 

        7)state:状态匹配

 

    -m state 
        --state 
            NEW:新建连接
            ESTABLISHED:已经建立的连接  
            RELATED:与现有连接有关联的连接 
            INVALID: 异常连接
              
    状态匹配是由ip_conntrack, nf_conntrack两个模块实现的。 
    # cat /proc/sys/net/nf_conntrack_max 
     定义了连接追踪的最大值,因此,建议按需调大此值;
    # cat /proc/net/nf_conntrack
     记录了当前追踪的所有连接
    # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
     记录建立的连接超时时间
     
    法则:
        1. 对于进入的状态为ESTABLISHED都应该放行;
        2. 对于出去的状态为ESTABLISHED都应该放行;
        3. 严格检查进入的状态为NEW的连接;
        4. 所有状态为INVALIED都应该拒绝;	
   
   举例:放行工作于被动模式下的FTP服务
      1. 确保iptables加载ftp协议支持的模块:ip_nat_ftp, ip_conntrack_ftp
        编辑/etc/sysconfig/iptables-config文件,定义如下参数:
        IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
      2. 开放命令连接端口,tcp 21号端口 
        # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
      3. 放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;
        # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
        # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT
      如果只开放命令连接的话,依然可以进行身份认证,但是无法下载,或者查看目录
      
   启动服务时的最后一个服务通常是/etc/rc.d/rc.local (/etc/rc.local),这事实上是一个脚本,但凡写在此脚本中的命令或脚本调用都在系统运行至此服务被执行

 

    5. INPUT和OUTPUT默认策略为DROP的一些实例 

 

    1. 限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon  -j ACCEPT
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
    # iptables -t filter -A OUTPUT-s 192.168.98.128 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT
    
    2. 在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给192.168.98.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个
    # iptables -t filter -R INPUT 2 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
    # iptables -t filter -R INPUT 3 -d 192.168.98.128  -s 192.168.98.0/24 -p tcp -m state --state RELATED  -m limit --limit 5/min  -j ACCEPT
    # iptables -t filter -A INPUT -d 192.168.98.128  -s 192.168.98.0/24 -p tcp -m state --state ESTABLISHED  -j ACCEPT
    # iptables -t filter -A OUTPUT -d 192.168.98.0/24 -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT 
    
    3. 开放本机的ssh服务给192.168.98.1-192.168.98.100中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.98.1-192.168.98.100 -m limit --limit 2/min -j ACCEPT 
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.98.1-192.168.98.100  -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 22 -m iprange --dst-range 192.168.98.1-192.168.98.100 -m state --state ESTABLISHED -j ACCEPT
    
    4. 拒绝TCP标志位全部为1及全部为0的报文访问本机;
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --tcp-flags ALL ALL -j DROP

 

三、 iptables 当做网络防火墙的一些设置

 

    1. FORWARD 链限定本机路由功能 

 

        对于Linux主机来说,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启了路由功能;

 

        如果对于转发进行限定,需要在FORWARD链上面进行限定规则。 

 

    举例: 三台主机,vm1,vm2,vm3 
         vm1: IP地址,192.168.98.128 
         vm2: IP地址,192.168.98.129 另一块网卡为172.25.136.1 
         vm3:IP地址,172.25.136.2
    只开通vm1和vm3之间的ping 请求 
    
    ## 设置vm1主机
    # route add default gw 192.168.98.129 
    
    ## 设置vm3主机 
    # route add default gw 172.25.136.2 
    
    ## 设置vm2主机
    # echo 1 /proc/sys/net/ipv4/ip_forward 
    # iptables -t filter -A FORWARD -s 192.168.98.128 -d 172.25.136.2 -p icmp -j ACCEPT 
    # iptables -t filter -A FORWARD -s 172.25.136.2 -d 192.168.98.128 -p icmp -j ACCEPT 
    # iptables -P FORWARD DROP

 

    2. NAT(过载技术)地址转换相关应用

 

        Basic NAT: 静态NAT;地址端口池子

 

                内部主机都需要外部主机地址池中的一个地址

 

        NAPT:动态NAT,网络地址端口转换;外部主机端口使用一个地址,但是选择一个动态端口映射,建立一个会话表。 

 

   使用命令:
    iptables基于SNAT和DNAT这两个目标实现地址转换技术;
            -j SNAT --to-source SIP
            规则添加:POSTROUTING链
            -j MASQUERADE : 地址伪装,无需知道原地址是什么,自动找到可以使用的互联网地址,拨号时候可以使用。
            -j DNAT --to-destination DIP[:PORT]
            支持端口映射

 

            所有nat相关转换,如果限定访问内容,可以在forward 链上面做限定        

 

        1)源地址转换:SNAT,用于让内网主机访问互联网

 

SNAT.png

 

    例子: vm1: IP地址,192.168.98.128 模拟内网
         vm2: IP地址,192.168.98.129 另一块外网网卡为172.25.136.1
         vm3:IP地址,172.25.136.2 模拟外网
    开通使内网通过SNAT访问外网服务器。 
    ## 内网主机vm1设置路由
    # route add default gw 192.168.98.129
    
    ## 中间主机vm2 
    # iptables -P FORWARD ACCEPT 
    # iptables -t nat -A POSTROUTING -d 192.168.98.0/24 -j SNAT --to-source 172.25.136.1

 

        2)目标地址转换:DNAT,让互联网上主机访问本地内网中的某服务器上的服务,(发布)

 

    DNAT.png

 

    例子: vm1: IP地址,192.168.98.128 模拟内网
          vm2: IP地址,192.168.98.129 另一块外网网卡为172.25.136.1
          vm3:IP地址,172.25.136.2 模拟外网
    开通使内网通过DNAT使得外网访问内网主机web服务器。
    ## 内网vm1服务器需要路由指向vm2内网地址,否则请求无法返回
    # route add default gw 192.168.98.129
    
    ## 外网vm3需要可以向vm2外网地址通信 
    # route add default gw 172.25.136.1 
    
    ## vm2主机设置目标地址转换条目 
    # iptables -t nat -A POSTROUTING -d 172.25.136.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.98.128
    
    这样外网地址主机发出访问到中间主机,请求会被转发到内网主机。


生产中实例:

实例一、关闭所有的 INPUT FORWARD OUTPUT

下面是命令实现:

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

再用命令 iptables -L -n 查看 是否设置好, 应看到全部 DROP

这样的设置好了,我们只是临时的, 重启服务器还是会恢复原来没有设置的状态

此时使用 service iptables save 进行保存

firewall rules 防火墙的规则保存在 /etc/sysconfig/iptables

 

实例二、只打开22端口

iptables -A INPUT -p tcp –dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT

再查看 iptables -L -n 是否添加上去

最后别忘记了保存 对防火墙的设置

通过命令:service iptables save 进行保存

iptables -A INPUT -p tcp –dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT

 

实例3、禁止某个IP访问

1台Linux服务器,2台windows8 操作系统进行访问

Linux服务器ip 192.168.1.99

win8_1 ip: 192.168.1.2

win8_2 ip: 192.168.1.8

现在要禁止 192.168.1.2 win8_1 访问, win8_2 正常访问,

iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP

正常访问的 192.168.1.8 win8_2是可以正常访问的

 

实例4、如何删除规则

首先我们要知道 这条规则的编号,每条规则都有一个编号

通过 iptables -L -n –line-number 可以显示规则和相对应的编号

num target prot opt source destination

1 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306

2 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:21

3 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

多了 num 这一列, 这样我们就可以看到刚才的规则对应的是编号2。进行删除

iptables -D INPUT 2

删除INPUT链编号为2的规则。

再 iptables -L -n 查看一下已经被清除了。

 

实例5、过滤无效的数据包

假设有人进入了服务器,或者有病毒木马程序,它可以通过22,80端口像服务器外传送数据。

它的这种方式就和我们正常访问22,80端口区别。它发向外发的数据不是我们通过访问网页请求而回应的数据包。

下面我们要禁止这些没有通过请求回应的数据包,统统把它们堵住掉。

iptables 提供了一个参数 是检查状态的,下面我们来配置下 22 和 80 端口,防止无效的数据包。

iptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT

可以看到和我们以前使用的:

iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT

多了一个状态判断。

同样80端口也一样,现在删掉原来的2条规则,

iptables -L -n –line-number 这个是查看规则而且带上编号。我们看到编号就可以删除对应的规则了。

iptables -D OUTPUT 1 这里的1表示第一条规则。

当你删除了前面的规则, 编号也会随之改变。

我们删除了前面2个规则,22端口还可以正常使用,说明没问题了

service iptables save 进行保存。

Saving firewall rules to /etc/sysconfig/iptables: [ OK ]

其实就是把刚才设置的规则写入到 /etc/sysconfig/iptables 文件中。

 

实例6、DNS端口53设置

下面我们来看看如何设置iptables来打开DNS端口,DNS端口对应的是53

大家看到我现在的情况了吧,只开放22和80端口,我现在看看能不能解析域名。

host www.google.com 输入这个命令后,一直等待,说明DNS不通出现下面提示 :

;; connection timed out; no servers could be reached

ping 一下域名也是不通

[root@localhost ~ping www.google.com

ping: unknown host www.google.com

我这里的原因就是 iptables 限制了53端口。

有些服务器,特别是Web服务器减慢,DNS其实也有关系的,无法发送包到DNS服务器导致的。

下面演示下如何使用 iptables 来设置DNS 53这个端口,如果你不知道域名服务端口号,你可以用命令 : grep domain /etc/services

[root@localhost ~grep domain /etc/services

domain 53/tcp # name-domain server

domain 53/udp

domaintime 9909/tcp # domaintime

domaintime 9909/udp # domaintime

我们一般使用 udp 协议。

iptables -A OUTPUT -p udp –dport 53 -j ACCEPT

这是我们 ping 一个域名,数据就是从本机出去,所以我们先设置 OUTPUT,我们按照ping这个流程来设置。

然后 DNS 服务器收到我们发出去的包,就回应一个回来

iptables -A INPUT -p udp –sport 53 -j ACCEPT

同时还要设置

iptables -A INPUT -p udp –dport 53 -j ACCEPT

iptables -A OUTPUT -p udp –sport 53 -j ACCEPT

下面开始测试, 可以用 iptables -L -n 查看设置情况,确定没有问题就可以测试了

[root@localhost ~iptables -L -n

Chain INPUT (policy DROP)

target prot opt source destination

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp spt:53

ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:53

Chain FORWARD (policy DROP)

target prot opt source destination

Chain OUTPUT (policy DROP)

target prot opt source destination

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp spt:22 state ESTABLISHED

ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp spt:80 state ESTABLISHED

ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:53

ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp spt:53

可以测试一下是否 DNS 可以通过iptables 了。

 

iptables操作实例:

允许来自172.16.0.0网络访问本机地址的TCP服务

 

[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.250.149 -p tcp -j ACCEPT    

 

 

在INPUT加一条规则,来自172.16.0.0网络的任何主机源地址访问172.16.250.149目标地址的TCP协议,都允许

 

[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -s 172.16.0.0/16 -p tcp -j ACCEPT

     

允许本机访问172.16.0.0网络的任何主机的TCP协议

 

[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp -j ACCEPT
[root@localhost ~]#iptables -P INPUT DROP
[root@localhost ~]#iptables -P FORWARD DROP
[root@localhost ~]#iptables -P OUTPUT DROP  

 

允许本机访问172.16.0.0网络的任何主机的所有协议

 

[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -j ACCEPT

 

允许任何人ping本机

 

[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p icmp -j ACCEPT (ping的报文可以进来)
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -p icmp -j ACCEPT(ping的报文可以出去)

用另一台主机ping本机

 

[root@localhost ~]#ping 172.16.250.149
PING 172.16.250.149 (172.16.250.149) 56(84) bytes of data.
64 bytes from 172.16.250.149: icmp_seq=1 ttl=64 time=5.41 ms

然后进行抓包

 

[root@localhost ~]#tcpdump -i ens33 -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
23:19:33.521746 IP 172.16.252.245 > 172.16.250.149: ICMP echo request, id 4370, seq 1, length 64

 

本机SSH服务能被172.16.0.0网络内主机访问,并添加为INPUT和OUTPUT第一条规则

 

[root@localhost ~]#iptables -I INPUT -s 172.16.0.0/16 -d 172.16.250.149 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]#iptables -I OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT


1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

配置系统INPUT和OUTPUT默认策略为DROP
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP

限制本地主机的web服务器在周一不允许访问
# iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays 1 -j ACCEPT
新请求的速率不能超过100个每秒
# iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -j ACCEPT
web服务器包含了admin字符串的页面不允许访问
# iptables -A OUTPUT -m string --algo kmp ! --string "admin" -j ACCEPT
web服务器仅允许响应报文离开本机
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

# iptables -A INPUT -p tcp --dports 20,21 -s 172.16.0.0/16 -m time --weekdays 1,2,3,4,5 --timestart 8:30 --timestop 18:00 -m state --state NEW -m limit --limit 5/minute -j ACCEPT

3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

ip修改为本人实际操作环境
# iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.12.1-192.168.12.254 -m limit --limit 2/minute -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.12.130 -m state --state ESTABLISHED -j ACCEPT

4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

# iptables -A INPUT -p tcp ! --tcp-flags all all -j ACCEPT
# iptables -A INPUT -p tcp ! --tcp-flags all none -j ACCEPT

5、允许本机ping别的主机;但不开放别的主机ping本机;

# iptables -A OUTPUT -s 192.168.12.130 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 192.168.12.130 -p icmp --icmp-type 0 -j ACCEPT

6、判断下述规则的意义:

  # iptables -N clean_in
  新增一条自定义链clean_in
  
  # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
  在自定义链clean_in中添加规则:丢弃对受限广播的地址255.255.255.255的ping包
  # iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
  在自定义链clean_in中添加规则:丢弃对172.16.0.0/16网段广播地址的ping包

  # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
  在自定义链clean_in中添加规则:丢弃TCP连接非第一次握手的新请求包
  # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
  在自定义链clean_in中添加规则:丢弃标志位全为1的tcp报文
  # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
  在自定义链clean_in中添加规则:丢弃标志位全为0的tcp报文
  # iptables -A clean_in -d 172.16.100.7 -j RETURN 
  在自定义链clean_in中添加规则:目的地址为172.16.100.7的报文返回主链
  

  # iptables -A INPUT -d 172.16.100.7 -j clean_in
  对目的地址为172.16.100.7的报文调用自定义链clean_in

  # iptables -A INPUT  -i lo -j ACCEPT
  允许数据报文流入本地回环接口lo
  # iptables -A OUTPUT -o lo -j ACCEPT
  允许数据报文流程本地回环接口lo


  # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
  指定流入接口为eth0,访问tcp端口53,113,135,137,139,445的报文丢弃
  # iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
  指定流入接口为eth0,访问udp端口53,113,135,137,139,445的报文丢弃
  # iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP
  丢弃流入接口为eth0,访问udp 1026端口的请求
  
  # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
  丢弃流入接口为eth0,访问1433,4899端口的tcp数据报文
    
  # iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT
  限制ping包速率每秒不超过10个
  
  创建了一个名为clean_in的自定义链,该链用来对目标地址为172.16.100.7的所有访问进行初次过滤,将含有非法的广播ping包以及异常的tcp连接剔除出去,剩下的包则通过RETURN返回给INPUT链,并由INPUT链后面的策略继续进行匹配
  INPUT链允许对本地lo的请求包以及由lo发出的包
  INPUT链拒绝到本机dns,nfs访问,4899,1433,1026端口,并拒绝每秒超过10次的Flood-ping包

7、通过tcp_wrapper控制vsftpd仅允许172.16.0.0/255.255.0.0网络中的主机访问,但172.16.100.3除外;对所被被拒绝的访问尝试都记录在/var/log/tcp_wrapper.log日志文件中;

# vim /etc/hosts.allow
vsftpd:172.16. EXCEPT 172.16.100.3

# vim /etc/hosts.deny
vsftpd:ALL:spawn /bin/echo $(date) login attempt from %c to %s, %d >> /var/log/tcp_wrapper.log



8、

基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;

  • (1) 对本机的ping请求每分钟不得超出20个;
  • (2) 每客户端对本机的ssh的并发连接数不得超过3个;
  • (3) 本机的telnet服务仅允许工作时间内访问;
iptables -I INPUT -d 10.1.6.72 -p icmp --icmp-type 8 -m limit --limit-burst 1 --limit 20/minute    
    设置对本机的ping请求不超过20/min

~]# iptables -I INPUT -d 10.1.6.72 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT    
    设置22端口 ssh的连接数不能大于3个

iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --weekdays Sat,Sun --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
    设置周六周天拒绝telnet服务

iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --timestart 10:00:00 --timestop 00:00:00 --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
    设置非工作时间禁止使用telnet

iptables -A INPUT -d 10.1.6.72 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    设置允许RELATED ESTABLISHED

 ~]# iptables -A INPUT -d 10.1.6.72 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
     设置对21:22:80:139:445第一次请求不限制
iptables -A INPUT -d 10.1.6.72 -p udp -m multiport --dport 138,139 -m state --state NEW -j ACCEPT
    设置对138,139号udp端口的第一次相应不限制

iptables -A INPUT -d 10.1.6.72/32 -j REJECT
    禁止其他对端口的访问


iptables -A OUTPUT -s 10.1.6.72 -p udp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 10.1.6.72 -p tcp -m state --state ESTABLISHED -j ACCEPT

iptables -I OUTPUT -s 10.1.6.72 -p icmp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 10.1.6.72/32 -j REJECT            


9.
cc攻击一到就有点兵临城下的感觉,正确的设置防护规则可以做到临危不乱,这里给出一个iptables对ip进行连接频率和并发限制,限制单ip连接和频率的设置规则的介绍

#单个IP在60秒内只允许新建20个连接,这里假设web端口就是80,

iptables -I  INPUT -i eth1 -p tcp -m tcp  --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name DEFAULT --rsource -j DROP

iptables -I INPUT -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name DEFAULT --rsource



#控制单个IP的最大并发连接数为20

iptables  -I INPUT -p tcp –dport 80 -m connlimit  –connlimit-above 20 -j REJECT  

#每个IP最多20个初始连接

iptables -I  INPUT -p tcp –syn -m connlimit –connlimit-above 20 -j DROP

 

posted @ 2017-07-15 22:15  chenghuan  阅读(248)  评论(0)    收藏  举报