• H
    ipvs: IPv6 tunnel mode · 714f095f
    Hans Schillstrom 提交于
    IPv6 encapsulation uses a bad source address for the tunnel.
    i.e. VIP will be used as local-addr and encap. dst addr.
    Decapsulation will not accept this.
    
    Example
    LVS (eth1 2003::2:0:1/96, VIP 2003::2:0:100)
       (eth0 2003::1:0:1/96)
    RS  (ethX 2003::1:0:5/96)
    
    tcpdump
    2003::2:0:100 > 2003::1:0:5: IP6 (hlim 63, next-header TCP (6) payload length: 40)  2003::3:0:10.50991 > 2003::2:0:100.http: Flags [S], cksum 0x7312 (correct), seq 3006460279, win 5760, options [mss 1440,sackOK,TS val 1904932 ecr 0,nop,wscale 3], length 0
    
    In Linux IPv6 impl. you can't have a tunnel with an any cast address
    receiving packets (I have not tried to interpret RFC 2473)
    To have receive capabilities the tunnel must have:
     - Local address set as multicast addr or an unicast addr
     - Remote address set as an unicast addr.
     - Loop back addres or Link local address are not allowed.
    
    This causes us to setup a tunnel in the Real Server with the
    LVS as the remote address, here you can't use the VIP address since it's
    used inside the tunnel.
    
    Solution
    Use outgoing interface IPv6 address (match against the destination).
    i.e. use ip6_route_output() to look up the route cache and
    then use ipv6_dev_get_saddr(...) to set the source address of the
    encapsulated packet.
    
    Additionally, cache the results in new destination
    fields: dst_cookie and dst_saddr and properly check the
    returned dst from ip6_route_output. We now add xfrm_lookup
    call only for the tunneling method where the source address
    is a local one.
    Signed-off-by: NHans Schillstrom <hans.schillstrom@ericsson.com>
    Signed-off-by: NPatrick McHardy <kaber@trash.net>
    714f095f
ip_vs.h 30.2 KB