Please find below a patch to correct the behaviour.

I have also opened a trac ticket :
https://community.openvpn.net/openvpn/ticket/14

chantra

----
http://www.debuntu.org


> 
> Hi all,
> 
> It seems that openvpn is not handling properly non-standard subnets in
> pf_file.
> This issue happened on debian etch openvpn 2.1 rc11
> 
> Today, while I made a typo, the following rule did not work properly:
> 
>         # cat /dev/shm/openvpn_pf_73f2c3256a50371f057d5c0db97ede2f.tmp
>         [CLIENTS DROP]
>         
>         [SUBNETS ACCEPT]
>         +192.168.100.0/29
>         -192.168.100.8/28
>         
>         [END]
>         
> 
> -192.168.100.8/28 was simply ignored which basically allowed the client
> to ping the whole subnet
> 
> The following rule behaved properly though.
> 
>         # cat /dev/shm/openvpn_pf_f2b43d3cb1acd5a2720c01559cb03dc3.tmp
>         [CLIENTS DROP]
>         
>         [SUBNETS ACCEPT]
>         +192.168.100.0/29
>         -192.168.100.0/28
>         [END]
>         
> 
> I agree it is not a really bug as it is a user error in the first place
> and openvpn carried on happily discarding this rule.
> But maybe openvpn could try to handle such subnets and translate it as
> 192.168.100.0/8.
> 
> I could try to look into it if you guys believe it should be handled by
> openvpn (or maybe this has already been fixed?)
> 
> Regards,
> 
> chantra
> 




!DSPAM:4c07c0c661671935912581!
>From 09ddcf75171804503119912b45876d92c3476cbc Mon Sep 17 00:00:00 2001
From: chantra <chan...@debuntu.org>
List-Post: openvpn-devel@lists.sourceforge.net
Date: Wed, 2 Jun 2010 12:44:26 +0200
Subject: [PATCH] Handle non standard subnets in PF grammar

Allow subnets for like 192.168.100.8/28 to be understood
---
 pf.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/pf.c b/pf.c
index 3ce2ef2..f16ec9c 100644
--- a/pf.c
+++ b/pf.c
@@ -121,7 +121,7 @@ add_subnet (const char *line, const char *prefix, const int line_num, struct pf_
     struct pf_subnet *e;
     ALLOC_OBJ_CLEAR (e, struct pf_subnet);
     e->rule.exclude = exclude;
-    e->rule.network = ntohl (network.s_addr);
+    e->rule.network = ntohl (network.s_addr) & netmask;
     e->rule.netmask = netmask;
     **next = e;
     *next = &e->next;
-- 
1.5.6.5

Reply via email to