I have setup and configured an OpenBSD 5.3 amd64 system as a router with
multiple WAN links.  All IPv4 traffic except basic FTP seems to work fine
and is load-balanced with redundancy across both WAN connections.

The pseudo setup is:

dsl_if (fxp1)    \
                       --------router -------- internal_if (fxp2)
cable_if (fxp0) /


The router has been up and running for about two weeks with no problems
yet.  I've simulated a single WAN failure during the install window by
disconnecting the dsl interface (and I tested the cable interface as well,
separately).  When the interface goes down I see that 'netstat -nrf
inet|grep default' marks the failed connection's gateway and unusable and
all traffic continues on the working interface.  Once the failed connection
is restored the gateway is detected and marked usable, and all traffic
balanced between the two interfaces.

I am really happy with this setup, except that FTP fails.

To setup this Multi-wan system I configured five files, hostname.fxp0,
hostname.fxp1, pf.conf rc.conf.local and sysctl.conf.

### /etc/hostname.fxp0:
inet <cable_IP> <cable_netmask>
!route add -mpath default <cable_GW>


### /etc/hostname.fxp1:
inet <dsl_IP> <dsl_netmask>
!route add -mpath default <dsl_GW>


### /etc/sysctl.conf:
net.inet.ip.forwarding=1
net.inet.ip.multipath=1


### /etc/rc.conf.local:
ftpproxy_flags="-T ftp-proxy -D7 -vv"


### /etc/pf.conf (relevant to FTP parts only):
cable_if   = "fxp0"
cable_gw   = <cable_GW>  # I used the actual IP for the cable gateway here
dsl_if     = "fxp1"
dsl_gw     = <dsl_GW>   # I used the actual IP for the dsl gateway here
int_if     = "fxp2"

ftpproxy = "8021"

anchor "ftp-proxy/*"

pass out on $cable_if from $dsl_if route-to ( $dsl_if $dsl_gw )
pass out on $dsl_if from $cable_if route-to ( $cable_if $cable_gw )

match out on $cable_if inet from !($cable_if) nat-to ($cable_if)
match out on $dsl_if inet from !($dsl_if) nat-to ($dsl_if)


### end of config files

Note that I am not doing anything with ifstated, nor am i using the
route-to option in pf.conf to balance outgoing traffic.  It seems that the
kernel handles both of these functions just fine as is in 5.3.


Initially to allow FTP, I was doing something in pf.conf like:
pass in quick on $internal_if inet proto tcp to any port ftp divert-to
127.0.0.1 port $ftpproxy
pass out on $cable_if proto tcp from ($cable_if) to any port ftp
pass out on $dsl_if proto tcp from $dsl_if) to any port ftp

...and ftp-proxy was run without any flags.

This resulted in ~1/2 of all connections failing.  From a command line ftp
client you could login to the ftp server, but once you go PASV to get a
directory listing the connection would fail.  The next time you reconnect,
you could get a directory listing and continue your work until you
disconnected.  The next time, your ls would fail.  If you reconnected a 4th
time, everything would work.

I figured that tagging the ftp-proxy helps.  I changed the ftp-proxy
program to run with the flags:
# ftp-proxy  -T ftp-proxy

... and I set up pf.conf to do this instead:
pass in quick on $internal_if inet proto tcp to port ftp divert-to
127.0.0.1 port $ftpproxy
pass in quick on $cable_if tagged ftp-proxy reply-to ( $cable_if $cable_gw
)
pass out quick on $cable_if proto tcp to any port ftp

The result of this setup is that I can login to an ftp server, and when I
do ls I get:
$ ftp -a ftp2.us.freebsd.org
Connected to mirror.symnds.com.
220 Welcome to mirror.symnds.net
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||50153|)
ftp: Can't connect to `63.245.196.124:50153': Connection refused
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
lrwxrwxrwx    1 ftp      ftp            20 Jan 13 08:04 CentOS ->
distributions/CentOS
lrwxrwxrwx    1 ftp      ftp            21 Jan 30  2012 FreeBSD ->
distributions/freebsd
lrwxrwxrwx    1 ftp      ftp            11 Jan 13 08:24 cm -> software/cm
lrwxrwxrwx    1 ftp      ftp            20 Feb 14  2012 debian ->
distributions/debian
drwxrwsr-x   18 ftp      ftp          4096 Apr 01 02:03 distributions
-rw-r--r--    1 ftp      ftp          1406 Jan 30  2012 favicon.ico
lrwxrwxrwx    1 ftp      ftp            12 Sep 27  2012 pkg -> software/pkg
drwxr-xr-x    2 ftp      ftp          4096 Jan 30  2012 pub
-rw-r--r--    1 ftp      ftp        524288 Jan 30  2012 smokeping.test
drwxr-xr-x   15 ftp      ftp          4096 Apr 01 02:04 software
drwxr-xr-x    3 ftp      ftp          4096 May 16  2012 stats
lrwxrwxrwx    1 ftp      ftp            20 Jan 30  2012 ubuntu ->
distributions/ubuntu
226 Directory send OK.

Notice that I get both a connection refused, _and_ the directory listing.

This would be ok, except that browsers see the connection refused error and
give a "cannot connect to ftp server" page instead of the directory listing.

When I do 'pfctl -a ftp-proxy/<PID>.<#> -sr' I can see that the allocated
port number is not the same as the one mentioned by the FTP client above.



I hope I'm pretty close to having FTP working.  If anyone has any
suggestions or ideas on how to get ftp-proxy to play well with this setup,
I'd be happy to try their ideas and report back.

Thanks!
Howard

-- 
--------------------------------------------------------------------------
Notice:  This e-mail message, together with any attachments, contains 
information of Lighthouse Instruments, LLC (Charlottesville, VA, USA) that 
may be confidential, proprietary copyrighted and/or legally privileged, and 
is intended solely for the use of the individual or entity named on this 
message.  If you are not the intended recipient, please return this by 
e-mail and delete it.

Reply via email to