DPVS的3種轉發模式分別是:NAT、DR、TUN模式。
NAT模式
FNAT 模式
FNAT都是雙臂模式,即正反向流量都通過DPVS節點。
FULLNAT下,客戶端感知不到RS,RS也感知不到客戶端,它們都只能看到DPVS。
FNAT單節點

拓撲: 如上圖所示,client ip為 10.0.0.48,其他 各節點的IP地址如下:
- VIP: client訪問的VIP為
10.0.0.100:80 - DPVS的local_ip為
192.168.100.200 - RS1的local_ip 為
192.168.100.2 - RS2的local_ip 為
192.168.100.3
可見,此示例中client與DPVS VIP同網段,DPVS的local_ip與RS同網段。
配置:
#!/bin/sh -
## 配置VIP到dpdk1
./dpip addr add 10.0.0.100/32 dev dpdk1
## 配置 DPVS接口WAN/LAN 路由
./dpip route add 10.0.0.0/16 dev dpdk1
./dpip route add 192.168.100.0/24 dev dpdk0
## 配置VIP監聽器,配置輪詢模式
./ipvsadm -A -t 10.0.0.100:80 -s rr
## 配置后端服務器,以及轉發模式(-b)
./ipvsadm -a -t 10.0.0.100:80 -r 192.168.100.2 -b // -b 表示 FNAT
./ipvsadm -a -t 10.0.0.100:80 -r 192.168.100.3 -b
## 配置VIP監聽器使用的DPVS local_ip
./ipvsadm --add-laddr -z 192.168.100.200 -t 10.0.0.100:80 -F dpdk0
注意:
請使用ipvsadm--add laddr設置LIP而不是dpip addr add。。。。因為ipvs和inet模塊都需要LIP地址,sapool選項將自動設置
對於FNAT,客戶端(源端)的CIP:cport 將被LIP:lport替換。目的端 VIP:vport LIP將被轉換為后端的RIP:rport。,如果RS需要通過socket API獲取客戶端的真實IP:port,例如getpeername或accept,而不是某種應用程序方式。TOA內核模塊應該安裝在RS上,TOA是為Linux內核的某個版本開發的,其他版本或BSD、mTCP等操作系統內核可能需要移植。
DPVS處理流程:
- client訪問VIP,發送給DPVS;
- DPVS將源IP
client_ip修改為local_ip,源端口修改為某一端口,目的IPVIP修改為某一個后端的IP - RS收到數據包后,因為數據報文的目的ip為自己的ip,接收處理;
- 處理后,查找arp、路由表,原路返回給dpvs;
- dpvs 將目的ip端口與源ip修改后返回client。
主備
DPVS通過keepalived使其工作在主備模式,通過VRRP協議選舉哪個DPVS節點為主。

拓撲: 如上圖所示,各節點的IP地址如下:
- VIP: client訪問的VIP為
192.168.100.254:80, - DPVS Master的local_ip為
192.168.100.200 - DPVS Backup的local_ip為
192.168.100.201 - RS1的local_ip 為
192.168.100.2 - RS2的local_ip 為
192.168.100.3
可見,此示例中DPVS、Client、RS都處在內部網絡(LAN)中。
配置:
使用keepalived,可以通過keepalived配置文件配置DPVS的routes、LIP、VIP和RS。
注意,dpv modified keepalived的配置參數與原始keepalived略有不同。
$ cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
foo@example.com
}
notification_email_from bar@example.com
smtp_server 1.2.3.4
smtp_connect_timeout 60
router_id DPVS_DEVEL
}
## local_ip組中的IP地址,用於DPVS主、備與后端服務器通信
local_address_group laddr_g1 {
192.168.100.200 dpdk0 # use DPDK interface
192.168.100.201 dpdk0 # use DPDK interface
}
##
## VRRP 配置區
##
vrrp_instance VI_1 {
state MASTER # master
interface dpdk0.kni # should be kni interface
dpdk_interface dpdk0 # should be DPDK interface
virtual_router_id 123 # VID should be unique in network
priority 100 # master's priority is bigger than worker
advert_int 1
authentication {
auth_type PASS
auth_pass ****
}
virtual_ipaddress { # 主節點將配置的VIP
192.168.100.254
}
}
#
# Virtual Server Section
#
virtual_server_group 192.168.100.254-80 {
192.168.100.254 80
}
## 配置DPVS的工作模式、調度算法、VIP的后端服務器IP,以及后端服務器健康檢查方式
virtual_server group 192.168.100.254-80 {
delay_loop 3
lb_algo rr # scheduling algorithm Round-Robin
lb_kind FNAT # Forwarding Mode Full-NAT
protocol TCP # Protocol TCP
laddr_group_name laddr_g1 # Local IP group-ID
real_server 192.168.100.2 80 { # real-server
weight 100
inhibit_on_failure
TCP_CHECK { # health check
nb_sock_retry 2
connect_timeout 3
connect_port 80
}
}
real_server 192.168.100.3 80 { # real-server
weight 100
inhibit_on_failure
TCP_CHECK { # health check
nb_sock_retry 2
connect_timeout 3
connect_port 80
}
}
}
備份的keepalived配置與Master相同,只是狀態應該是“backup”,優先級應該更低。
vrrp_instance VI_1 {
state BACKUP
priority 80
... ...
}
在DPVS主備節點中,啟動keepalived。
./keepalived -f /etc/keepalived/keepalived.conf
DPVS處理流程:
- client通過二層轉發訪問VIP,發送給DPVS;
- DPVS將源IP
client_ip修改為local_ip,源端口修改為某一端口,目的IPVIP修改為某一個后端的IP - rs收到數據包后,因為數據報文的目的ip為自己的ip,接收處理;
- 處理后,查找arp、路由表,原路返回給dpvs master;
- dpvs master將目的ip端口與源ip修改后返回給client。
優勢:
后端服務端不用為DPVS負載均衡做任何配置。
缺點:
后端服務器無法獲得客戶端的IP。需要使用TOA攜帶客戶端IP到后端服務器。
主主
DPVS通過OSPF/ECMP實現主主模式。
要使用OSPF,必須將patch/dpdk xxx/中的補丁應用於相應的dpdk源代碼,並安裝正確的rte_kni.ko。
DPVS主主集群模式拓撲如下圖所示:每一個DPVS都有一個相同的VIP,每一個DPVS都連接所有后端服務器。

對於主主集群中的單個DPVS節點,其拓撲圖如下圖所示。

拓撲: client的IP為20.17.11.3,其他各節點的IP地址如下:
- VIP: client訪問的VIP為
123.1.2.3:80, - 主主DPVS 的local_ip為
192.168.100.200 - DPVS主1的內核態IP為
172.10.0.2/30 - ECMP router的IP地址為
172.10.0.1/30 - RS1的local_ip 為
192.168.100.2 - RS2的local_ip 為
192.168.100.3
#!/bin/sh -
## 配置VIP,調度模式為輪詢
./ipvsadm -A -t 123.1.2.3:80 -s rr
## 配置后端服務器為FNAT,轉發模式為FNAT(-b)
./ipvsadm -a -t 123.1.2.3:80 -r 192.168.100.2 -b
./ipvsadm -a -t 123.1.2.3:80 -r 192.168.100.3 -b
## 添加DPVS的local_ip
./ipvsadm --add-laddr -z 192.168.100.200 -t 123.1.2.3:80 -F dpdk0
./ipvsadm --add-laddr -z 192.168.100.201 -t 123.1.2.3:80 -F dpdk0
## 配置DPVS的DPDK1的IP與路由
./dpip addr add 123.1.2.3/32 dev dpdk1
./dpip addr add 172.10.0.2/30 dev dpdk1
./dpip route add default via 172.10.0.1 dev dpdk1
配置內核態的接口Dpdk1.kni的IP地址與路由。
$ ip link set dpdk1.kni up
$ ip addr add 172.10.0.2/30 dev dpdk1.kni
$ ip addr add 123.1.2.3/32 dev dpdk1.kni # add VIP to kni for ospfd
$ ip route add default via 172.10.0.1 dev dpdk1.kni
DPVS處理流程:
- client訪問訪問VIP,發送給DPVS,經過ECMP router;
- router將訪問VIP的流量分發給不同的DPVS,通過修改
dst_mac為172網段的接口MAC; - DPVS收到數據包后,進行FNAT后,發給后端服務器RS;
- RS收到數據包后,因為數據報文的目的ip為自己的ip,正常接收處理;
- 處理后,查找arp、路由表,原路返回給原來的dpvs節點(不同的節點DPVS的local_ip不一樣);
DNAT 模式
DNAT為雙臂模式。

拓撲: 如上圖所示,各節點的IP地址如下:
- client: 192.168.0.46
- VIP: 192.168.0.89
- DPVS local ip: 192.168.0.66, 10.140.31.48
- RS1: 10.140.18.33
- RS2: 10.140.18.33
可見,所有的IP地址都在一個局域網內。
DNAT模式約束:
DPVS-DNAT模式有一個嚴格的限制:DPVS-DNAT模式只能在單個lcore中工作。由於以下原因,dpv很難支持多lcore NAT轉發模式。
- DPVS會話條目通過RSS在lcore上進行拆分和分發。
- DNAT轉發要求正、反方向流量都通過DPVS。
- DNAT轉發只轉換dest IP/端口,不更改源IP/端口。
- NIC的fdir規則設置有限。
因此,如果沒有對流量的其他控制,則出站數據包可能到達與入站數據包不同的lcore。如果是,出站數據包將被丟棄,因為會話查找未命中。
FNAT通過使用Flow Director(FDIR)解決了這個問題。但是,對於NIC,可以添加的規則非常有限,例如,對於XT-540,可以添加8K。
與FNAT不同,NAT沒有本地IP/端口,因此只能在源IP/端口上設置FDIR規則,這意味着只支持數千個並發。因此,FDIR不適用於NAT。
注意:從v1.7.2開始,就為多lcore NAT模式轉發提供了解決方案。其原理是通過全局重定向表和一些無鎖環將出站數據包重定向到其會話項所在的正確lcore。當然,這在一定程度上會損害性能。如果要使用它,請在/etc/dpvs.conf中打開配置開關“ipvs_defs/conn/redirect”。
DR模式
DR是 Direct Routing 的縮寫。DR模式是單臂模式。
DR模式中,DPVS改寫請求報文的 dst_mac,將請求發給RS,RS響應后的處理結果直接返回給客戶端用戶。

拓撲: 如上圖所示,各節點的IP地址如下:
- client: 192.168.100.26
- VIP: 192.168.100.254
- DPVS local ip: 192.168.100.1
- RS1: 192.168.100.2, lo接口IP配置為VIP
- RS2: 192.168.100.3,lo接口IP配置為VIP
可見,所有的IP地址都在一個局域網內。
配置VIP與對應RS的命令如下:
## 配置VIP:port,設置調度為rr
./ipvsadm -A -t 192.168.100.254:80 -s rr
## 配置VIP的RS,模式為-g,即DR模式
./ipvsadm -a -t 192.168.100.254:80 -r 192.168.100.2 -g
./ipvsadm -a -t 192.168.100.254:80 -r 192.168.100.3 -g
DPVS處理流程:
- client通過二層轉發訪問VIP,發送給DPVS;
- DPVS將
dst_mac修改為所有RS中的一個的mac地址; - RS收到數據包后,因為數據幀的MAC地址是自己的地址,並且又在同一個局域網,接收處理;
- 處理后,查找ARP、路由表,找到client的MAC地址后直接發給client。源IP地址還是VIP。
優勢:
采用NAT模式時,由於請求和響應的報文必須通過調度器地址重寫,當客戶請求越來越多時,調度器處理能力將成為瓶頸。
DR模式中,RS將響應處理后的數據直接返客戶端。這樣調度器就只處理請求入站報文,由於一般網絡服務應答數據比請求報文大很多,采用DR模式,集群系統的最大吞吐量可以提高10倍。
TUN模式
NAT模式不同,TUN與DR模式一樣,LB和RS之間的傳輸不用改寫IP地址。
TUN模式把客戶請求包封裝在一個IP tunnel里面,然后發送給RS節點服務器,節點服務器接收到之后解開IP tunnel,處理響應,然后直接把包通過自己的外網地址發送給客戶,不需要經過DPVS。

拓撲: 如上圖所示,各節點的IP地址如下:
- client: 10.138.85.23/22
- VIP: 10.140.31.48/32
- DPVS: 10.140.31.254/32 為隧道地址,
- RS1: 10.140.31.48/32 為隧道地址,eth0 10.140.18.33/20
- RS2: 10.140.31.48/32 為隧道地址, eth0 10.40.84.170/21
與underlay DR模式不同,隧道模式中同網段是DPVS與RS之間的隧道地址,通過dpvs和RSs之間的ipip隧道在L2網絡上轉發數據包。
配置VIP、RS、DPVS的命令如下:
## DPVS configs ##
# 配置DPVS與RS進行通信的隧道地址
./dpip addr add 10.140.16.48/20 dev dpdk0
# 添加 VIP地址為 DPVS 的地址
./dpip addr add 10.140.31.48/32 dev dpdk0
# 配置到RS隧道地址IP的路由表。所有RS中的隧道地址相同,且為 VIP 地址。
./dpip route add default via 10.140.31.254 src 10.140.16.48 dev dpdk0
# 配置VIP
./ipvsadm -A -t 10.140.31.48:80 -s rr
# 配置VIP的后端RS的eth0 IP。-i 代表隧道模式
./ipvsadm -a -t 10.140.31.48:80 -r 10.140.18.33 -i
# 配置VIP的另一個后端RS的eth0 IP。-i 代表隧道模式
./ipvsadm -a -t 10.140.31.48:80 -r 10.40.84.170 -i
DPVS處理流程:
- client 請求數據包,目標地址VIP發送到DPVS;
- DPVS接收到客戶請求包,進行IP Tunnel封裝。即在原有的包頭加上IP Tunnel的包頭。然后發送出去。
- RS節點服務器根據IP Tunnel包頭信息收到請求包,然后解開IP Tunnel包頭信息,得到客戶的請求包並進行響應處理。
- 響應處理完畢之后,RS服務器使用自己的出公網的線路,將這個響應數據包發送給客戶端。源IP地址還是VIP地址。(RS節點服務器需要在本地回環接口配置VIP)
