aboutgitcodebugslistschat
path: root/fwd.c
diff options
context:
space:
mode:
Diffstat (limited to 'fwd.c')
-rw-r--r--fwd.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/fwd.c b/fwd.c
index 3ae25fd..8440094 100644
--- a/fwd.c
+++ b/fwd.c
@@ -1038,21 +1038,19 @@ uint8_t fwd_nat_from_host(const struct ctx *c,
* In either case, let the kernel pick the source address to
* match.
*/
- if (inany_v4(&ini->eaddr)) {
- if (c->host_lo_to_ns_lo)
- tgt->eaddr = inany_loopback4;
- else
- tgt->eaddr = inany_from_v4(c->ip4.addr_seen);
+ if (c->host_lo_to_ns_lo && inany_is_loopback(&ini->oaddr))
+ tgt->eaddr = ini->oaddr;
+ else if (inany_v4(&ini->eaddr))
+ tgt->eaddr = inany_from_v4(c->ip4.addr_seen);
+ else
+ tgt->eaddr.a6 = c->ip6.addr_seen;
+
+ /* Let the kernel pick source address and port */
+ if (inany_v4(&tgt->eaddr))
tgt->oaddr = inany_any4;
- } else {
- if (c->host_lo_to_ns_lo)
- tgt->eaddr = inany_loopback6;
- else
- tgt->eaddr.a6 = c->ip6.addr_seen;
+ else
tgt->oaddr = inany_any6;
- }
- /* Let the kernel pick source port */
tgt->oport = 0;
if (proto == IPPROTO_UDP)
/* But for UDP preserve the source port */