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

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

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

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

1
    # iptables -t filter -X clean_in

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

1
    # 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…] :查看修改规则命令组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    -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 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   -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规则保存 

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

3. iptables隐含扩展配置

 1)tcp协议的隐含扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    -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 协议的隐含扩展

1
2
3
4
5
6
7
8
9
10
   -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 协议的隐含扩展 

1
2
3
4
5
6
7
8
   -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离散端口。

1
2
3
4
5
6
7
8
9
   -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地址范围

1
2
3
4
5
6
7
8
    -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:指定时间范围匹配

1
2
3
4
5
6
7
8
9
10
    -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 --time-stop 18:00:00 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 901 -j ACCEPT

4) string:字符串过滤

1
2
3
4
5
6
7
8
    -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对指定服务的最大并发链接数

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

6)limit:报文速率控制 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    -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:状态匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    -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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    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-flags ALL ALL -j DROP

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    举例: 三台主机,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,网络地址端口转换;外部主机端口使用一个地址,但是选择一个动态端口映射,建立一个会话表。

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

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

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

1
2
3
4
5
6
7
8
9
10
    例子: 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,让互联网上主机访问本地内网中的某服务器上的服务,(发布)

 
  例子: 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
     
    这样外网地址主机发出访问到中间主机,请求会被转发到内网主机。

iptables(1)工具详解的更多相关文章

  1. Chrome开发者工具详解(5)-Application、Security、Audits面板

    Chrome开发者工具详解(5)-Application.Security.Audits面板 这篇文章是Chrome开发者工具详解这一系列的最后一篇,介绍DevTools最后的三个面板功能-Appli ...

  2. iptables Data filtering详解

    内容简介防火墙的概述iptables简介iptables基础iptables语法iptables实例案例详解(一)防火墙的简介防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内 ...

  3. Chrome开发者工具详解(4)-Profiles面板

    Chrome开发者工具详解(4)-Profiles面板 如果上篇中的Timeline面板所提供的信息不能满足你的要求,你可以使用Profiles面板,利用这个面板你可以追踪网页程序的内存泄漏问题,进一 ...

  4. Chrome开发者工具详解(3)-Timeline面板

    Chrome开发者工具详解(3)-Timeline面板 注: 这一篇主要讲解面板Timeline,参考了Google的相关文档,主要用于公司内部技术分享.. Timeline面板 Timeline面板 ...

  5. Chrome开发者工具详解(2)-Network面板

    Chrome开发者工具详解(2)-Network面板 注: 这一篇主要讲解面板Network,参考了Google的相关文档,主要用于公司内部技术分享. Chrome开发者工具面板 面板上包含了Elem ...

  6. Chrome开发者工具详解(1)-Elements、Console、Sources面板

    Chrome开发者工具详解(1)-Elements.Console.Sources面板 Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Netwo ...

  7. oracle tkprof 工具详解

    oracle  tkprof 工具详解 今天是2013-09-26,进行tkprof工具使用学习,在此记录一下笔记: 一)查看需要跟踪会话信息: select s.sid,s.serial#,s.us ...

  8. [转帖]前端-chromeF12 谷歌开发者工具详解 Network篇

    前端-chromeF12 谷歌开发者工具详解 Network篇 https://blog.csdn.net/qq_39892932/article/details/82493922 blog 也是原作 ...

  9. [转帖]前端-chromeF12 谷歌开发者工具详解 Sources篇

    前端-chromeF12 谷歌开发者工具详解 Sources篇 原贴地址:https://blog.csdn.net/qq_39892932/article/details/82498748 cons ...

随机推荐

  1. [Xcode 实际操作]八、网络与多线程-(7)使用MessageUI框架,创建并发送一封带有附件的邮件

    目录:[Swift]Xcode实际操作 本文将演示如何使用MessageUI框架,创建并发送一封带有附件的邮件. 使用邮件编辑视图控制器(MFMailComposeViewController)实现邮 ...

  2. python 之 函数 装饰器

    5.8 装饰器 1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提 ...

  3. eclipse添加tomcat运行环境

  4. PostgreSQL - 查询表结构和索引信息

    前言 PostgreSQL的表一般都是建立在public这个schema下的,假如现在有个数据表t_student,可以用以下几种方式来查询表结构和索引信息. 使用\d元命令查看表字段信息和索引信息 ...

  5. excel输入值非法,限定了可以输入的数值怎么办

    回到excel的编辑界面,点击工具栏的“数据”标签,如图所示. 继续在“数据”标签的下面找到“数据验证”或“数据有效性”的按钮,点击该选项,然后继续下一步. 在弹出的选择框中选择“数据验证”选项,如图 ...

  6. [题解](最短路)luogu_P5122 Fine Dining

    首先理解这里的美味值相当于给你更多时间让你经过这个草垛的, 也就是在经过草垛时可以给你的时间减少w[i],这样能否比最短路不慢 然而我们并不容易知道怎么走才是最好的,所以要想办法避免找这个方案 我们新 ...

  7. CF #541div2 D

    题目本质:形成一个拓扑图,不应带自环. 解决方法: 1.先把等于号的部分用dsu缩点: 2.大于和小于号建立拓扑关系: 3.n*m的矩阵,只要用标号n+j代表m集合的第j个就从二维降到一维了: 4.d ...

  8. Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理

    线纹理的代码非常简单,但是我们有必要在这之前首先了解它们背后的实现原理. 深度纹理实际上就是一张渲染纹理,只不过它里面存储的像素值不是颜色值而是一个高精度的深度值.由于被存储在一张纹理中,深度纹理里的 ...

  9. Function ereg() is deprecated in

    PHP 5.3 ereg() 无法正常使用,提示"Function ereg() is deprecated Error".问题根源是php中有两种正则表示方法,一个是posix, ...

  10. hdu4832Chess(dp)

    链接 这题第一想法是矩阵,不过范围太大了,然后就没有思路了.. 之后看到群里的解法,行和列可以分着走,两者是互不影响的,这样就把二维转换成了一维,直接dp求出就可以了. 然后再组合相乘一下. #inc ...