kern/121668: connect randomly fails with EPERM with some pf rules

Laurent Frigault lfrigault at agneau.org
Thu Mar 13 16:50:01 UTC 2008


>Number:         121668
>Category:       kern
>Synopsis:       connect randomly fails with EPERM with some pf rules
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 13 16:50:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Laurent Frigault
>Release:        6.2-RELEASE-p10 , 7.0-RELEASE
>Organization:
>Environment:
FreeBSD troll.free.org 6.2-RELEASE-p10 FreeBSD 6.2-RELEASE-p10 #0: Wed Jan 16 14:22:17 CET 2008     lolo at troll.free.org:/usr/src/sys/i386/compile/SMP  i386

FreeBSD surt.free.org 7.0-RELEASE FreeBSD 7.0-RELEASE #1: Wed Feb 27 18:29:25 CET 2008     root at surt.free.org:/usr/src/sys/amd64/compile/GENERIC  amd64

>Description:
>From times to times, connect fails with EPERM when using pf statefully.

I discover this problem when investigating the cause of unexpected mysql connection failure between a web php script and and mysql server running on an other server. This leads me to a connect(2) problem failing without reason with EPERM (there is no EPERM failure cause in connect manual) .

ruleset1 (no state was the default before 7.0):
==============================================
scrub in all fragment reassemble
 
pass out quick on lo0 all no state
pass in quick on lo0 all no state
..
==============================================
ruleset 2

==============================================
scrub in all fragment reassemble

pass out quick on lo0 proto tcp from any to any port 9 flags S/SA keep state
pass out quick on lo0 all no state
pass in quick on lo0 all no state
==============================================

With ruleset 1 => no problem
With ruleset 2 => connect fails sometimes with EPERM

There is no reject information in pf logs which is logical because pf rules authorize those connections

>How-To-Repeat:
sysctl net.inet.tcp.nolocaltimewait=1
not needed, but helps to reproduce the problem with client and server on the same computer.

start inetd with discard/tcp service enabled :

inetd_enable="YES"
inetd_flags="-wl -R 0"

% grep ^discard /etc/inetd.conf 
discard stream  tcp     nowait  root    internal

pf rules:
scrub in all fragment reassemble

pass out quick on lo0 proto tcp from any to any port 9 flags S/SA keep state
pass out quick on lo0 all no state
pass in quick on lo0 all no state

Lauch the following perl script.

Sometimes, connect will wrongly fail with EPERM
==============================================================
#!/usr/bin/perl -w

use strict;

use Socket;
use Errno;

$|=1;

sub con($$$)
{
        my ($sin,$port,$proto) = @_;

        socket(Socket_Handle, PF_INET, SOCK_STREAM, $proto);
        if(connect(Socket_Handle,$sin))
        {
                print "ok\t";
                print Socket_Handle "hello\n";
                close (Socket_Handle);
        }
        else
        {
                print "$!\n";
        };
}
  
my $proto =  getprotobyname('tcp');
my $port = getservbyname('discard', 'tcp');
my $sin = sockaddr_in($port,inet_aton("127.1"));
   
for (my $cpt=0;$cpt<=2000;++$cpt)
{
        print "$cpt\t";
        con($sin,$port,$proto);
};
==============================================================

>Fix:


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list