ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 

  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: Inet-Admins
Inet-Admins mailing list archive (inet-admins@info.east.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[inet-admins] transparent proxy: в копилку знаний :)



Hi!

Вот повозился с сабж, и предлагаю вашему внимания два замечания - одно
бесполезное, второе давно известное :)

1. Бесполезное.

Если вы практикуете перехват порта 3128 и имеете много юзверей, использующих
ваш прокси и в явной форме, то есть прописанным в клиенте, либо имеете на
машине с прокси активно юзаемый http-сервер на 80-м порту, то можно
"облегчить" таблицу map'ов для nat'а, приложив к ipfilter приаттаченный патч
(расчитан на версию 3.2.9). Патч разрешает директиву fast, аналогичную
директиве rdr. Эта директива просто останавливает дальнейший перебор правил
и, естественно, не создает никакого map'а, то есть все идет куда и шло, не
загружая nat. map'ируемые адрес и порт после '->' никакого значения не
имеют, пишите туда любое валидное с т.з. синтакисиса значение, просто не
хотелось рыть синтаксис, поэтому оставил его аналогичным.

# Redirect direct web traffic to local web server.
fast ef0 192.168.1.1/32 port 80 -> 192.168.1.1 port 80 tcp
fast ef0 192.168.1.1/32 port 3128 -> 192.168.1.1 port 3128 tcp
# Redirect everything else (http, https, squid) to squid on port 3128
rdr ef0 0.0.0.0/0 port 80 -> 192.168.1.1 port 3128 tcp
rdr ef0 0.0.0.0/0 port 3128 -> 192.168.1.1 port 3128 tcp

2. Давно известное.

Как ни странно, ни в FAQ'е по сквиду, ни на www.lexa.ru не написано, что
делать, если в качестве скринящего роутера используется не мудрая и дорогая
кошка, а банальный и дешевый BSD-box. Возможно, это разумеется само собой,
но тем не менее я приведу пример для ipfilter, который быть может поможет
кому-то из благородных, но бедных донов :)

# Same interface with proxy
pass in quick on ef0 proto tcp from 192.168.1.1 to any port = 80
block in quick on ef0 dup-to ef0:192.168.1.1 proto tcp from any to any port = 80
pass in quick on ef0 all
# Another interface
block in quick on ef1 dup-to ef0:192.168.1.1 proto tcp from any to any port = 80
pass in quick on ef1 all
 
-- 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Pavel N. Vladimirov                                  pasa@pleskov.ru
  Administration of Pskov Region                       FIDO 2:5033/2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff -c ip_fil3.2.9.orig/ip_nat.c ip_fil3.2.9/ip_nat.c
*** ip_fil3.2.9.orig/ip_nat.c	Sat Jun 13 17:42:47 1998
--- ip_fil3.2.9/ip_nat.c	Mon Jan 11 10:57:53 1999
***************
*** 1172,1177 ****
--- 1172,1181 ----
  			    ((in.s_addr & np->in_outmsk) == np->in_outip) &&
  			    (np->in_redir & NAT_REDIRECT) &&
  			     (!np->in_pmin || np->in_pmin == dport)) {
+ /* pasa */			if(np->in_redir & NAT_FAST) {
+                                   nat = 0;
+                                   break;
+                                 }
  				if ((nat = nat_new(np, ip, fin, nflags,
  						    NAT_INBOUND)))
  #ifdef	IPFILTER_LOG
diff -c ip_fil3.2.9.orig/ip_nat.h ip_fil3.2.9/ip_nat.h
*** ip_fil3.2.9.orig/ip_nat.h	Sat May 23 22:52:44 1998
--- ip_fil3.2.9/ip_nat.h	Mon Jan 11 11:03:03 1999
***************
*** 98,103 ****
--- 98,105 ----
  #define	NAT_MAP		0x01
  #define	NAT_REDIRECT	0x02
  #define	NAT_BIMAP	(NAT_MAP|NAT_REDIRECT)
+ #define	NAT_FAST	0x04 /* pasa */
+ #define	NAT_FASTRED	(NAT_REDIRECT|NAT_FAST) /* pasa */
  
  #define	IPN_CMPSIZ	(sizeof(struct in_addr) * 4 + sizeof(u_short) * 3 +   			 sizeof(int) + IFNAMSIZ + APR_LABELLEN + sizeof(char))
diff -c ip_fil3.2.9.orig/ipnat.c ip_fil3.2.9/ipnat.c
*** ip_fil3.2.9.orig/ipnat.c	Sat Jun  6 18:39:56 1998
--- ip_fil3.2.9/ipnat.c	Mon Jan 11 11:08:50 1999
***************
*** 198,203 ****
--- 198,206 ----
  	case NAT_REDIRECT :
  		printf("rdr ");
  		break;
+ 	case NAT_FASTRED : /* pasa */
+ 		printf("fast ");
+ 		break;
  	case NAT_MAP :
  		printf("map ");
  		break;
***************
*** 210,216 ****
  		break;
  	}
  
! 	if (np->in_redir == NAT_REDIRECT) {
  		printf("%s %s", np->in_ifname, inet_ntoa(np->in_out[0]));
  		bits = countbits(np->in_out[1].s_addr);
  		if (bits != -1)
--- 213,220 ----
  		break;
  	}
  
! 	if (np->in_redir == NAT_REDIRECT ||
! /* pasa */  np->in_redir == NAT_FASTRED) {
  		printf("%s %s", np->in_ifname, inet_ntoa(np->in_out[0]));
  		bits = countbits(np->in_out[1].s_addr);
  		if (bits != -1)
***************
*** 298,303 ****
--- 302,310 ----
  	case NAT_REDIRECT :
  		which = "RDR";
  		break;
+ 	case NAT_FASTRED :	/* pasa */
+ 		which = "FAST";
+ 		break;
  	case NAT_BIMAP :
  		which = "BIMAP";
  		break;
***************
*** 493,503 ****
  		ipn.in_redir = NAT_MAP;
  	else if (!strcasecmp(s, "rdr"))
  		ipn.in_redir = NAT_REDIRECT;
  	else if (!strcasecmp(s, "bimap"))
  		ipn.in_redir = NAT_BIMAP;
  	else {
  		(void)fprintf(stderr,
! 			      "expected map/rdr/bimap, got \"%s\"\n", s);
  		return NULL;
  	}
  
--- 500,512 ----
  		ipn.in_redir = NAT_MAP;
  	else if (!strcasecmp(s, "rdr"))
  		ipn.in_redir = NAT_REDIRECT;
+ 	else if (!strcasecmp(s, "fast"))	/* pasa */
+ 		ipn.in_redir = NAT_FASTRED;
  	else if (!strcasecmp(s, "bimap"))
  		ipn.in_redir = NAT_BIMAP;
  	else {
  		(void)fprintf(stderr,
! /* pasa */		      "expected map/rdr/fast/bimap, got \"%s\"\n", s);
  		return NULL;
  	}
  
***************
*** 514,520 ****
  	}
  	shost = s;
  
! 	if (ipn.in_redir == NAT_REDIRECT) {
  		if (!(s = strtok(NULL, " \t"))) {
  			fprintf(stderr, "missing fields (destination port)\n");
  			return NULL;
--- 523,530 ----
  	}
  	shost = s;
  
! 	if (ipn.in_redir == NAT_REDIRECT
! /* pasa */  || ipn.in_redir == NAT_FASTRED) {
  		if (!(s = strtok(NULL, " \t"))) {
  			fprintf(stderr, "missing fields (destination port)\n");
  			return NULL;


 




Copyright © Lexa Software, 1996-2009.