All of lore.kernel.org
 help / color / mirror / Atom feed
From: Florian Westphal <fw@strlen.de>
To: Yi Chen <yiche@redhat.com>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [PATCH v2] tests: shell: Add a test case for FTP helper combined with NAT.
Date: Mon, 9 Jun 2025 23:35:18 +0200	[thread overview]
Message-ID: <aEdTln3VvlQNgPXT@strlen.de> (raw)
In-Reply-To: <20250609081428.9219-1-yiche@redhat.com>

Yi Chen <yiche@redhat.com> wrote:
> This test verifies functionality of the FTP helper,
> for both passive, active FTP modes,
> and the functionality of the nf_nat_ftp module.

Thanks, I had to apply this delta to make this work for me, can
you check that it still passes on your end?

I guess nf_nat_ftp module is already loaded on
your system, its needed for all tests as the FTP server
is on a different address than what the client connectects to.

The important changes are:
 - load nf_nat_ftp early
 - use ${PCAP} for last tcpdump too, local dir isn't writeable
   in my virtme-ng setup.

Rest is debugging aid/cosmetic.  The curl feature check gets extended
to skip in case curl exists but was built with no ftp support.

I removed -s flag from curl, this also removes the error messages,
if any, which makes it harder to debug.  Its fine to have more
information available in case something goes wrong.

I now get:
  I: [OK]         1/1 tests/shell/testcases/packetpath/nat_ftp

No need to resend unless you want to make further enhancements.

diff --git a/tests/shell/features/curl.sh b/tests/shell/features/curl.sh
--- a/tests/shell/features/curl.sh
+++ b/tests/shell/features/curl.sh
@@ -1,4 +1,4 @@
 #!/bin/sh
 
-# check whether curl is installed
-curl -h >/dev/null 2>&1
+# check whether curl is installed and supports ftp
+curl --version | grep "^Protocols: "| grep -q " ftp"
diff --git a/tests/shell/testcases/packetpath/nat_ftp b/tests/shell/testcases/packetpath/nat_ftp
--- a/tests/shell/testcases/packetpath/nat_ftp
+++ b/tests/shell/testcases/packetpath/nat_ftp
@@ -22,7 +22,10 @@ assert_pass()
 		echo "FAIL: ${@}"
 		ip netns exec $R nft list ruleset
 		tcpdump -nnr ${PCAP}
-		ip netns exec $R cat /proc/net/nf_conntrack
+		test -r /proc/net/nf_conntrack && ip netns exec $R cat /proc/net/nf_conntrack
+		ip netns exec $R conntrack -S
+		ip netns exec $R conntrack -L
+		ip netns exec $S ss -nitepal
 		exit 1
 	else
 		echo "PASS: ${@}"
@@ -43,6 +46,9 @@ PCAP="$WORKDIR/tcpdump.pcap"
 mkdir -p $WORKDIR
 assert_pass "mkdir $WORKDIR"
 
+modprobe nf_nat_ftp
+assert_pass "modprobe nf_nat_ftp. Needed for DNAT of data connection and active mode PORT change with SNAT"
+
 ip_sr=2001:db8:ffff:22::1
 ip_cr=2001:db8:ffff:21::2
 ip_rs=2001:db8:ffff:22::fffe
@@ -86,7 +92,7 @@ reload_ruleset()
 		chain PRE-dnat {
 			type nat hook prerouting priority dstnat; policy accept;
 			# Dnat the control connection, data connection will be automaticly NATed.
-			ip6 daddr ${ip_rc} ip6 nexthdr tcp tcp dport 2121 counter dnat ip6 to [${ip_sr}]:21
+			ip6 daddr ${ip_rc} counter ip6 nexthdr tcp tcp dport 2121 counter dnat ip6 to [${ip_sr}]:21
 		}
 
 		chain PRE-aftnat {
@@ -103,7 +109,7 @@ reload_ruleset()
 
 		chain forward {
 			type filter hook forward priority filter; policy drop;
-			ip6 daddr ${ip_sr} tcp dport 21 ct state new counter accept
+			ip6 daddr ${ip_sr} counter tcp dport 21 ct state new counter accept
 			ip6 nexthdr tcp ct state established counter accept
 			ip6 nexthdr tcp ct state related     counter log accept
 		}
@@ -142,7 +148,7 @@ reload_ruleset
 ip netns exec $S tcpdump -q --immediate-mode -Ui s_r -w ${PCAP} 2> /dev/null &
 pid=$!
 sleep 1
-ip netns exec $C curl -s --connect-timeout 5 ftp://[${ip_rc}]:2121/$(basename $INFILE) -o $OUTFILE
+ip netns exec $C curl --no-progress-meter --connect-timeout 5 ftp://[${ip_rc}]:2121/$(basename $INFILE) -o $OUTFILE
 assert_pass "curl ftp passive mode "
 
 cmp "$INFILE" "$OUTFILE"
@@ -155,19 +161,17 @@ assert_pass "assert FTP traffic NATed"
 
 # test active mode
 reload_ruleset
-modprobe nf_nat_ftp
-assert_pass "modprobe nf_nat_ftp. Active mode need it to modify the client ip in PORT command under SNAT"
 
-ip netns exec $S tcpdump -q --immediate-mode -Ui s_r -w ${0##*/}.pcap 2> /dev/null &
+ip netns exec $S tcpdump -q --immediate-mode -Ui s_r -w ${PCAP} 2> /dev/null &
 pid=$!
-ip netns exec $C curl -s -P - --connect-timeout 5 ftp://[${ip_rc}]:2121/$(basename $INFILE) -o $OUTFILE
+ip netns exec $C curl --no-progress-meter -P - --connect-timeout 5 ftp://[${ip_rc}]:2121/$(basename $INFILE) -o $OUTFILE
 assert_pass "curl ftp active mode "
 
 cmp "$INFILE" "$OUTFILE"
 assert_pass "FTP Active mode: in and output files remain the same when FTP traffic passes through NAT."
 
 kill $pid; sync
-tcpdump -nnr ${0##*/}.pcap src ${ip_rs} and dst ${ip_sr} 2>&1 |grep -q FTP
+tcpdump -nnr ${PCAP} src ${ip_rs} and dst ${ip_sr} 2>&1 |grep -q FTP
 assert_pass "assert FTP traffic NATed"
 
 # trap calls cleanup

  reply	other threads:[~2025-06-09 21:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-05 10:33 [PATCH] tests: shell: Add a test case for FTP helper combined with NAT Yi Chen
2025-06-05 10:49 ` [PATCH v2] " Yi Chen
2025-06-06 13:49   ` Florian Westphal
2025-06-06 16:47     ` Yi Chen
2025-06-09  8:37       ` Florian Westphal
2025-06-09  8:14 ` Yi Chen
2025-06-09 21:35   ` Florian Westphal [this message]
2025-06-10  4:05     ` Yi Chen
2025-06-10  6:02       ` Florian Westphal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aEdTln3VvlQNgPXT@strlen.de \
    --to=fw@strlen.de \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=yiche@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.