[prev in list] [next in list] [prev in thread] [next in thread]
List: ipfilter
Subject: GRE/PPTP patch
From: Darren Reed <darrenr () reed ! wattle ! id ! au>
Date: 2009-08-16 14:15:16
Message-ID: 31288_1250432805_4A881724_31288_10435_1_4A881474.2000903 () reed ! wattle ! id ! au
[Download RAW message or body]
Attached to this email is a patch that should allow
multiple PPTP/GRE streams through an ipfilter firewall.
Unfortunately, I don't use PPTP/GRE, so I can't test
this out. Is there someone out there that does and
can?
Thanks,
Darren
["gre.patch" (text/plain)]
Index: fil.c
===================================================================
RCS file: /devel/CVS/IP-Filter/fil.c,v
retrieving revision 2.243.2.147
diff -c -r2.243.2.147 fil.c
*** fil.c 21 Jul 2009 22:25:28 -0000 2.243.2.147
--- fil.c 16 Aug 2009 14:11:43 -0000
***************
*** 882,897 ****
static INLINE void frpr_gre6(fin)
fr_info_t *fin;
{
! grehdr_t *gre;
! frpr_short6(fin, sizeof(grehdr_t));
! if (frpr_pullup(fin, sizeof(grehdr_t)) == -1)
return;
! gre = fin->fin_dp;
! if (GRE_REV(gre->gr_flags) == 1)
! fin->fin_data[0] = gre->gr_call;
}
#endif /* USE_INET6 */
--- 882,922 ----
static INLINE void frpr_gre6(fin)
fr_info_t *fin;
{
! grehdr_t *gre, grhdr;
! int keyoff = 1;
! int len;
!
! frpr_short6(fin, sizeof(*gre));
! if (fin->fin_off != 0)
! return;
! if (frpr_pullup(fin, sizeof(*gre)) == -1)
return;
! if (fin->fin_off == 0) {
! gre = fin->fin_dp;
! grhdr.gr_flags = ntohl(gre->gr_flags);
! if (grhdr.gr_ver == 0) {
! len = sizeof(grhdr);
! if (grhdr.gr_C == 1) {
! len += 4;
! keyoff = 2;
! }
! if (grhdr.gr_K == 1)
! len += 4;
! if (grhdr.gr_S == 1)
! len += 4;
! if (len > sizeof(grhdr)) {
! frpr_short6(fin, len);
! if (frpr_pullup(fin, len) == -1)
! return;
! }
! if (!(fin->fin_flx & FI_SHORT) && (grhdr.gr_K == 1)) {
! fin->fin_datum = ((u_32_t *)gre)[keyoff];
! }
! }
! }
}
#endif /* USE_INET6 */
***************
*** 1370,1376 ****
static INLINE void frpr_gre(fin)
fr_info_t *fin;
{
! grehdr_t *gre;
frpr_short(fin, sizeof(*gre));
--- 1395,1403 ----
static INLINE void frpr_gre(fin)
fr_info_t *fin;
{
! grehdr_t *gre, grhdr;
! int keyoff = 1;
! int len;
frpr_short(fin, sizeof(*gre));
***************
*** 1382,1389 ****
if (fin->fin_off == 0) {
gre = fin->fin_dp;
! if (GRE_REV(gre->gr_flags) == 1)
! fin->fin_data[0] = gre->gr_call;
}
}
--- 1409,1434 ----
if (fin->fin_off == 0) {
gre = fin->fin_dp;
! grhdr.gr_flags = ntohl(gre->gr_flags);
! if (grhdr.gr_ver == 0) {
! len = sizeof(grhdr);
! if (grhdr.gr_C == 1) {
! len += 4;
! keyoff = 2;
! }
! if (grhdr.gr_K == 1)
! len += 4;
! if (grhdr.gr_S == 1)
! len += 4;
! if (len > sizeof(grhdr)) {
! frpr_short(fin, len);
! if (frpr_pullup(fin, len) == -1)
! return;
! }
! if (!(fin->fin_flx & FI_SHORT) && (grhdr.gr_K == 1)) {
! fin->fin_datum = ((u_32_t *)gre)[keyoff];
! }
! }
}
}
Index: ip_fil.h
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_fil.h,v
retrieving revision 2.170.2.62
diff -c -r2.170.2.62 ip_fil.h
*** ip_fil.h 22 Jul 2009 01:46:42 -0000 2.170.2.62
--- ip_fil.h 16 Aug 2009 14:11:43 -0000
***************
*** 361,366 ****
--- 361,367 ----
#define fin_sport fin_dat.fid_16[0]
#define fin_dport fin_dat.fid_16[1]
#define fin_ports fin_dat.fid_32
+ #define fin_datum fin_dat.fid_32
#define IPF_IN 0
#define IPF_OUT 1
***************
*** 983,992 ****
typedef struct grehdr {
union {
struct grebits gru_bits;
! u_short gru_flags;
} gr_un;
- u_short gr_len;
- u_short gr_call;
} grehdr_t;
#define gr_flags gr_un.gru_flags
--- 984,991 ----
typedef struct grehdr {
union {
struct grebits gru_bits;
! u_32_t gru_flags;
} gr_un;
} grehdr_t;
#define gr_flags gr_un.gru_flags
***************
*** 1005,1011 ****
* GRE information tracked by "keep state"
*/
typedef struct greinfo {
! u_short gs_call[2];
u_short gs_flags;
u_short gs_ptype;
} greinfo_t;
--- 1004,1010 ----
* GRE information tracked by "keep state"
*/
typedef struct greinfo {
! u_32_t gs_call;
u_short gs_flags;
u_short gs_ptype;
} greinfo_t;
Index: ip_nat.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_nat.c,v
retrieving revision 2.195.2.127
diff -c -r2.195.2.127 ip_nat.c
*** ip_nat.c 21 Jul 2009 09:40:55 -0000 2.195.2.127
--- ip_nat.c 16 Aug 2009 14:11:43 -0000
***************
*** 2126,2142 ****
((icmphdr_t *)fin->fin_dp)->icmp_id = port;
nat->nat_inport = port;
nat->nat_outport = port;
- #if 0
} else if (fin->fin_p == IPPROTO_GRE) {
nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
if (GRE_REV(nat->nat_gre.gs_flags) == 1) {
! nat->nat_oport = 0;/*fin->fin_data[1];*/
! nat->nat_inport = 0;/*fin->fin_data[0];*/
! nat->nat_outport = 0;/*fin->fin_data[0];*/
! nat->nat_call[0] = fin->fin_data[0];
! nat->nat_call[1] = fin->fin_data[0];
}
- #endif
}
ni->nai_ip.s_addr = in.s_addr;
ni->nai_port = port;
--- 2126,2139 ----
((icmphdr_t *)fin->fin_dp)->icmp_id = port;
nat->nat_inport = port;
nat->nat_outport = port;
} else if (fin->fin_p == IPPROTO_GRE) {
nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
if (GRE_REV(nat->nat_gre.gs_flags) == 1) {
! nat->nat_oport = fin->fin_data[1];
! nat->nat_inport = fin->fin_data[0];
! nat->nat_outport = fin->fin_data[0];
! nat->nat_call = fin->fin_datum;
}
}
ni->nai_ip.s_addr = in.s_addr;
ni->nai_port = port;
***************
*** 2318,2334 ****
((icmphdr_t *)fin->fin_dp)->icmp_id = nport;
nat->nat_inport = nport;
nat->nat_outport = nport;
- #if 0
} else if (fin->fin_p == IPPROTO_GRE) {
nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
if (GRE_REV(nat->nat_gre.gs_flags) == 1) {
! nat->nat_call[0] = fin->fin_data[0];
! nat->nat_call[1] = fin->fin_data[1];
! nat->nat_oport = 0; /*fin->fin_data[0];*/
! nat->nat_inport = 0; /*fin->fin_data[1];*/
! nat->nat_outport = 0; /*fin->fin_data[1];*/
}
- #endif
}
return move;
--- 2315,2328 ----
((icmphdr_t *)fin->fin_dp)->icmp_id = nport;
nat->nat_inport = nport;
nat->nat_outport = nport;
} else if (fin->fin_p == IPPROTO_GRE) {
nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
if (GRE_REV(nat->nat_gre.gs_flags) == 1) {
! nat->nat_oport = fin->fin_data[0];
! nat->nat_inport = fin->fin_data[1];
! nat->nat_outport = fin->fin_data[1];
! nat->nat_call = fin->fin_datum;
}
}
return move;
***************
*** 3190,3201 ****
|| (p == nat->nat_p))) {
switch (p)
{
- #if 0
case IPPROTO_GRE :
! if (nat->nat_call[1] != fin->fin_data[0])
continue;
break;
- #endif
case IPPROTO_ICMP :
if ((flags & IPN_ICMPERR) != 0) {
if (nat->nat_outport != sport)
--- 3184,3193 ----
|| (p == nat->nat_p))) {
switch (p)
{
case IPPROTO_GRE :
! if (nat->nat_call != fin->fin_datum)
continue;
break;
case IPPROTO_ICMP :
if ((flags & IPN_ICMPERR) != 0) {
if (nat->nat_outport != sport)
***************
*** 3433,3444 ****
|| (p == nat->nat_p))) {
switch (p)
{
- #if 0
case IPPROTO_GRE :
! if (nat->nat_call[1] != fin->fin_data[0])
continue;
break;
- #endif
case IPPROTO_TCP :
case IPPROTO_UDP :
if (nat->nat_oport != dport)
--- 3425,3434 ----
|| (p == nat->nat_p))) {
switch (p)
{
case IPPROTO_GRE :
! if (nat->nat_call != fin->fin_datum)
continue;
break;
case IPPROTO_TCP :
case IPPROTO_UDP :
if (nat->nat_oport != dport)
Index: ip_nat.h
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_nat.h,v
retrieving revision 2.90.2.23
diff -c -r2.90.2.23 ip_nat.h
*** ip_nat.h 6 Nov 2008 21:18:36 -0000 2.90.2.23
--- ip_nat.h 16 Aug 2009 14:11:43 -0000
***************
*** 137,142 ****
--- 137,144 ----
#define nat_tcpstate nat_tqe.tqe_state
#define nat_die nat_tqe.tqe_die
#define nat_touched nat_tqe.tqe_touched
+ #define nat_gre nat_un.nat_ugre
+ #define nat_call nat_un.nat_ugre.gs_call
/*
* Values for nat_dir
Index: ip_pptp_pxy.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_pptp_pxy.c,v
retrieving revision 2.10.2.18
diff -c -r2.10.2.18 ip_pptp_pxy.c
*** ip_pptp_pxy.c 6 Nov 2008 21:18:36 -0000 2.10.2.18
--- ip_pptp_pxy.c 16 Aug 2009 14:11:43 -0000
***************
*** 93,106 ****
ip = fin->fin_ip;
- if (nat_outlookup(fin, 0, IPPROTO_GRE, nat->nat_inip,
- ip->ip_dst) != NULL) {
- if (ippr_pptp_debug > 0)
- printf("ippr_pptp_new: GRE session %s\n",
- "already exists");
- return -1;
- }
-
aps->aps_psiz = sizeof(*pptp);
KMALLOCS(aps->aps_data, pptp_pxy_t *, sizeof(*pptp));
if (aps->aps_data == NULL) {
--- 93,98 ----
Index: ip_state.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_state.c,v
retrieving revision 2.186.2.98
diff -c -r2.186.2.98 ip_state.c
*** ip_state.c 21 Jul 2009 09:40:56 -0000 2.186.2.98
--- ip_state.c 16 Aug 2009 14:11:43 -0000
***************
*** 1284,1293 ****
is->is_gre.gs_flags = gre->gr_flags;
is->is_gre.gs_ptype = gre->gr_ptype;
! if (GRE_REV(is->is_gre.gs_flags) == 1) {
! is->is_call[0] = fin->fin_data[0];
! is->is_call[1] = fin->fin_data[1];
! }
break;
case IPPROTO_TCP :
--- 1284,1290 ----
is->is_gre.gs_flags = gre->gr_flags;
is->is_gre.gs_ptype = gre->gr_ptype;
! is->is_call = fin->fin_datum;
break;
case IPPROTO_TCP :
***************
*** 2812,2825 ****
fin->fin_flx |= oow;
break;
- #if 0
case IPPROTO_GRE :
! gre = fin->fin_dp;
! if (GRE_REV(gre->gr_flags) == 1) {
! hv += gre->gr_call;
! }
/* FALLTHROUGH */
- #endif
default :
ifqp = NULL;
hvm = DOUBLE_HASH(hv);
--- 2809,2817 ----
fin->fin_flx |= oow;
break;
case IPPROTO_GRE :
! hv += fin->fin_datum;
/* FALLTHROUGH */
default :
ifqp = NULL;
hvm = DOUBLE_HASH(hv);
Index: lib/printstate.c
===================================================================
RCS file: /devel/CVS/IP-Filter/lib/printstate.c,v
retrieving revision 1.11.2.13
diff -c -r1.11.2.13 printstate.c
*** lib/printstate.c 9 Sep 2007 11:32:13 -0000 1.11.2.13
--- lib/printstate.c 16 Aug 2009 14:11:45 -0000
***************
*** 51,58 ****
PRINTF(" %hu -> %hu\n", ntohs(sp->is_sport),
ntohs(sp->is_dport));
} else if (sp->is_p == IPPROTO_GRE) {
! PRINTF(" call %hx/%hx\n", ntohs(sp->is_gre.gs_call[0]),
! ntohs(sp->is_gre.gs_call[1]));
} else if (sp->is_p == IPPROTO_ICMP
#ifdef USE_INET6
|| sp->is_p == IPPROTO_ICMPV6
--- 51,57 ----
PRINTF(" %hu -> %hu\n", ntohs(sp->is_sport),
ntohs(sp->is_dport));
} else if (sp->is_p == IPPROTO_GRE) {
! PRINTF(" call %x\n", ntohl(sp->is_gre.gs_call));
} else if (sp->is_p == IPPROTO_ICMP
#ifdef USE_INET6
|| sp->is_p == IPPROTO_ICMPV6
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic