NoOps

Ops make no ops | Ops的目标是没有Ops,嗯!

dsnat v2

作者: |   1,621 浏览  | 

dsnat简介

dsnat(Dynamic Source Network Address Translation) 是一个基于lvs的模块,在taobao开源的FNAT基础上开发,dsnat位于网络的网关位置,内网访问外网时,会将内网地址改成公网地址池中的ip,轮询选择

目前该模块只支持ipv4下的TCP,UDP协议, ICMP暂时还不支持

dsnat_tools包含ipvsadm和keepalived这2个工具,在官方源码的基础上修改添加了对dsnat的支持
- ipvsadm是对lvs进行配置的用户空间工具,ipvsadm->lvs类似于iptables->netfilter
- keepalived是对lvs集群的一个自动化配置工具(以服务形式常驻内存),可针对rs自动摘除和添加rs到vs中;并带有HA功能,提供热备容灾

change log

  • 添加了源地址判断功能
    • 不同源地址可使用不同的local address
    • 可实现源地址黑白名单功能
  • 代码由原来的centos6.2内核改为centos6.3内核

安装

过程可以参考FNAT,将补丁换成dsnat即可

1. 下载 redhat 6.2的内核

2. 准备代码

3. 打补丁

4. 编译安装

LVS TOOL 安装

标准的ipvsadm和keepalive将无法正常使用,
需要编译安装ipvsadm和keepalived,在dsnat_tools下载工具源码

配置用例

将lvs放在网关的位置,假设网络环境是这样的

client eth0  1.1.1.1 255.255.0.0 (cip)
lvs eth0 1.1.100.1 255.255.0.0 (gw ip)
lvs eth1 1.2.100.1-4 255.255.0.0 (lip)
rs eth1 1.2.1.4 255.255.0.0 (rip)

网络环境是(模拟一下)

  • client在内网
  • realserver在外网
  • 内网到外网的路由指向lvs
    • route add -net 1.2.0.0 netmask 255.255.0.0 gw 1.1.100.1(用默认路由也可以)
  • 外网服务器可以访问lvs的lip

Alt text

网关的配置

zone 说明

  • zone表示一个网段,可以用192.168.1.0/24或192.168.1.0/255.255.255.0表示
  • local address绑定在zone上
  • dsnat对连接源地址判断,顺序匹配zone,以第一个匹配到的zone/local address作为snat的源地址池
  • 如果没有匹配到zone或者匹配到的zone没有绑定local address,连接会被丢弃(可用作黑名单)

通过ipvsadm配置lvs规则

如果执行报错,请核对一下使用的内核补丁是否生效,ipvsadm是否为dsnat_tools编译安装版本

通过keepalive配置lvs规则

如果执行报错,请核对一下使用的内核补丁是否生效,keepalive是否为dsnat_tools编译安装版本,
keepalive需要2台机器了,这里给出一台的配置

  • 启动:service keepalived start
  • 更新:service keepalived reload
  • 停止:service keepalived stop

资源

23 Comments

  1. wilbur
    2013/08/07 at 11:25 上午

    升级2.0了,GOGOGO~~~

    • 2013/08/09 at 10:55 下午

      下次更新争取把taobao_lvs v2 v3 的新特性整合进来

      • 2013/08/12 at 12:21 上午

        波哥的文档写的很赞

  2. 2013/08/22 at 9:29 上午

    好牛B,要试用下!!

    • 2013/08/26 at 1:36 下午

      求二进制包下载!
      kernel-firmware-2.6.32-279.23.1.mi4.el6.x86_64.rpm
      kernel-2.6.32-279.23.1.mi4.el6.x86_64.rpm
      kernel-devel-2.6.32-279.23.1.mi4.el6.x86_64.rpm
      ernel-headers-2.6.32-279.23.1.mi4.el6.x86_64.rpm
      ipvsadm
      keepalived

  3. lxcong
    2013/08/28 at 9:56 上午

    TCP可以转发,UDP不行,是神马情况呢?
    求联系,我的QQ:83766787

    • wilbur
      2013/08/28 at 10:51 下午

      我忘了这版有没有支持UDP,作者近期休假,你留个邮箱吧

    • 2013/08/29 at 1:36 上午

      v2已经支持udp,用279目录下的patch和tools,tools的编译版本已发布,kernel由于是小米定制的配置,我过几天发个红帽子发行版默认内核+dsnat补丁的编译版本,请关注

  4. 2013/09/02 at 5:57 下午

    请问兼容fullnat、nat、dr吗,能同时使用吗

    • wilbur
      2013/09/02 at 6:33 下午

      这个是idc访问公网用的,和传统的lvs用法相反

      • 2013/09/03 at 10:02 上午

        哦,我试用了一下,就是我想同时使用fullnat+dsnat,两个都配置,发现dsnat可以使用,fullnat转发失败,这个做不到是吧。

        • 2013/09/03 at 10:40 上午

          应该是可以同时使用的。dsnat是在路由转发时检查(forward);fullnat是在本机收到请求(input)时检查,然后再做转发;互相是不会影响。由于添加了zone,fullnat的localaddress添加方式有所改变

  5. 2013/09/22 at 5:04 下午

    NAT转发用不了,我在你的代码基础上修改了一下,恢复了FULLNAT的local address添加和使用方式。
    另外,自己在NAT基础上实现了一个版本,没有使用fullnat补丁。
    纯属兴趣爱好,学习交流一下,呵呵
    https://github.com/jlijian3/lvs-snat

    • 2013/09/23 at 3:30 下午

      dsnat上的fnat模式由于应用场景的不同,把fullnat的laddr改成全局的了,跟官方的svc上的方式各有优缺点
      nat我们没有测试过,非常感谢你的反馈

      • 2013/09/26 at 11:42 上午

        dsnat上的FULLNAT是可以使用,但是为zone配置的laddr是外网ip,而fullnat为svc添加的laddr是内网ip。
        dsnat和fullnat同时使用,就共用了laddr,所以我修改了一下,各自单独配置。

        • 2013/09/26 at 11:55 上午

          比如,添加一个缺省网段,测试发现不管内网访问外网,还是FULLNAT转发,都会匹配到,而我们希望FULLNAT的laddr另外配置。
          ipvsadm -K –zone 0.0.0.0/0
          ipvsadm -P –zone 0.0.0.0/0 -z 1.2.100.3

          我就在在函数ip_vs_hbind_laddr里面区分了一下

          803 if (svc->addr.ip == 0 && svc->port == 0)
          804 local = ip_vs_get_laddr_zone(&cp->caddr);
          805 else
          806 local = ip_vs_get_laddr(svc);

  6. 2014/05/30 at 5:41 下午

    请问小米机房是多链路的吗,多链路怎么支持,比如有电信,联通,移动三条上行链路,通过路由表控制不同的包走不同的链路,但是不同的链路使用不同的local address

  7. 2014/06/30 at 5:09 下午

    很好很强大,我们也基于阿里的lvs-v2开发适用于多链路的nat网关,支持tcp/udp/icmp,希望有机会跟小米同学交流一下
    https://github.com/jlijian3/lvs-snat

    virtual_server fwmark 1 {

    snat_rule {
    from 192.168.40.0/24
    gw 1.1.3.1
    oif eth2
    snat_ip 1.1.3.71-1.1.3.73
    algo random
    }
    }

    • wilbur
      2014/07/14 at 3:51 下午

      赞呀,那个公司?

      • 2014/07/15 at 1:48 下午

        ucweb,感谢小米啊,也是受小米dsnat的启发(普空推荐的,哈哈)。不过我们要支持多isp,要匹配网卡网关,一开始用iptables,后来也基于lvs改了一个。

      • 2014/07/16 at 12:53 下午

        我们是ucweb公司的,小米同学有没有兴趣一起去杭州找阿里的lvs研发学习交流。

  8. yanyi
    2015/11/17 at 1:13 下午

    你好!请问dsnat性能咋样?并发请求数和连接数多少左右呀?

  9. yanyi
    2015/11/17 at 1:22 下午

    我部署的v2版本,请求ip是通的,但通过域名请求就是不行,是否dns这块有问题呀?

发表评论