|
@@ -28,6 +28,7 @@
|
|
|
#include <net/ip6_route.h>
|
|
|
#include <linux/icmpv6.h>
|
|
|
#include <linux/netfilter.h>
|
|
|
+#include <net/netfilter/nf_conntrack.h>
|
|
|
#include <linux/netfilter_ipv4.h>
|
|
|
|
|
|
#include <net/ip_vs.h>
|
|
@@ -348,6 +349,30 @@ ip_vs_bypass_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static void
|
|
|
+ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp)
|
|
|
+{
|
|
|
+ struct nf_conn *ct = (struct nf_conn *)skb->nfct;
|
|
|
+ struct nf_conntrack_tuple new_tuple;
|
|
|
+
|
|
|
+ if (ct == NULL || nf_ct_is_untracked(ct) || nf_ct_is_confirmed(ct))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The connection is not yet in the hashtable, so we update it.
|
|
|
+ * CIP->VIP will remain the same, so leave the tuple in
|
|
|
+ * IP_CT_DIR_ORIGINAL untouched. When the reply comes back from the
|
|
|
+ * real-server we will see RIP->DIP.
|
|
|
+ */
|
|
|
+ new_tuple = ct->tuplehash[IP_CT_DIR_REPLY].tuple;
|
|
|
+ new_tuple.src.u3 = cp->daddr;
|
|
|
+ /*
|
|
|
+ * This will also take care of UDP and other protocols.
|
|
|
+ */
|
|
|
+ new_tuple.src.u.tcp.port = cp->dport;
|
|
|
+ nf_conntrack_alter_reply(ct, &new_tuple);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* NAT transmitter (only for outside-to-inside nat forwarding)
|
|
|
* Not used for related ICMP
|
|
@@ -403,6 +428,8 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
|
|
|
|
|
|
IP_VS_DBG_PKT(10, pp, skb, 0, "After DNAT");
|
|
|
|
|
|
+ ip_vs_update_conntrack(skb, cp);
|
|
|
+
|
|
|
/* FIXME: when application helper enlarges the packet and the length
|
|
|
is larger than the MTU of outgoing device, there will be still
|
|
|
MTU problem. */
|
|
@@ -479,6 +506,8 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,
|
|
|
|
|
|
IP_VS_DBG_PKT(10, pp, skb, 0, "After DNAT");
|
|
|
|
|
|
+ ip_vs_update_conntrack(skb, cp);
|
|
|
+
|
|
|
/* FIXME: when application helper enlarges the packet and the length
|
|
|
is larger than the MTU of outgoing device, there will be still
|
|
|
MTU problem. */
|