From b5eff7ec4037aac456e49903b99c974298e60134 Mon Sep 17 00:00:00 2001 From: Vadim Kurland Date: Thu, 22 Oct 2009 19:48:43 +0000 Subject: [PATCH] detect cluster interfaces in NAT rules and process accordingly --- build_num | 2 +- src/iptlib/CompilerDriver_ipt_run.cpp | 1 - src/iptlib/NATCompiler_ipt.cpp | 53 +++++++++++++++++++---- test/ipt/objects-for-regression-tests.fwb | 13 ++---- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/build_num b/build_num index 512770896..e0074f2ea 100644 --- a/build_num +++ b/build_num @@ -1 +1 @@ -#define BUILD_NUM 1630 +#define BUILD_NUM 1632 diff --git a/src/iptlib/CompilerDriver_ipt_run.cpp b/src/iptlib/CompilerDriver_ipt_run.cpp index efd9b1b23..5b5430eb3 100644 --- a/src/iptlib/CompilerDriver_ipt_run.cpp +++ b/src/iptlib/CompilerDriver_ipt_run.cpp @@ -201,7 +201,6 @@ string CompilerDriver_ipt::run(const std::string &cluster_id, list all_nat = fw->getByType(NAT::TYPENAME); int routing_rules_count = 0; - bool have_nat = false; bool have_ipv6 = false; // track chains in each table separately. Can we have the same diff --git a/src/iptlib/NATCompiler_ipt.cpp b/src/iptlib/NATCompiler_ipt.cpp index e2feafb34..f3ae3c334 100644 --- a/src/iptlib/NATCompiler_ipt.cpp +++ b/src/iptlib/NATCompiler_ipt.cpp @@ -40,10 +40,13 @@ #include "fwbuilder/UDPService.h" #include "fwbuilder/CustomService.h" #include "fwbuilder/TagService.h" +#include "fwbuilder/Cluster.h" #include "fwbuilder/Host.h" +#include "fwbuilder/FailoverClusterGroup.h" #include "fwbuilder/Network.h" #include "fwbuilder/Interface.h" #include "fwbuilder/IPv4.h" +#include "fwbuilder/IPv6.h" #include "fwbuilder/Firewall.h" #include "fwbuilder/AddressTable.h" #include "fwbuilder/DNSName.h" @@ -2131,19 +2134,53 @@ bool NATCompiler_ipt::AssignInterface::processNext() } } - switch (rule->getRuleType()) { + switch (rule->getRuleType()) + { case NATRule::SNAT: case NATRule::Masq: { - Address* a=compiler->getFirstTSrc(rule); + Address* a = compiler->getFirstTSrc(rule); + Interface *iface = Interface::cast(a); - if ( (Interface::isA(a) || IPv4::isA(a)) && a->isChildOf(compiler->fw)) + if (IPv4::isA(a) || IPv6::isA(a)) { - FWObject *p=a; - while ( ! Interface::isA(p) ) p=p->getParent(); - rule->setInterfaceId( p->getId() ); - tmp_queue.push_back(rule); - return true; + iface = Interface::cast(a->getParent()); + } + + if (iface) + { + if (Cluster::isA(iface->getParentHost()) && + iface->isFailoverInterface()) + { + FWObject *failover_group = + iface->getFirstByType(FailoverClusterGroup::TYPENAME); + + if (failover_group) + { + for (FWObjectTypedChildIterator it = + failover_group->findByType(FWObjectReference::TYPENAME); + it != it.end(); ++it) + { + Interface *fw_iface = Interface::cast(FWObjectReference::getObject(*it)); + assert(fw_iface); + if (fw_iface->isChildOf(compiler->fw)) + { + iface = fw_iface; + rule->setInterfaceId(iface->getId()); + tmp_queue.push_back(rule); + return true; + } + } + } + } else + { + if (iface->isChildOf(compiler->fw)) + { + rule->setInterfaceId(iface->getId()); + tmp_queue.push_back(rule); + return true; + } + } } /* if we appear here, then TSrc is not an interface or address of an diff --git a/test/ipt/objects-for-regression-tests.fwb b/test/ipt/objects-for-regression-tests.fwb index 927a48aff..aa7f2dedd 100644 --- a/test/ipt/objects-for-regression-tests.fwb +++ b/test/ipt/objects-for-regression-tests.fwb @@ -1783,18 +1783,11 @@ - - - - - - - @@ -2981,7 +2974,7 @@ - + @@ -44563,7 +44556,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -44607,7 +44600,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - +