Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1257445
  • 博文数量: 177
  • 博客积分: 1528
  • 博客等级: 上尉
  • 技术积分: 1891
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 18:03
文章分类

全部博文(177)

文章存档

2020年(1)

2018年(19)

2017年(4)

2016年(21)

2015年(40)

2014年(13)

2013年(26)

2012年(16)

2011年(37)

我的朋友

分类: LINUX

2012-06-15 16:23:15

Posted by lesca on June 3, 2011 Leave a comment (0) Go to comments

本节在先前介绍的知识基础上,进一步介绍用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.rulesReference

    [1] 
    [2] openvz vps ubuntu 安装 openvpn 并配置iptables防火墙
    [3] man iptalbes
    [4] 
    [5] 

    版权声明转载本站文章,请遵循
    Please click here to support us if you feel this post is useful.
    如果您觉得此文有用,请点击右此处支持本站。
    阅读(3675) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~