iptables: 包过滤型防火墙

iptables: 包过滤型防火墙

Firewall: 防火墙,隔离工具;工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件;

  1. 主机防火墙
  2. 网络防火墙
  • ipfw

  • ipchains

  • iptables/netfilter

    • framework: netfilter
      hooks function
    • rule utils: iptables
  • 功能:

    filter: 过滤,防火墙;

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

    mangle:拆解报文,做出修改,封装报文;

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

  • 链(内置):

    • PREROUTING
    • INPUT
    • FORWARD
    • OUTPUT
    • POSTROUTING
  • 方向:

    • 流入:PREROUTING --> INPUT
    • 流出:OUTPUT --> POSTROUTING
    • 转发:PREROUTING --> FORWARD --> POSTROUTING
  • 各功能的分别实现:

    filter:INPUT, FORWARD, OUTPUT

    nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)

    mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

    raw:PREROUTING, OUTPUT

  • 路由发生的时刻:

    • 报文进入本机后:

      判断目标主机;

    • 报文发出之前:

      判断经由哪个接口送往下一跳;

  • iptables:四表五链

    • 添加规则时的考量点:

      要实现哪种功能:判断添加在哪张表上;

      报文流经的路径:判断添加在哪个链上;

    • 链:链上规则的次序,即为检查的次序;因此隐含一定的法则

      • 同类规则(访问同一应用),匹配范围小的放上面;
      • 不同类规则(访问不同应用),匹配到报文频率较大的放上面;
      • 将那些可由一条规则描述的多个规则合并为一个;
      • 设置默认策略;

        功能的优先级次序:raw --> mangle --> nat --> filter

  • 规则:

    组成部分:报文的匹配条件,匹配到之后处理动作

    • 匹配条件:根据协议报文特征指定
      • 基本匹配条件
      • 扩展匹配条件
    • 处理动作:
      • 内建处理机制
      • 自定义处理机制

    注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;

iptables:规则管理工具

添加、修改、删除、显示等;

规则和链有计数器:

pkts:由规则或链所匹配到的报文的个数;
bytes:由规则或链匹配到的所有报文大小之和;

iptables命令:

iptables [-t table] {-A|-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] -X [chain]

iptables [-t table] -P chain target

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

-t table:
  filter, nat, mangle, raw

iptables作用

  • 链管理:
-F:flush,清空规则链;省略链,表示清空指定表上的所有的链;
-N:new, 创建新的自定义规则链;
-X:drop, 删除用户自定义的空的规则链;
-Z:zero,清零,置零规则计数器;
-P:Policy,为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT, DROP, REJECT; 
-E: rEname,重命令自定义链;引用计数不为0的自定义链,无法改名,也无法删除;
  • 规则管理:
-A:append,将新规则追加于指定链的尾部;
-I:insert,将新规则插入至指定链的指定位置;
-D:delete,删除指定链上的指定规则;
  • 有两种指定方式:

    指定匹配条件;

    指定规则编号;

    -R:replace,替换指定链上的指定规则;
    
  • 查看:

    -L:list,列出指定链上的所有规则;
      -n: numberic,以数字格式显示地址和端口号;
      -v: verbose,显示详细信息;
      -vv, -vvv
      --line-numbers:显示规则编号;
      -x: exactly, 显示计数器计数结果的精确值;
    
  • 匹配条件:

    • 基本匹配:
      [!] -s, --src, --source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围;
      [!] -d, --dst, --destination IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围;
      -p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中的protocols所标识的协议;
      -i, --in-interface IFACE:数据报文的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;
      -o, --out-interface IFACE:数据报文的流出接口;仅能用于FORWARD, OUTPUT及POSTROUTING链上;
      
    • 扩展匹配:-m macth_name --spec_options

      例如:-m tcp --dport 22

      • 隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项;

        -p tcp
          --dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口;
          --sport PORT[-PORT]
          --tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有LIST1中指明的,不作检查;
          --syn: 
        -p udp
          --dport
          --sport
        -p icmp
          --icmp-type
            可用数字表示其类型:
              0:echo-reply
              8: echo-request
        

        SYN, ACK, FIN, RST, PSH, URG

        --tcp-flags SYN,ACK,FIN,RST SYN

    • 显式扩展: 必须使用-m选项指定使用的扩展;
  • 目标:

-j TARGET:jump至指定的TARGET
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT:端口重定向
LOG: 记录日志
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
...
自定义链:由自定义链上的规则进行匹配检查

iptables:

显式扩展:必须显式指明使用的扩展模块(rpm -ql iptables | grep ".so")

CentOS 6: man iptables

CentOS 7: man iptables-extensions

  • multiport扩展

以离散方式定义多端口匹配;最多指定15个端口;

[!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口;
[!] --ports port[,port|,port:port]...

~]# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT
  • iprange扩展

指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;

[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;

~~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT		
  • String扩展

检查报文中出现的字符串;

--algo {bm|kmp}
  bm = Boyer-Moore
  kmp = Knuth-Pratt-Morris
[!] --string pattern

~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT
  • time扩展

根据报文到达的时间与指定的时间范围进行匹配;

--datestart 
--datestop

--timestart
--timestop

--monthdays
--weekdays
  • connlimit扩展

根据每客户端IP(也可以是地址块)做并发连接数数量匹配;

--connlimit-above n:连接的数量大于n  	拒绝
--connlimit-upto n: 连接的数量小于等于n	允许
  • 示例:
iptables -I INPUT -p tcp --dport 22 -m --connlimit-above 3 -j REJECT

每个请求的目标地址的22端口的最大连接数为3.超出不响应

  • limit扩展

基于收发报文的速率做检查;
原理:令牌桶过滤器

--limit       rate[/second|/minute|/hour|/day]
--limit-burst number
  • 示例:
iptables -A INPUT -d 192.168.134.7 -p imcp --imcp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT

每个icmp请求目标地址为192.168.134.7的主机。请求主机一次最多响应5个icmp请求,多余5个以每分钟30个速度进行响应类型为icmp8的响应包

  • state扩展

    • 根据连接追踪机制检查连接的状态;
    • 调整连接追踪功能所能够容纳的最大连接数量:
    /proc/sys/net/nf_conntrack_max
    
    • 已经追踪到并记录下的连接:
    /proc/net/nf_conntrack
    
    • 不同协议或连接类型追的时长:
    /proc/sys/net/netfilter/
    
    • 可追踪的连接状态:

    NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;

    ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;

    RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系;

    INVALIED:无法识别的连接;

    • --state STATE1,STATE2,...

示例

iptables 放行ftp服务?

(1) 装载ftp追踪时的专用的模块:
# modprobe nf_conntrack_ftp

(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED

# iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(3) 放行响应报文:
ESTABLISEHD

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

如何保存及重载规则:

  • 保存规则至指定文件:

    iptables-save > /PATH/TO/SOMEFILE
    
  • 从指定文件重载规则:

    iptables-restore < /PATH/FROM/SOMEFILE
    
    • CentOS 6:
    service iptables save 
      iptables-save > /etc/sysconfig/iptables
      
    service iptables restart
      iptables-restore < /etc/sysconfig/iptables
    
    • CentOS 7:

    引入了新的iptables前端管理服务工具:firewalld

    firewalld-cmd

    firewalld-config

关于firewalld:

http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html

iptables NAT地址端口转发

  • nat:Network Address Translation,安全性,网络层+传输层

  • proxy:代理,应用层

  • nat:

    • SNAT: 只修改请求报文的源地址;
    • DNAT:只修改请求报文的目标地址;
    • PNAT:端口映射
      nat表:
    • PREROUTING:DNAT 响应报文返回
    • OUTPUT
    • POSTROUTING:SNAT 请求报文发出
  • 源地址转换:

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
  • 目标地址转换:
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

相关链接:https://www.jianshu.com/p/177a06511574