Your ftp-proxy anchor is too late, move it *before* the match...nat-to rules
On 2012-02-14, Nikola KneE>eviD <laladelausa...@gmail.com> wrote: > Hi, > > I'm running into a problem on a Soekris firewall I manage. It is a Soekris > net6501, running OpenBSD 5.0-stable. > On this machine, I run pf and ftp-proxy (ftp-proxy="" in rc.conf.local). There > are 4 NICs on this machine, one is for the internal traffic, one for the DMZ, > one for the phone network and one external. > > There is one remote FTP server (not on our network), that we need to access. > However, when using Filezilla on Windows, the pf drops some packets. When > using the command line ftp on Linux and Windows, the connection works. My > "workaround" was to set Filezilla to establish connections in the active mode, > and change the ftp-proxy correspondingly (ftp-proxy="-r"). However, we would > like to have the whole system running with passive connections. > > > As you can see below, ftp-proxy inserts a rule to allow traffic to the ftp > server 50.22.96.60:45337, however, pf drops that one: > Feb 14 15:43:03.055902 rule 19/(match) block out on em1: gate.XXXX.50641 > > 50.22.96.60-static.reverse.softlayer.com.45337: S 2268496888:2268496888(0) win > 65535 <mss 1260,nop,wscale 2,nop,nop,sackOK> (DF) > > Now, I am aware that the anchor is bound to the address of the local machine > (10.0.10.30), and pf correctly drops the packet. However, I don't know what to > do to allow this kind of traffic? > > Thanks, > Nikola > > ##### The console in Filezilla: > Status: Connected > Status: Retrieving directory listing... > Command: PWD > Response: 257 "/" is your current location > Command: TYPE I > Response: 200 TYPE is now 8-bit binary > Command: PASV > Response: 227 Entering Passive Mode (50,22,96,60,206,25) > Command: MLSD > Error: Connection timed out > Error: Failed to retrieve directory listing > > > ##### The output of ftp-proxy: > #60 accepted connection from 10.0.10.30 > #60 FTP session 2/100 started: client 10.0.10.30 to server 50.22.96.60 via > proxy XXXX > #60 server: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------\r\n > #60 server: 220-You are user number 1 of 50 allowed.\r\n > #60 server: 220-Local time is now 08:43. Server port: 21.\r\n > #60 server: 220-This is a private system - No anonymous login\r\n > #60 server: 220-IPv6 connections are also welcome on this server.\r\n > #60 server: 220 You will be disconnected after 15 minutes of inactivity.\r\n > #60 client: USER YYYY@XXXX \r\n > #60 server: 331 User YYYY@XXXX OK. Password required\r\n > #60 client: PASS ******\r\n > #60 server: 230-OK. Current restricted directory is /\r\n > #60 server: 230 1577608 Kbytes used (30%) - authorized: 5120000 Kb\r\n > #60 client: PWD\r\n > #60 server: 257 "/" is your current location\r\n > #60 client: TYPE I\r\n > #60 server: 200 TYPE is now 8-bit binary\r\n > #60 client: PASV\r\n > #60 server: 227 Entering Passive Mode (50,22,96,60,177,25)\r\n > #60 passive: client to server port 45337 via port 52761 > #60 proxy: 227 Entering Passive Mode (50,22,96,60,206,25)\r\n > #60 client: MLSD\r\n > #60 client close > #60 ending session > > > ##### > And this is the output I see on pflog0 (gate.XXXX is our firewall): > Feb 14 15:43:01.851117 rule 70/(match) pass in on em0: 10.0.10.30.56888 > > 50.22.96.60-static.reverse.softlayer.com.ftp: S 3508732651:3508732651(0) win > 8192 <mss 1260,nop,wscale 2,nop,nop,sackOK> (DF) > Feb 14 15:43:03.055746 rule 73.804.60.0/(match) pass in on em0: > 10.0.10.30.56889 > 50.22.96.60-static.reverse.softlayer.com.45337: S > 2268496888:2268496888(0) win 65535 <mss 1260,nop,wscale 2,nop,nop,sackOK> > (DF) > Feb 14 15:43:03.055902 rule 19/(match) block out on em1: gate.XXXX.50641 > > 50.22.96.60-static.reverse.softlayer.com.45337: S 2268496888:2268496888(0) win > 65535 <mss 1260,nop,wscale 2,nop,nop,sackOK> (DF) > Feb 14 15:43:06.053164 rule 19/(match) block out on em1: gate.XXXX.65096 > > 50.22.96.60-static.reverse.softlayer.com.45337: S 2268496888:2268496888(0) win > 65535 <mss 1260,nop,wscale 2,nop,nop,sackOK> (DF) > > > > ##### > This is the anchor installed by "/usr/sbin/ftp-proxy -D 7 -v -d": > @0 pass in log quick on rdomain 0 inet proto tcp from 10.0.10.30 to > 50.22.96.60 port = 52761 flags S/SA keep state (max 1) rtable 0 rdr-to > 50.22.96.60 port 45337 prio 0 > [ Evaluations: 12 Packets: 4 Bytes: 216 States: 1 > ] > [ Inserted: uid 71 pid 804 State Creations: 1 ] > @1 pass out log quick on rdomain 0 inet proto tcp from 10.0.10.30 to > 50.22.96.60 port = 45337 flags S/SA keep state (max 1) nat-to XXXX prio 0 > [ Evaluations: 5 Packets: 0 Bytes: 0 States: 0 > ] > [ Inserted: uid 71 pid 804 State Creations: 0 ] > > > ##### > The relevant parts of the pf.conf are: > antispoof quick for { lo0 $intif $dmzif $phoneif ($extif) } > > block in quick proto icmp6 > block out quick proto icmp6 > block in quick inet6 > block out quick inet6 > > block drop log on $extif > block return log on $intif > block return log on $dmzif > block return on $phoneif > block return on $tunif > > match out on $extif from $intif:network nat-to ($extif) > match out on $extif from $dmzif:network nat-to ($extif) > > # FTP > pass in log on $intif inet proto tcp from $intif:network to !$intif port ftp > divert-to 127.0.0.1 port 8021 > pass in on $dmzif inet proto tcp from $dmzif:network to !$dmzif port ftp > divert-to 127.0.0.1 port 8021 > pass in on $tunif inet proto tcp from <mobilenet> to !$tunif port ftp > divert-to 127.0.0.1 port 8021 > > anchor "ftp-proxy/*" > > pass out quick inet proto tcp from (self) to any port ftp > > # Access from outside to our internal FTP server > pass in log on $extif inet proto tcp from any to $extif port ftp flags S/SA > modulate state rdr-to $ftpsrvip port ftp > pass out on $dmzif inet proto tcp from any port > 1023 to $ftpsrvip port ftp > > > ##### > List of rules (pfctl -) > @15 block drop in quick proto ipv6-icmp all > @16 block drop in quick inet6 all > @17 block drop out quick proto ipv6-icmp all > @18 block drop out quick inet6 all > @19 block drop log on em1 all > @20 block return log on em0 all > @21 block return log on em2 all > @22 block return on em3 all > @23 block return on tun0 all > > @70 pass in log on em0 inet proto tcp from 10.0.10.0/24 to ! 10.0.10.1 port = > ftp flags S/SA k > eep state (if-bound) divert-to 127.0.0.1 port 8021 > @71 pass in on em2 inet proto tcp from 10.0.11.0/24 to ! 10.0.11.1 port = ftp > flags S/SA keep > state (if-bound) divert-to 127.0.0.1 port 8021 > @72 pass in on tun0 inet proto tcp from <mobilenet:1> to ! 10.0.7.1 port = ftp > flags S/SA keep > state (if-bound) divert-to 127.0.0.1 port 8021 > @73 anchor "ftp-proxy/*" all > @74 pass out quick inet proto tcp from (self:6) to any port = ftp flags S/SA > keep state (if-bo > und) > @75 pass in log on em1 inet proto tcp from any to 77.59.246.98 port = ftp > flags S/SA modulate > state (if-bound) rdr-to 10.0.11.16 port 21 > @76 pass out on em2 inet proto tcp from any port > 1023 to 10.0.11.16 port = > ftp flags S/SA ke > ep state (if-bound)