Страница 1 из 1

PF policy-base routing и localhost

Добавлено: 2011-11-20 12:30:24
Rubi
Здравствуйте, подскажите, настраивал policy-base routing, кажись все настроил, все работает, lan ходит через нужные wan-ы и вдруг выяснилось, что с локальной машины выйти никуда нельзя, при попытке выполнить ping всегда получаю ответ No route to host, при этом локальные адреса в правилах указаны, в тех же что и для всех. На машине не указан default gateway, так как если его указать то localhost начинает работать через него, а не в соответствии с правилами PF. Что тут можно сделать, как заставить PF правила маршрутизации работать для самой локальной машины?

Re: PF policy-base routing и localhost

Добавлено: 2011-11-21 18:37:16
hishnikxxx
Здравствуйте.
Промучался с той же самой темой.
Давно предпочитаю полиси, но есть грабли...
Конфигурация следующая:
Стоит хост, одним интерфейсом - смотрит в Сеть.
другим - в локалку,
tun0 - впн в одном из джейлов (пока его не отлаживал, так что могут быть косяки)
lo1 - на нём расположены все джейлы.

Проблема в следующем: на lo1 интерфейсе пакеты вначале приходят `out` затем уходят к джейлам 'in'.
Как сделать 'nat out' в этой версии PF (FreeBSD 8.2) я не нашёл ;(((
NAT происходит на входе в интерфейс и перед правилами: http://coombs.anu.edu.au/~avalon/ipfil-flow.html
Вероятно та же канитель и с tun0 будет.
Приведу свой рабочий конфиг, в котором видно что нат от Джейлов идёт без использования Policy-Based конфигурации.
При этом с внутреннего интерфейса на внешний - прекрасно натится.
Вопрос - как же сделать так, чтоб джейлы натились через 'tagged' (ну или хотя бы как натить из 'out' буфера)?
Сразу оговорюсь - конфиг избыточен, просто старался учитывать все потоки. В дальнейшем планируется неиспользуемые тэги закоментить в разделе Policy Enforcement

Код: Выделить всё

# The ConFig of xxx
#
# Prepare for filtering
scrub in all
# Defining network interfaces
extif="igb0"
intif="igb1"
vpnif="tun0"
loopback0="lo0"
jailsif0="lo1"
# Defining external IP's
extip="whiteIP"
extip1="whiteIP1"
extip2="whiteIP2"
extip3="whiteIP3"
extip4="whiteIP4"
# Defining internal IP's
intip="192.168.75.101"
intnet="192.168.75.0/24"
janet="192.168.11.0/24"
vpnet="172.16.7.0/24"
vpngw="172.16.7.1"
jbuki="192.168.75.52"
jghivete="192.168.75.57"
intjgw="192.168.11.1"
intjalephip="192.168.11.101"
intjbethip="192.168.11.102"
# All net iface's
ifaces="{" $extif $intif $vpnif "lo0 lo1 }"
# Defining ICMP types to pass
icmp_types=" echoreq "

# Tables
table	<rfc1918>		const	{ 192.168.0.0/16\
								  172.16.0.0/12\
								  10.0.0.0/8 }
table	<eunet>			const	{ 192.168.75.0/24\
								  192.168.11.0/24\
								  172.16.7.0/24 }
table	<jails>			const	{ $intjalephip\
								  $intjbethip }
table	<extips>		const	{ $extip\
								  $extip1\
								  $extip2\
								  $extip3\
								  $extip4 }
table	<me>			const	{ $vpngw\
								  $intjgw\
								  $intip\
								  $extip\
								  $extip1\
								  $extip2\
								  $extip3\
								  $extip4 } 
table	<vpnusers>		persist

## RDR
# Ext
rdr				   pass		on $extif proto tcp to $extip1 port 80 \
-> $jghivete	   port http
rdr				   pass		on $extif proto tcp to $extip1 port 8080 \
-> $jghivete	   port 8080
rdr				   pass		on $extif proto tcp to $extip1 port 389 \
-> $jghivete	   port 389
rdr				   pass log on $extif proto tcp to $extip1 port 3000 \
-> $jbuki port http

# Int
rdr				   pass		on $extif proto { tcp udp } to $extip1 port domain \
-> $intjalephip	   port domain
rdr		 		   pass	   	on $intif proto { tcp udp } to $intip port domain \
-> $intjalephip	   port domain
rdr		 		   pass	    on $extif proto tcp to $extip1 port 2022 \
-> $intjalephip	   port ssh
rdr		 		   pass	 	on $intif proto tcp to $intip  port 2022 \
-> $intjalephip	   port ssh
rdr		 		   pass	 	on $extif proto tcp to $extip1 port 3022 \
-> $intjbethip	   port ssh
rdr		 		   pass	 	on $intif proto tcp to $intip  port 3022 \
-> $intjbethip	   port ssh
rdr		 		   pass	 	on $extif proto udp to $extip2 port 1194 \
-> $intjbethip	   port 1194

# NAT
nat							on $extif				all			tag LAN2INET_NAT		tagged LAN2INET\
 -> ($extif:0)
nat							on $extif		from $janet to !$janet \
 -> ($extif:0)

#tag LAN2INET_NAT tagged LAN2INET -> ($extif:0)
#tag JAILS2INET_NAT tagged JAILS2INET -> ($extif:0)


# SKIP
set		state-policy								if-bound
set 	ruleset-optimization						none
set		skip				on $loopback0

# POLICY RULES
block			log									all
block	in 		log quick	on $extif		from <rfc1918>

# LEGACY
pass				inet proto icmp			icmp-type $icmp_types			tag ICMP
pass				inet proto udp 	from any to any port 33433 >< 33626		tag TRACE

# NETS classifying

## JAILS iface
### IN
pass	out		log			on $jailsif0	from		$janet							tag JAILS2ANY
pass	out		log    		on $jailsif0	to			$janet		tagged JAILS2ANY 	tag JAILS2JAILS
pass	out		log    		on $jailsif0 	to			$intnet		tagged JAILS2ANY 	tag JAILS2LAN
pass	out		log    		on $jailsif0	to			$vpnet		tagged JAILS2ANY 	tag JAILS2VPN
pass	out  	log    		on $jailsif0			all				tagged JAILS2ANY	tag JAILS2INET
block	out 	log quick 	on $jailsif0			all				tagged JAILS2ANY
## LAN
### IN
pass	in					on $intif		from		$intnet							tag LAN2ANY
pass 	in  				on $intif		to			$intnet		tagged LAN2ANY		tag LAN2LAN
pass	in					on $intif		to			$janet		tagged LAN2ANY		tag LAN2JAILS
pass 	in					on $intif		to			$vpnet		tagged LAN2ANY		tag LAN2VPN
pass	in					on $intif 				all				tagged LAN2ANY		tag LAN2INET
block	in		log quick	on $intif				all				tagged LAN2ANY
## VPN
### IN
pass	in					on $vpnif		from		$vpnet							tag VPN2ANY
pass	in					on $vpnif		to <vpnusers>			tagged VPN2ANY		tag VPN2VPN
pass	in					on $vpnif		to $janet				tagged VPN2ANY		tag VPN2JAILS
pass	in					on $vpnif		to $intnet				tagged VPN2ANY		tag VPN2LAN
pass	in					on $vpnif 		   		all				tagged VPN2ANY		tag LAN2INET
block	in		log quick	on $vpnif				all				tagged VPN2ANY
## SELF
### IN
pass	in					on $extif				all									tag INET2ANY
pass	in					on $extif 		to <extips>									tag INET2ME
pass	in					on $intif		to <me>					tagged LAN2INET		tag LAN2ME
pass	in					on $jailsif0	to <me>					tagged JAILS2JAILS	tag JAILS2ME
pass	in					on $vpnif		to <me>					tagged VPN2VPN		tag VPN2ME
block	in		log quick	on $extif		   		all				tagged INET2ANY

## JAILS
### OUT
pass	in		log		   on $jailsif0	to				$janet							tag ANY2JAILS
pass	in		log		   on $jailsif0	from			$janet		tagged ANY2JAILS	tag JAILS2JAILS
pass	in		log		   on $jailsif0	from			$intnet		tagged ANY2JAILS	tag LAN2JAILS
pass	in		log		   on $jailsif0	from			$vpnet		tagged ANY2JAILS	tag VPN2JAILS
pass	in		log		   on $jailsif0				all				tagged ANY2JAILS	tag ME2JAILS
block	in		log quick  on $jailsif0				all				tagged ANY2JAILS
## LAN
### OUT
pass	out				   on $intif				all									tag ANY2LAN
pass	out				   on $intif	from			$intnet		tagged ANY2LAN		tag LAN2LAN
pass	out				   on $intif	from			$janet		tagged ANY2LAN		tag JAILS2LAN
pass	out				   on $intif	from			$vpnet		tagged ANY2LAN		tag VPN2LAN
pass	out				   on $intif				all 			tagged ANY2LAN		tag ME2LAN
block	out		log quick  on $intif				all				tagged ANY2LAN
## VPN
### OUT
pass	out				   on $vpnif				all									tag ANY2VPN
pass	out				   on $vpnif	from			$vpnet		tagged ANY2VPN		tag VPN2VPN
pass	out				   on $vpnif	from $janet	to <vpnusers>	tagged ANY2VPN		tag JAILS2VPN
pass	out				   on $vpnif	from $intnet to <vpnusers>  tagged ANY2VPN		tag LAN2VPN
pass	out				   on $vpnif		 		all				tagged ANY2VPN		tag ME2VPN
block	out		log quick  on $vpnif				all				tagged ANY2VPN 
# CETKA
## SELF
### OUT
pass	out				   on $extif				all									tag ME2ANY
pass	out				   on $intif	from <me> to $intnet		tagged ME2ANY		tag ME2LAN
pass	out				   on $jailsif0 from <me> to $janet			tagged ME2ANY		tag ME2JAILS
pass	out				   on $vpnif	from <me> to $vpnet			tagged ME2ANY		tag ME2VPN
pass	out				   on $extif 		 	  	all				tagged ME2ANY		tag ME2INET
block	out		log quick  on $extif				all				tagged ME2ANY


#ENFORCE POLICY
## LEGACY
pass	out		log quick  on $ifaces				all				tagged TRACE
pass	out		log quick  on $ifaces				all				tagged ICMP

## NAT
pass	out			quick  on $extif				all				tagged LAN2INET_NAT
pass	out			quick  on $extif				all				tagged JAILS2INET_NAT

## CETKA
pass	out			quick  on $extif				all				tagged ME2INET
pass	in 			quick  on $extif				all				tagged INET2ME
# IN
## JAILS
pass	in		log quick  on $jailsif0				all				tagged JAILS2JAILS
pass	in		log quick  on $jailsif0				all				tagged JAILS2LAN
pass	in		log quick  on $jailsif0				all				tagged JAILS2VPN
pass	in		log quick  on $jailsif0				all				tagged JAILS2ME
## VPN
pass	in			quick  on $vpnif				all				tagged VPN2VPN
pass	in			quick  on $vpnif				all				tagged VPN2JAILS
pass	in			quick  on $vpnif				all				tagged VPN2LAN
pass	in			quick  on $vpnif				all				tagged VPN2ME
## LAN
pass	in			quick  on $intif				all				tagged LAN2LAN
pass	in			quick  on $intif				all				tagged LAN2JAILS
pass	in			quick  on $intif				all				tagged LAN2VPN
pass	in			quick  on $intif				all				tagged LAN2ME

# OUT
## JAILS
pass	out		log quick  on $jailsif0				all				tagged LAN2JAILS
pass	out		log quick  on $jailsif0				all				tagged VPN2JAILS
pass	out		log quick  on $jailsif0				all				tagged JAILS2JAILS
pass	out		log quick  on $jailsif0				all				tagged ME2JAILS
## VPN
pass	out			quick  on $vpnif				all				tagged VPN2LAN
pass	out			quick  on $vpnif				all				tagged VPN2JAILS
pass	out			quick  on $vpnif				all				tagged VPN2VPN
pass	out			quick  on $vpnif				all				tagged ME2VPN
## LAN
pass	out			quick  on $intif				all				tagged JAILS2LAN
pass 	out			quick  on $intif				all				tagged VPN2LAN
pass	out			quick  on $intif				all				tagged LAN2LAN
pass	out			quick  on $intif				all				tagged ME2LAN

Re: PF policy-base routing и localhost

Добавлено: 2011-11-22 13:42:37
hishnik
Нда, я и забыл что регался тут уже %(
Это мой месседж, если Чо.

Re: PF policy-base routing и localhost

Добавлено: 2011-12-01 14:31:48
hishnik
!UP!

Re: PF policy-base routing и localhost

Добавлено: 2011-12-13 20:26:14
hishnik
Странно. Мне кажется эту тему стоит развивать. Ведь такой подход в разы эффективнее.

Re: PF policy-base routing и localhost

Добавлено: 2011-12-22 3:49:41
ss777
hishnik Я немного не до конца понял в Вашу проблему, со свою решил так:

Прописал маршрут на lo0
route add default 127.0.0.1
в /etc/pf.conf пакеты обрабатываю на выходе с lo0 при помощи правила:
pass out quick on lo0 route-to ng0 from self to !<EXCLUD> для <EXCLUD> сетей у меня шлюз иной, остальное все на ng0 (основной шлюз в интернет)
далее с помощью tcpdump на интерфейсе ng0 уже видно, что пакеты с ng0 выпускаются!! Но для локальной машины они идут без преобразования адресов, для решения этой проблемы использую такое правило:
nat on lo0 from self to !<EXCLUD> -> (ng0)
т.е. для пакетов исходящих с lo0, назначаю адрес ng0 и выпускаю через него же.

Вообщем я не знаю на сколько это все корректно, но все работает стабильно, хотя возможно есть и другие способы решения проблемы.

Re: PF policy-base routing и localhost

Добавлено: 2011-12-22 3:51:21
Rubi
hishnik Я немного не до конца понял Вашу проблему, свою решил так:

Прописал маршрут на lo0
route add default 127.0.0.1
в /etc/pf.conf пакеты обрабатываю на выходе с lo0 при помощи правила:
pass out quick on lo0 route-to ng0 from self to !<EXCLUD> для <EXCLUD> сетей у меня шлюз иной, остальное все на ng0 (основной шлюз в интернет)
далее с помощью tcpdump на интерфейсе ng0 уже видно, что пакеты с ng0 выпускаются!! Но для локальной машины они идут без преобразования адресов, для решения этой проблемы использую такое правило:
nat on lo0 from self to !<EXCLUD> -> (ng0)
т.е. для пакетов исходящих с lo0, назначаю адрес ng0 и выпускаю через него же.

Вообщем я не знаю на сколько это все корректно, но все работает стабильно, хотя возможно есть и другие способы решения проблемы.

P.S. блин удалите предыдущее сообщение, не под своим ником отправил.

Re: PF policy-base routing и localhost

Добавлено: 2011-12-23 12:59:36
hishnik
Согласен - всё дело в маршруте.
Сам с этим столкнулся, только выделенный интерфейс завёл (lo1) и на нем адрес а-ля 192.168.1.1/24 и алиасы джейлов (/32).
Дальше джейлы натятся в Инет или маршрутизируются во внутреннюю сеть. К великому сожалению версия PF во ФРЕ - старая, там нету match - правил. С ними можно было бы вообще простую политику забацать. Да ещё в версии 8.2 Фряхи я так и не вник почему он не всегда делает NAT с тегированными пакетами. Насколько я понял - это из-за того что последовательность появления пакетов на loopback интерфейсе - обратна по отношению к обычной сетевой карте (out/in против in/out), а NAT происходит именно на in очереди. Тут надо либо Опёнок ставить и пользовать современные фичи, либо вот-такими хаками делать как положенно. %(