|
 |
bbaaef |
From d8573c28c74a4e706d1b16dc84ac28a74fe624f0 Mon Sep 17 00:00:00 2001
|
|
 |
bbaaef |
From: Ankur Sharma <ankur.sharma@nutanix.com>
|
|
 |
bbaaef |
Date: Fri, 1 Nov 2019 01:27:36 +0000
|
|
 |
bbaaef |
Subject: [PATCH 06/12] OVN: ADD nbctl cli to mark a dnat_and_snat rule as
|
|
 |
bbaaef |
stateless
|
|
 |
bbaaef |
|
|
 |
bbaaef |
Adding ovn-nbctl to mark a dnat_and_snat rule as stateless.
|
|
 |
bbaaef |
This configuration will be added to "options" column of NAT table.
|
|
 |
bbaaef |
|
|
 |
bbaaef |
Signed-off-by: Ankur Sharma <ankur.sharma@nutanix.com>
|
|
 |
bbaaef |
Signed-off-by: Numan Siddique <numans@ovn.org>
|
|
 |
bbaaef |
---
|
|
 |
bbaaef |
ovn/ovn-nb.ovsschema | 6 ++++--
|
|
 |
bbaaef |
ovn/ovn-nb.xml | 5 +++++
|
|
 |
bbaaef |
ovn/utilities/ovn-nbctl.8.xml | 12 +++++++++++-
|
|
 |
bbaaef |
ovn/utilities/ovn-nbctl.c | 30 +++++++++++++++++++++++++++-
|
|
 |
bbaaef |
tests/ovn-nbctl.at | 37 +++++++++++++++++++++++++++++++++++
|
|
 |
bbaaef |
5 files changed, 86 insertions(+), 4 deletions(-)
|
|
 |
bbaaef |
|
|
 |
bbaaef |
diff --git a/ovn/ovn-nb.ovsschema b/ovn/ovn-nb.ovsschema
|
|
 |
bbaaef |
index 2c87cbba7..084305b24 100644
|
|
 |
bbaaef |
--- a/ovn/ovn-nb.ovsschema
|
|
 |
bbaaef |
+++ b/ovn/ovn-nb.ovsschema
|
|
 |
bbaaef |
@@ -1,7 +1,7 @@
|
|
 |
bbaaef |
{
|
|
 |
bbaaef |
"name": "OVN_Northbound",
|
|
 |
bbaaef |
- "version": "5.16.0",
|
|
 |
bbaaef |
- "cksum": "923459061 23095",
|
|
 |
bbaaef |
+ "version": "5.17.0",
|
|
 |
bbaaef |
+ "cksum": "1128988054 23237",
|
|
 |
bbaaef |
"tables": {
|
|
 |
bbaaef |
"NB_Global": {
|
|
 |
bbaaef |
"columns": {
|
|
 |
bbaaef |
@@ -345,6 +345,8 @@
|
|
 |
bbaaef |
"snat",
|
|
 |
bbaaef |
"dnat_and_snat"
|
|
 |
bbaaef |
]]}}},
|
|
 |
bbaaef |
+ "options": {"type": {"key": "string", "value": "string",
|
|
 |
bbaaef |
+ "min": 0, "max": "unlimited"}},
|
|
 |
bbaaef |
"external_ids": {
|
|
 |
bbaaef |
"type": {"key": "string", "value": "string",
|
|
 |
bbaaef |
"min": 0, "max": "unlimited"}}},
|
|
 |
bbaaef |
diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml
|
|
 |
bbaaef |
index bce7463d2..cf2c5136a 100644
|
|
 |
bbaaef |
--- a/ovn/ovn-nb.xml
|
|
 |
bbaaef |
+++ b/ovn/ovn-nb.xml
|
|
 |
bbaaef |
@@ -2324,6 +2324,11 @@
|
|
 |
bbaaef |
|
|
 |
bbaaef |
</column>
|
|
 |
bbaaef |
|
|
 |
bbaaef |
+ <column name="options" key="stateless">
|
|
 |
bbaaef |
+ Indicates if a dnat_and_snat rule should lead to connection
|
|
 |
bbaaef |
+ tracking state or not.
|
|
 |
bbaaef |
+ </column>
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
<group title="Common Columns">
|
|
 |
bbaaef |
<column name="external_ids">
|
|
 |
bbaaef |
See External IDs at the beginning of this document.
|
|
 |
bbaaef |
diff --git a/ovn/utilities/ovn-nbctl.8.xml b/ovn/utilities/ovn-nbctl.8.xml
|
|
 |
bbaaef |
index 41d50b694..49aa527a0 100644
|
|
 |
bbaaef |
--- a/ovn/utilities/ovn-nbctl.8.xml
|
|
 |
bbaaef |
+++ b/ovn/utilities/ovn-nbctl.8.xml
|
|
 |
bbaaef |
@@ -665,7 +665,7 @@
|
|
 |
bbaaef |
NAT Commands
|
|
 |
bbaaef |
|
|
 |
bbaaef |
|
|
 |
bbaaef |
- [--may-exist ] lr-nat-add router type external_ip logical_ip [logical_port external_mac]
|
|
 |
bbaaef |
+ [--may-exist ] [--stateless ]lr-nat-add router type external_ip logical_ip [logical_port external_mac]
|
|
 |
bbaaef |
|
|
 |
bbaaef |
|
|
 |
bbaaef |
Adds the specified NAT to router.
|
|
 |
bbaaef |
@@ -681,7 +681,17 @@
|
|
 |
bbaaef |
The logical_port is the name of an existing logical
|
|
 |
bbaaef |
switch port where the logical_ip resides.
|
|
 |
bbaaef |
The external_mac is an Ethernet address.
|
|
 |
bbaaef |
+ The --stateless
|
|
 |
bbaaef |
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+ When --stateless is specified then it implies that
|
|
 |
bbaaef |
+ we will be not use connection tracker, i.e internal ip and external
|
|
 |
bbaaef |
+ ip are 1:1 mapped. This implies that --stateless is
|
|
 |
bbaaef |
+ applicable only to dnat_and_snat type NAT rules.
|
|
 |
bbaaef |
+ An external ip with --stateless NAT cannot be shared
|
|
 |
bbaaef |
+ with any other NAT rule.
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
|
|
 |
bbaaef |
When type is dnat , the externally
|
|
 |
bbaaef |
visible IP address external_ip is DNATted to the
|
|
 |
bbaaef |
diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c
|
|
 |
bbaaef |
index 112cc1d54..1a1d83e65 100644
|
|
 |
bbaaef |
--- a/ovn/utilities/ovn-nbctl.c
|
|
 |
bbaaef |
+++ b/ovn/utilities/ovn-nbctl.c
|
|
 |
bbaaef |
@@ -685,6 +685,7 @@ Policy commands:\n\
|
|
 |
bbaaef |
lr-policy-list ROUTER print policies for ROUTER\n\
|
|
 |
bbaaef |
\n\
|
|
 |
bbaaef |
NAT commands:\n\
|
|
 |
bbaaef |
+ [--stateless]\n\
|
|
 |
bbaaef |
lr-nat-add ROUTER TYPE EXTERNAL_IP LOGICAL_IP [LOGICAL_PORT EXTERNAL_MAC]\n\
|
|
 |
bbaaef |
add a NAT to ROUTER\n\
|
|
 |
bbaaef |
lr-nat-del ROUTER [TYPE [IP]]\n\
|
|
 |
bbaaef |
@@ -3945,6 +3946,13 @@ nbctl_lr_nat_add(struct ctl_context *ctx)
|
|
 |
bbaaef |
}
|
|
 |
bbaaef |
|
|
 |
bbaaef |
bool may_exist = shash_find(&ctx->options, "--may-exist") != NULL;
|
|
 |
bbaaef |
+ bool stateless = shash_find(&ctx->options, "--stateless") != NULL;
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+ if (strcmp(nat_type, "dnat_and_snat") && stateless) {
|
|
 |
bbaaef |
+ ctl_error(ctx, "stateless is not applicable to dnat or snat types");
|
|
 |
bbaaef |
+ return;
|
|
 |
bbaaef |
+ }
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
int is_snat = !strcmp("snat", nat_type);
|
|
 |
bbaaef |
for (size_t i = 0; i < lr->n_nat; i++) {
|
|
 |
bbaaef |
const struct nbrec_nat *nat = lr->nat[i];
|
|
 |
bbaaef |
@@ -3976,10 +3984,25 @@ nbctl_lr_nat_add(struct ctl_context *ctx)
|
|
 |
bbaaef |
return;
|
|
 |
bbaaef |
}
|
|
 |
bbaaef |
}
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+ }
|
|
 |
bbaaef |
+ if (!strcmp(nat_type, "dnat_and_snat") ||
|
|
 |
bbaaef |
+ !strcmp(nat->type, "dnat_and_snat")) {
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+ if (!strcmp(nat->external_ip, external_ip)) {
|
|
 |
bbaaef |
+ struct smap nat_options = SMAP_INITIALIZER(&nat_options);
|
|
 |
bbaaef |
+ if (!strcmp(smap_get(&nat->options, "stateless"),
|
|
 |
bbaaef |
+ "true") || stateless) {
|
|
 |
bbaaef |
+ ctl_error(ctx, "%s, %s: External ip cannot be shared "
|
|
 |
bbaaef |
+ "across stateless and stateful NATs",
|
|
 |
bbaaef |
+ external_ip, new_logical_ip);
|
|
 |
bbaaef |
+ }
|
|
 |
bbaaef |
+ }
|
|
 |
bbaaef |
}
|
|
 |
bbaaef |
}
|
|
 |
bbaaef |
|
|
 |
bbaaef |
/* Create the NAT. */
|
|
 |
bbaaef |
+ struct smap nat_options = SMAP_INITIALIZER(&nat_options);
|
|
 |
bbaaef |
struct nbrec_nat *nat = nbrec_nat_insert(ctx->txn);
|
|
 |
bbaaef |
nbrec_nat_set_type(nat, nat_type);
|
|
 |
bbaaef |
nbrec_nat_set_external_ip(nat, external_ip);
|
|
 |
bbaaef |
@@ -3988,7 +4011,12 @@ nbctl_lr_nat_add(struct ctl_context *ctx)
|
|
 |
bbaaef |
nbrec_nat_set_logical_port(nat, logical_port);
|
|
 |
bbaaef |
nbrec_nat_set_external_mac(nat, external_mac);
|
|
 |
bbaaef |
}
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+ smap_add(&nat_options, "stateless", stateless ? "true":"false");
|
|
 |
bbaaef |
+ nbrec_nat_set_options(nat, &nat_options);
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
free(new_logical_ip);
|
|
 |
bbaaef |
+ smap_destroy(&nat_options);
|
|
 |
bbaaef |
|
|
 |
bbaaef |
/* Insert the NAT into the logical router. */
|
|
 |
bbaaef |
nbrec_logical_router_verify_nat(lr);
|
|
 |
bbaaef |
@@ -5707,7 +5735,7 @@ static const struct ctl_command_syntax nbctl_commands[] = {
|
|
 |
bbaaef |
/* NAT commands. */
|
|
 |
bbaaef |
{ "lr-nat-add", 4, 6,
|
|
 |
bbaaef |
"ROUTER TYPE EXTERNAL_IP LOGICAL_IP [LOGICAL_PORT EXTERNAL_MAC]", NULL,
|
|
 |
bbaaef |
- nbctl_lr_nat_add, NULL, "--may-exist", RW },
|
|
 |
bbaaef |
+ nbctl_lr_nat_add, NULL, "--may-exist,--stateless", RW },
|
|
 |
bbaaef |
{ "lr-nat-del", 1, 3, "ROUTER [TYPE [IP]]", NULL,
|
|
 |
bbaaef |
nbctl_lr_nat_del, NULL, "--if-exists", RW },
|
|
 |
bbaaef |
{ "lr-nat-list", 1, 1, "ROUTER", NULL, nbctl_lr_nat_list, NULL, "", RO },
|
|
 |
bbaaef |
diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
|
|
 |
bbaaef |
index 620b778b7..d5dce90f4 100644
|
|
 |
bbaaef |
--- a/tests/ovn-nbctl.at
|
|
 |
bbaaef |
+++ b/tests/ovn-nbctl.at
|
|
 |
bbaaef |
@@ -533,6 +533,39 @@ snat 30.0.0.1 192.168.1.0/24
|
|
 |
bbaaef |
snat fd01::1 fd11::/64
|
|
 |
bbaaef |
])
|
|
 |
bbaaef |
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --bare --columns=options list nat | grep stateless=true| wc -l], [0],
|
|
 |
bbaaef |
+[0
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --stateless lr-nat-add lr0 dnat_and_snat 40.0.0.2 192.168.1.4])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --bare --columns=options list nat | grep stateless=true| wc -l], [0],
|
|
 |
bbaaef |
+[1
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --stateless lr-nat-add lr0 dnat_and_snat fd21::1 fd11::2])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --bare --columns=options list nat | grep stateless=true| wc -l], [0],
|
|
 |
bbaaef |
+[2
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl lr-nat-del lr0 dnat_and_snat fd21::1])
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --stateless lr-nat-add lr0 dnat 40.0.0.2 192.168.1.4], [1], [],
|
|
 |
bbaaef |
+[ovn-nbctl: stateless is not applicable to dnat or snat types
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --stateless lr-nat-add lr0 snat 40.0.0.2 192.168.1.4], [1], [],
|
|
 |
bbaaef |
+[ovn-nbctl: stateless is not applicable to dnat or snat types
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl lr-nat-add lr0 snat 40.0.0.2 192.168.1.5], [1], [],
|
|
 |
bbaaef |
+[ovn-nbctl: 40.0.0.2, 192.168.1.5: External ip cannot be shared across stateless and stateful NATs
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl lr-nat-add lr0 dnat 40.0.0.2 192.168.1.5], [1], [],
|
|
 |
bbaaef |
+[ovn-nbctl: 40.0.0.2, 192.168.1.5: External ip cannot be shared across stateless and stateful NATs
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl lr-nat-add lr0 snat 40.0.0.3 192.168.1.6])
|
|
 |
bbaaef |
+AT_CHECK([ovn-nbctl --stateless lr-nat-add lr0 dnat_and_snat 40.0.0.3 192.168.1.7], [1], [],
|
|
 |
bbaaef |
+[ovn-nbctl: 40.0.0.3, 192.168.1.7: External ip cannot be shared across stateless and stateful NATs
|
|
 |
bbaaef |
+])
|
|
 |
bbaaef |
+
|
|
 |
bbaaef |
dnl Deletes the NATs
|
|
 |
bbaaef |
AT_CHECK([ovn-nbctl lr-nat-del lr0 dnat_and_snat 30.0.0.3], [1], [],
|
|
 |
bbaaef |
[ovn-nbctl: no matching NAT with the type (dnat_and_snat) and external_ip (30.0.0.3)
|
|
 |
bbaaef |
@@ -552,8 +585,10 @@ TYPE EXTERNAL_IP LOGICAL_IP EXTERNAL_MAC L
|
|
 |
bbaaef |
dnat 30.0.0.1 192.168.1.2
|
|
 |
bbaaef |
dnat fd01::1 fd11::2
|
|
 |
bbaaef |
dnat_and_snat 30.0.0.2 192.168.1.3
|
|
 |
bbaaef |
+dnat_and_snat 40.0.0.2 192.168.1.4
|
|
 |
bbaaef |
dnat_and_snat fd01::2 fd11::3
|
|
 |
bbaaef |
snat 30.0.0.1 192.168.1.0/24
|
|
 |
bbaaef |
+snat 40.0.0.3 192.168.1.6
|
|
 |
bbaaef |
snat fd01::1 fd11::/64
|
|
 |
bbaaef |
])
|
|
 |
bbaaef |
|
|
 |
bbaaef |
@@ -561,8 +596,10 @@ AT_CHECK([ovn-nbctl lr-nat-del lr0 dnat])
|
|
 |
bbaaef |
AT_CHECK([ovn-nbctl lr-nat-list lr0], [0], [dnl
|
|
 |
bbaaef |
TYPE EXTERNAL_IP LOGICAL_IP EXTERNAL_MAC LOGICAL_PORT
|
|
 |
bbaaef |
dnat_and_snat 30.0.0.2 192.168.1.3
|
|
 |
bbaaef |
+dnat_and_snat 40.0.0.2 192.168.1.4
|
|
 |
bbaaef |
dnat_and_snat fd01::2 fd11::3
|
|
 |
bbaaef |
snat 30.0.0.1 192.168.1.0/24
|
|
 |
bbaaef |
+snat 40.0.0.3 192.168.1.6
|
|
 |
bbaaef |
snat fd01::1 fd11::/64
|
|
 |
bbaaef |
])
|
|
 |
bbaaef |
|
|
 |
bbaaef |
--
|
|
 |
bbaaef |
2.23.0
|
|
 |
bbaaef |
|