基于LVS开发的SNAT网关

如题,iptables的SNAT用了一段时间,大流量下性能太差无法忍受。
于是我们在阿里LVS基础上增加了NAT网关功能,见https://github.com/jlijian3/lvs-snat

NAT网关功能跟iptables SNAT功能类似,性能比iptables好很多,keepalived配置简单,多了一些定制功能:
1 支持源ip、目的ip、出口网卡、下一跳网关匹配,规则优先级匹配按照网络地址掩码位数由大到小
2 支持tcp、udp、icmp
3 增加redirect next hop功能,用于特殊选路需求和链路故障切换
4 性能非常好,跟lvs性能接近
5 目前不支持ipv6
6 snat ip pool选择算法支持hash(sip),hash(sip,dip),hash(sip,dip,sport,dport) (iptables只有前两种算法)
7 兼容lvs原有功能,可以作为网关单独部署,也可以负载均衡部署在同一台机器,跟vs/nat,vs/fullnat等转发模式一起使用

几个版本的LVS支持的功能对比:
官方LVS: VS/NAT,VS/DR,VS/TUNNEL
阿里LVS: VS/NAT,VS/DR,VS/TUNNEL,VS/FULLNAT,synproxy,二层转发
我们开发的LVS-SNAT: 阿里LVS + GATEWAY/SNAT

keepalived配置示例
snat_rule {
from 192.168.40.0/24
gw 1.1.3.1
oif eth1
snat_ip 1.1.3.71-1.1.3.73
algo random
}

一个vs/nat + gw/snat的例子
global_defs {
}

vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 253
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
1.1.3.100/24 dev eth1
1.1.3.101/24 dev eth1
1.1.3.102/24 dev eth1
}
}

vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 254
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.254/24 dev eth0
}
}

virtual_server 1.1.3.100 80 {
delay_loop 6
lb_algo rr
#这里fullnat等其他模式也是可以的
lb_kind NAT
syn_proxy
protocol TCP

real_server 192.168.40.35 8081 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.40.35 8082 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

#SNAT网关配置,fwmark 1只是个开关,跟iptables没有关系,请stop iptables
virtual_server fwmark 1 {
snat_rule {
#来源网段
from 192.168.40.0/24
#出口ip池,确保连续,可以只写一个
snat_ip 1.1.3.100-1.1.3.101
#出口ip池选择算法,sdh: hash(srcip,dstip) sh: hash(srcip) random: hash(srcip,dstip,srcport,dstport)
algo sdh
#出口网卡
oif eth1
#下一跳网关
gw 1.1.3.1
}
}

Forums: