iptables应用:NAT、数据报处理、清空iptables规则

作者: lesca 分类: iptables,Network,Tutorials,Ubuntu,Web 发布时间: 2011-06-03 19:09

本节在先前介绍的知识基础上,进一步介绍用iptalbes实现NAT、数据报处理、规则清空等的方法

linux以前的内核仅仅支持有限的NAT功能,被称为伪装。Netfilter则支持任何一种NAT。一般来讲NAT可以分为源NAT和目的NAT。源NAT在数据报经过NF_IP_POST_ROUTING时修改数据报的源地址。伪装是一个特殊的SNAT。目的NAT在数据报经过NF_IP_LOCAL_OUT或NF_IP_PRE_ROUTING 时修改数据报目的地址。端口转发和透明代理都是DNAT。

一、iptables的NAT目标动作扩展

  • SNAT
  • 变换数据包的源地址,例:

    iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.4
  • MASQUERADE
  • 用于具有动态IP地址的拨号连接的SNAT,类似于SNAT,但是如果连接断开,所有的连接跟踪信息将被丢弃,而去使用重新连接以后的IP地址进行IP伪装,例:

    iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0 
  • DNAT
  • 转换数据报的目的地址,这是在PREROUTING钩子链中处理的,也就是在数据报刚刚进入时。因此Linux随后的处理得到的都是新的目的地址,例:

    iptables -t nat -A PREROUTING -j DNAT --to-destination 1.2.3.4:8080 -p tcp --dport 80 -i eth1 
  • REDIRECT
  • 重定向数据报为目的为本地,和DNAT将目的地址修改为接到数据报的接口地址情况完全一样,例:

    iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth1 -p tcp --dport 80 

    二、利用iptables进行数据报处理(Packet mangling)

    mangle表提供了修改数据报各个字段的值的方法。

    针对数据包处理的目标扩展

  • MARK
  • 设置nfmark字段的值。我们可以修改nfmark字段的值。nfmark仅仅是一个用户定义的数据报的标记(可以是无符号长整数范围内的任何值)。该标记值用于基于策略的路由,通知ipqmpd (运行在用户空间的队列分捡器守护进程)将该数据报排队给哪个哪个进程等信息。例:

    iptables -t mangle -A PREROUTING -j MARK --set-mark 0x0a -p tcp 
  • TOS
  • 设置数据报的IP头的TOS字段值。若希望适用基于TOS的数据报调度及路由,这个功能是非常有用处的。例:

    iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 -p tcp --dport ssh 

    三、清空iptables规则

    有时候在进行设置前,希望清空iptables的当前规则。

    iptables -t nat -F
    iptables -t nat -X
    iptables -t nat -P PREROUTING ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    iptables -t nat -P OUTPUT ACCEPT
    iptables -t mangle -F
    iptables -t mangle -X
    iptables -t mangle -P PREROUTING ACCEPT
    iptables -t mangle -P INPUT ACCEPT
    iptables -t mangle -P FORWARD ACCEPT
    iptables -t mangle -P OUTPUT ACCEPT
    iptables -t mangle -P POSTROUTING ACCEPT
    iptables -F
    iptables -X
    iptables -P FORWARD ACCEPT
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -t raw -F
    iptables -t raw -X
    iptables -t raw -P PREROUTING ACCEPT
    iptables -t raw -P OUTPUT ACCEPT
    

    语法

    iptables [-t table] -F [chain] [options...]
    iptables [-t table] -X [chain]
    iptables [-t table] -P chain target
    

    选项说明

    • -F 删除指定表或链中的所有规则,若没有指定表或者链,则为所有表或者链
    • -X 与-F相似,只是-F删除链中的规则,而-X删除链本身
      注意,只能删除用户自定义的链
    • -P 对给定目标设置链策略(目标动作)。
      只有内置链(built-in chains)才有链策略,所有链都能设置策略。
      策略对象有以下四种:
      • ACCEPT 接收数据报
      • DROP 丢弃数据报
      • QUEUE 将数据报提交到用户空间
      • RETURN 将数据报原封不动地返回给上层链
        如果已经是顶层,则将取采取默认策略(ACCEPT,DROP)

    四、实例

    这里以用于配置OpenVPN的NAT转发规则为例进行说明,希望读者能进一步了解规则设置的方法:

    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j MASQUERADE
     
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
     
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -j ACCEPT
     
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
    iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
    iptables -t nat -A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination 8.8.8.8
     
    iptables -A INPUT -p udp --dport 1194 -j ACCEPT
    iptables -A INPUT -s 10.8.0.0/24 -p all -j ACCEPT
    iptables -A FORWARD -d 10.8.0.0/24 -j ACCEPT
     
    iptables -A INPUT -i tun+ -j ACCEPT
    iptables -A FORWARD -i tun+ -j ACCEPT
     
    iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
    iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
     
    iptables -A INPUT -j REJECT
    iptables -A FORWARD -j REJECT
    

    注释

    此处仅列出之前没有提到过的特殊语法或选项

    • 没有指定-t选项时默认将规则增加(-A)到filter
    • -j 转到指定策略(目标动作)
    • -m 对规则进行匹配(match)说明,常常跟在被追加(-A)、插入(-I)、替换(-R)的链(chain)之后
    • ! 用在接口名、协议名等前面,使规则的作用相反
    • state 连接状态(需要state模块支持)
      • NEW 用于新建连接的数据报
      • ESTABLISHED 双向连接建立后的数据报
      • RELATED 例如用于建立FTP的数据连接的数据报,它与之前的控制连接相关(RELATED)
      • INVALID 无效的、有错误的数据报
    • tcp 协议名,后面的选项开关可以进一步细化规则
      • –dport TCP数据报中的目标地址
      • –sport TCP数据报中的源地址
      • –syn 用于初始化TCP连接的数据报
      • –tcp-flags 见手册
      • –tcp-option 见手册
    • limit 速率匹配(需要模块支持)
      –limit 用法–limit rate[/second|/minute|/hour|/day]
      –limit-burst 指定同一IP同时发出的SYN数据报的最大数目,通常和–limit一起使用
    • LOG 内核日志策略(目标动作),可以使用dmesg来查看由内核记录的日志信息

    五、输出当前规则

    可以采用两种方法:

    -L选项

    iptables -L

    该命令输出所有链中的所有规则

    iptables-save命令

    这条命令会以“表”的形式输出,用于程序读取,所以一般是这样用:

    iptables-save > iptables.rules

    Reference

    [1] UNIX Resource Network
    [2] openvz vps ubuntu 安装 openvpn 并配置iptables防火墙
    [3] man iptalbes
    [4] 11.15. RETURN target
    [5] Linux Iptables Limit the number of incoming tcp connection / syn-flood attacks

    版权声明

    本文出自 Lesca 技术宅,转载时请注明出处及相应链接。

    本文永久链接: https://www.lesca.cn/archives/iptables-nat-mangle-clear-rules.html

    如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!