0%

iptables知识梳理及个人理解

鉴于使用情况有限,扩展部分(Match Extensions Target Extensions)暂只梳理常见项,待更新。

注: 请结合Usage中table、chain、rule-specification和options的位置阅读本文,更易食用。

1. Usage:

iptables [-t table] -[ACD] chain rule-specification [options]
iptables [-t table] -I chain [rulenum] rule-specification [options]
iptables [-t table] -R chain rulenum rule-specification [options]
iptables [-t table] -D chain rulenum [options]
iptables [-t table] -[LS] [chain [rulenum]] [options]
iptables [-t table] -[FZ] [chain] [options]
iptables [-t table] -[NX] chain
iptables [-t table] -E old-chain-name new-chain-name
iptables [-t table] -P chain target [options]
iptables [-t table] -h (print this help information)

2. Tables(表)

  • filter 默认表值
  • nat 当创建新连接的数据包时
  • mangle 该表用于专门的数据包更改
  • raw 该表主要用于与NOTRACK目标一起配置免除连接跟踪的功能。它在具有优先级的netfilter钩子处注册,因此在ip_conntrack或任何其他IP表之前被调用

3. Chain(链)

  • filter 表中的Chain
    • INPUT 用于发往本地套接字的数据包
    • FORWARD 用于通过盒子路由的数据包
    • OUTPUT 用于本地生成的数据包
  • nat 表中的Chain
    • PREROUTING 用于在进入后立即更改数据包
    • OUTPUT 用于在路由之前更改本地生成的数据包
    • POSTROUTING 用于在即将外出时更改数据包
  • mangle 表中的Chain
    • PREROUTING 用于在路由之前更改传入的数据包
    • OUTPUT 用于在路由之前更改本地生成的数据包
    • INPUT 用于进入的数据包
    • FORWARD 用于更改通过包装箱路由的数据包
    • POSTROUTING 用于更改将要包装的数据包
  • raw 表中的Chain
    • PREROUTING 用于通过任何网络接口到达的数据包
    • OUTPUT 用于由本地进程生成的数据包

4. rule-specification(规则)

规则是以列表的方式被加进每条链。

每个包会从第一条规则开始检查,直至最后一条。假若包与其中一条规则吻合,相应的Target便会被执行,例如接纳(ACCEPT)或丢弃(DROP)包。

一旦有吻合的规则,这个包便会按照规则来处理,而不再被链内的其它规则所检查。假如包通过所有检查而不符合任何规则链内的任何一条规则,那这条链的缺省动作将会被执行,这就是所谓的缺省政策(-P, --policy),可以设置为接纳(ACCEPT)或丢弃(DROP)封包。

5. Targets(目标)

防火墙规则指定数据包的标准和target(目标),如果数据包不匹配,则检查链中的下一个规则;如果匹配,则下一个规则由目标值指定,该值可以是用户定义chain的名称,也可以是特殊值: - ACCEPT - DROP - QUEUE - RETURN

以及后面详细介绍的Target Extensions

6. options(选项)

  • -A, --append chain rule-specification 增加
  • -I, --insert chain [rulenum] rule-specification 插入
  • -D, --delete chain rule-specification/rulenum 删除
  • -F, --flush [chain] 冲洗选定的链(如果没有指定chain,代表表中的所有链)。这等效于删除所有规则。
  • -R, --replace chain rulenum rule-specification 替换
  • -L, --list [chain] 列出所选链中的所有规则
  • -Z, --zero [chain] 将选定的链(如果没有指定chain,代表表中的所有链)的数据包和字节计数器清零。同样指定-L,-- list(list)选项是合法的,以便在清除计数器之前立即查看它们。
  • -N, --new-chain chain 通过给定名称创建一个新的用户定义链。该名称必须没有target。
  • -X, --delete-chain [chain] 删除指定的用户自定义链,不能有规则引用该链,必须删除或替换引用规则,然后才能删除链。如果未提供任何参数,它将尝试删除表中的每个非内置链。
  • -P, --policy chain target 为链的政策设置为某个Target,如iptables -P INPUT DROP指将INPUT链的缺省政策改为DROP
  • -E, --rename-chain old-chain new-chain 重命名链

7. 参数

以下参数构成rule-specification(规则)规范(在添加,删除,插入,替换和追加命令中使用)。 - -p, --protocol [!] protocol 规则中要匹配的数据包的协议,protocol可以是tcp udp icmpall,缺省all,还允许/etc/protocols中的协议名称,0代表all!代表反转,! tcp代表匹配非tcp协议 - -s, --src, --source [!] address[/mask] 规则中要匹配的数据包的来源,address可以是网络名称、主机名、网络IP地址(带有/mask)或纯IP地址。该mask(掩码)可以是网络掩码,也可以是纯数字,如24等效于255.255.255.0 - -d, --dst, --destination [!] address[/mask] 规则中要匹配的数据包的目的地,参考-s - -j, --jump target 指定规则的目标,即,如果数据包匹配,该怎么办。target可以是用户定义的链(此规则所在的链除外),可以是立即确定数据包命运的特殊内置Target之一(如ACCEPT),也可以是Target Extensions。如果在规则中省略了此选项(并且未使用-g),则匹配规则将不会影响数据包的命运,但是规则上的计数器将增加。 - -g, --goto chain 这指定处理应按用户指定的链继续进行。与--jump选项不同,--goto将return且不在此链中继续处理,而--jump是在链中继续处理。 - -i, --in-interface [!] name 接收数据包所通过的接口的名称(仅适用于INPUTFORWARDPREROUTING链的数据包),如-i eth0!代表取反,+结尾代表任何以该名称开头的接口都将匹配。如果省略此选项,则任何接口名称都将匹配。 - [!] -f, --fragment 这意味着该规则仅引用分段数据包的第二个片段和之后的片段,由于片段无法告知此类数据包(或ICMP类型)的源端口或目标端口,因此此类数据包将不匹配任何指定它们的规则,! -f时该规则将仅匹配头片段或未分段的数据包。 - -c, --set-counters PKTS BYTES 这使管理员可以初始化规则的包和字节计数器(在INSERT,APPEND,REPLACE操作期间)。 - -v, --verbose 详细输出。此选项使list命令显示接口名称,规则选项(如果有)和TOS掩码。对于追加,插入,删除和替换,这将导致打印有关一个或多个规则的详细信息。 - -n, --numeric 数值输出。显示IP地址和端口号,默认情况下,程序将尝试将它们显示为主机名,网络名或服务。 - -x,--exact 显示数据包和字节计数器的确切值,此选项仅与-L命令有关。 - --line-numbers 列出规则时,将行号添加到每个规则的开头,对应于该规则在链中的位置。 - --modprobe=command 在将规则添加或插入到链中时,请使用command来加载任何必要的模块(TargetMatch Extensions等)

8. Match Extensions(匹配扩展)(只列出常见)

扩展的数据包匹配模块,两种方式 - -p, --protocol 隐式地,如-p icmp则会加载icmp扩展 - -m, --match module 加载特定module模块

可以在一行中指定多个扩展匹配模块,详情见: Match Extensions

  • account 定义网络/mask中所有主机的帐户流量
    示例:
    192.168.0.0/24网络的帐户流量进入表mynetwork
    iptables -A FORWARD -m account --aname mynetwork --aaddr 192.168.0.0/24
  • icmp 如果指定了--protocol icmp,则会加载此扩展名。它提供以下选项:
    • --icmp-type [!] typename 这允许指定ICMP类型,该类型可以是数字ICMP类型,也可以是命令显示的ICMP类型名称之一。 如: iptables -p icmp -h
  • mport 此模块与一组源端口或目标端口匹配。最多可以指定15个端口。它只能与-p tcp或-p udp结合使用。
    • --sports, --source-ports port[,port[,port...]] 如果源端口是给定端口之一,则匹配。
    • --dports, --destination-ports port[,port[,port...]] 如果目标端口是给定端口之一,则匹配。
    • --ports port[,port[,port...]] 如果源端口和目标端口彼此相等并且与给定端口之一相等,则匹配。
  • multiport 此模块与一组源端口或目标端口匹配。最多可以指定15个端口。端口范围(port:port)被视为两个端口。它只能与-p tcp或-p udp结合使用。
    • --sports, --source-ports [!] port[,port[,port:port...]] 如果源端口是给定端口之一,则匹配。
    • --dports, --destination-ports [!] port[,port[,port:port...]] 如果目标端口是给定端口之一,则匹配。
    • --ports [!] port[,port[,port:port...]] 如果源端口或目标端口等于给定端口之一,则匹配。
  • osf 操作系统
    • --log 1/0
    • --smart 如果存在,则OSF将使用一些智能来确定远程OS。仅当连接源位于我们的本地网络中时,OSF才会使用初始TTL。
    • --netlink 如果存在,则OSF还将通过netlink NETLINK_NFLOG组1记录所有事件。
    • --genre [!] string 通过被动指纹匹配操作系统类型
      示例:
      iptables -I INPUT -j ACCEPT -p tcp -m osf --genre Linux --log 1 --smart
  • set 该模块包含可以由ipset定义的IP集。
    • --set setname flag[,flag...] 其中的flag是src dst,并且最多可以包含六个
      示例:
      在指定的数据集中找到数据包的源地址或端口号(取决于数据集的类型),如果存在规则才会与数据包匹配
      iptables -A FORWARD -m set --set test src,dst
  • state 与连接跟踪结合使用时,此模块允许访问此数据包的连接跟踪状态。
    • --state state 其中state是要匹配的连接状态的逗号分隔列表
      • INVALID 由于某种原因无法识别该数据包,,包括内存不足和与任何已知连接都不对应的ICMP错误
      • ESTABLISHED 已建立连接
      • NEW 已开始新连接,但还没有建立连接
      • RELATED 正在开始新的连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。
  • string 该模块通过使用某些模式匹配策略来匹配给定的字符串。它需要> = 2.6.14的Linux内核。
    • --algo bm|kmp 选择模式匹配策略。
    • --from offset 设置从其开始寻找任何匹配的偏移量。如果未通过,则默认为0。
    • --to offset 设置从其开始寻找任何匹配的偏移量。如果未通过,则默认为数据包大小。
    • --string pattern 匹配给定的模式。
    • --hex-string pattern 以十六进制表示法匹配给定的模式。
  • tcp 加载tcp扩展
    • --sport, --source-port [!] port[:port] 源端口。还可以使用port:port格式指定包含范围,如果省略第一个端口,则假定为"0",如果省略最后一个,则假定为"65535",如果第二个端口大于第一个,则将交换它们。

    • --dport, --destination-port [!] port[:port] 目标端口,参考--sport

    • --tcp-flags [!] mask comp 当TCP标志如指定时则匹配。mask是我们应该检查的标志,写为以逗号分隔的列表,comp是必须设置的以逗号分隔的标志列表。标志为:SYN ACK FIN RST URG PSH ALL NONE。
      示例:
      仅匹配设置了SYN标志且未设置ACK,FIN和RST标志的数据包

      iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN

    • [!] --syn 仅匹配SYN位置为1,且ACK,RST和FIN位为零的TCP数据包。匹配后,阻止此类数据包进入接口,将阻止传入的TCP连接,但传出的TCP连接将不受影响。它等效于--tcp-flags SYN,RST,ACK,FIN SYN! --syn代表含义反转。

    • --tcp-option [!] number 如果设置了TCP选项,则匹配。参见: TCP options Number列

    • --mss value[:value] 将TCP SYN或SYN/ACK数据包与指定的MSS值(或范围)匹配,以控制该连接的最大数据包大小。

  • udp 加载udp扩展
    • --sport, --source-port [!] port[:port] 源端口,参考TCP部分
    • --dport, --destination-port [!] port[:port] 目标端口,参考TCP部分

9. Target Extensions(目标扩展)(只列出常见)

  • DNAT 端口转发。该Target仅在nat表,PREROUTING和OUTPUT链以及仅从那些链中调用的用户定义的链中有效。它指定应修改数据包的目标地址(并且此连接中所有将来的数据包也将被修改),并且规则应停止检查。

    • --to-destination ipaddr[-ipaddr][:port-port] 它可以指定一个新的目标IP地址,一个IP地址(包括端值)范围和一个可选的端口范围(仅在规则还指定-p tcp或-p udp时才有效)。如果未指定端口范围,则将永远不会修改目标端口。 示例:
      iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3124 -j DNAT --to-destination 192.168.100.10:3000
      外界请求eth0的tcp 3124端口,则在路由前修改DESTINATION为内网的192.168.100.10:3000端口,如果destination是本机的话,还可以使用REDIRECT:
      iptables -t nat -A PREROUTING -p tcp  --dport 80 -j REDIRECT --to-ports 8080
  • SNAT 源NAT,该Target仅在POSTROUTING链的nat表中有效。它指定应修改数据包的源地址(此连接中所有将来的数据包也将被修改),并且规则应停止检查。

    • --to-source ipaddr[-ipaddr][:port-port] 它可以指定一个新的源IP地址,一个IP地址(包括端值)范围和一个可选的端口范围(仅在规则还指定-p tcp或-p udp时才有效)。如果未指定端口范围,则低于512的源端口将被映射到低于512的其他端口:介于512和1023之间(包括512和1023之间)的那些端口将被映射到低于1024的端口,而其他端口将被映射到1024或更高版本。尽可能不发生端口更改。
  • DNAT VS SNAT

    • SNAT修改的是Source的地址,也就是要在路由后修改Source,故而配置POSTROUTING规则
    • DNAT修改的是Destination的地址,也就是在路由前修改Destination,故而配置PREROUTING规则,详情见规则链图。
  • MASQUERADE 源NAT,该Target仅在POSTROUTING链的nat表中有效。它仅应与动态分配的IP(拨号)连接一起使用:如果您具有静态IP地址,则应使用SNAT。伪装等同于指定到数据包出接口的IP地址的映射,但是还具有当接口断开时会忘记连接的效果。当下一次拨号不太可能具有相同的接口地址(因此,无论如何建立的连接都会丢失)时,这是正确的行为。

    • --to-ports port[-port] 这指定了要使用的源端口范围,将覆盖默认的SNAT源端口选择启发式方法(请参见上文)。仅当规则还指定-p tcp或-p udp时,此选项才有效。
  • SNAT VS MASQUERADE 这两个Target都在POSTROUTING链的nat表中提供源NAT(或SNAT)。
    差异性:

    • MASQUERADE不需要--to-source,因为它可以用于动态分配的IP地址。
    • SNAT 使用静态IP地址。
    • MASQUERADE比起SNAT每次MASQUERADE目标被数据包击中,目标都要检查要使用的IP地址,它具有额外的开销,并且速度较慢。

    重要说明:仍然可以将MASQUERADE目标与静态IP 一起使用。请注意,这将增加额外的开销(用于计算)。
    示例:

      
    # stick to SNAT for static IP
    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to-source ELASTIC_IP

    # don't be lazy, simple but slower due to more overhead
    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
  • MARK 这用于设置与数据包关联的netfilter标记值。它仅在mangle表中有效。例如,它可以与iproute2结合使用。

    • --set-mark mark
  • REDIRECT 跳转。 该Target仅在nat表,PREROUTING和OUTPUT链以及仅从那些链中调用的用户定义的链中有效。通过将目标IP更改为传入接口的主地址,它将数据包重定向到计算机本身(本地生成的数据包映射到127.0.0.1地址)。

    • --to-ports port[-port] 这指定了目标端口或端口范围(使用:),没有此端口,就永远不会更改目标端口。仅当规则还指定-p tcp或-p udp时,此选项才有效。
  • REJECT 驳回。这用于响应匹配的数据包时发回错误数据包,否则,它等效于DROP,因此它是终止Target,结束规则遍历。该目标仅在INPUT,FORWARD和OUTPUT链以及仅从这些链调用的用户定义的链中有效。以下选项控制返回的错误包的性质:

    • --reject-with type 它返回适当的ICMP错误消息。type可以是
      • icmp-net-unreachable
      • icmp-host-unreachable
      • icmp-port-unreachable 默认
      • icmp-proto-unreachable
      • icmp-net-prohibited
      • icmp-host-prohibited
      • icmp-admin-prohibited 将icmp-admin-prohibited与不支持的内核一起使用将导致普通的DROP而不是REJECT
      • tcp-reset 只能与TCP协议一起使用,告诉REJECT发送一个TCP RST在应答数据包。TCP RST数据包用于正常关闭打开的TCP连接。
  • TARPIT 困住连接放到坑里。接受连接,但立即切换到持久状态(0字节窗口),在该状态中,远程端停止发送数据并要求每60-240秒继续一次。尝试关闭连接的尝试将被忽略,从而迫使远程端在12-24分钟内使连接超时。
    错误想法:
    TARPIT可用于浪费攻击者的资源,从而减慢攻击速度并降低其攻击其他主机的能力,用来处理(D)DoS。
    考虑一下:
    攻击者每秒创建数千个服务器连接,如果每个连接都被困在tarpit中,则这些连接将如何影响服务器。您的服务器将快速消耗其所有可用资源(或文件句柄),从而不再允许连接。这比仅关闭连接还差。暂时放下犯罪者(REJECT)比尝试占用他的资源(TARPIT)要好。

10. 参考

https://linux.die.net/man/8/iptables

11. 重启iptables

开关防火墙 - 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off

  • 即时生效,重启后失效 开启: service iptables start 关闭: service iptables stop

12. 规则链图(转)

来自《鸟哥私房菜》

无Mangle的表更加常用,分析起来逻辑更加清晰。

请我喝杯咖啡吧 Coffee time !