alibaba / LVS

A distribution of Linux Virtual Server with some advanced features. It introduces a new packet forwarding method - FULLNAT other than NAT/Tunneling/DirectRouting, and defense mechanism against synflooding attack - SYNPROXY.
2k stars 682 forks source link

UDP的FULLNAT模式下,cksum错 #8

Open mentalmap opened 9 years ago

mentalmap commented 9 years ago

keepalived.conf如下:

local_address_group laddr_g1 { XX.XX.XX.XX }

virtual_server XX.XX.XX.XX XXXX { delay_loop 30 lb_algo rr lb_kind FNAT protocol UDP laddr_group_name laddr_g1

    real_server XX.XX.XX.XX XXXX {
            weight 1
    }

}

修改proc参数: echo 0 > /proc/sys/net/ipv4/vs/defence_udp_drop

ethtool -k eth1

Features for eth1: rx-checksumming: on tx-checksumming: on scatter-gather: on tcp-segmentation-offload: on udp-fragmentation-offload: off generic-segmentation-offload: on generic-receive-offload: off large-receive-offload: off ntuple-filters: off receive-hashing: on

现象是RS上可以收到LVS转发过来的UDP包,但是checksum出错,RS的内核直接丢弃。

jlijian3 commented 9 years ago

ip_vs_proto_udp.c 397行 改为 } else if (!cp->app && (udph->check != 0)) {

dhh123 commented 5 years ago

ip_vs_proto_udp.c 397行 改为 } else if (!cp->app && (udph->check != 0)) {

397行是注释

jlijian3 commented 5 years ago

ip_vs_proto_udp.c 397行 改为 } else if (!cp->app && (udph->check != 0)) {

397行是注释 @dhh123 我说的是v2分支,master udp不支持fullnat吧

dhh123 commented 5 years ago

ip_vs_proto_udp.c 397行 改为 } else if (!cp->app && (udph->check != 0)) {

397行是注释 @dhh123 我说的是v2分支,master udp不支持fullnat吧

fullnat我用的是兼容戴尔硬件的这个版本,不知道改动哪里能解决checksum的问题,请指教一下。https://jeffrycheng.com/2017/03/31/%E5%9C%A8R730%E4%B8%8A%E5%AE%89%E8%A3%85lvs-fullnat/ 。另外我是用了您的lvs-snat 同样不兼容硬件问题,我把您的代码迁移到了2.6.32.358版本,编译和测试也没发现什么问题。

jlijian3 commented 5 years ago

ip_vs_proto_udp.c里找到udp_fnat_in_handler, udp_fnat_out_handler这2个函数,然后找到 / Adjust UDP checksums / if (skb->ip_summed == CHECKSUM_PARTIAL) { udp_partial_csum_reset(cp->af, (skb->len - udphoff), udph, &cp->vaddr, &cp->caddr); } else if (!cp->app) { #把这里改成 (!cp->app && (udph->check != 0)) / Only port and addr are changed, do fast csum update /

kibed commented 4 years ago

ip_vs_proto_udp.c里找到udp_fnat_in_handler, udp_fnat_outhandler这2个函数,然后找到 /* Adjust UDP checksums / if (skb->ip_summed == CHECKSUM_PARTIAL) { udp_partial_csumreset(cp->af, (skb->len - udphoff), udph, &cp->vaddr, &cp->caddr); } else if (!cp->app) { #把这里改成 (!cp->app && (udph->check != 0)) / Only port and addr are changed, do fast csum update */

https://jeffrycheng.com/2017/03/31/%E5%9C%A8R730%E4%B8%8A%E5%AE%89%E8%A3%85lvs-fullnat/ 我也是用的这个版本,fullnat情况下也是udp bad cksum,代码好像和您说的不一样 下面是默认代码,请问需要怎么改

/*