URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 81473
[ Назад ]

Исходное сообщение
"OpenBSD 4.3, pf, NAT, VPN."

Отправлено tomishinets , 06-Авг-08 11:07 
Добрый день!
Возникла такая проблема.
Необходимо организовать тунель между клиентом Windows XP и серевером, находящимся в другой сети. Между ними стоит роутер на OpenBSD 4.3 с настроенным PF и NAT.
В правилах фаервола присутствуют строки:

nat on $ext_if from !($ext_if) to any -> ($ext_if:0)

pass in log on $int_if inet proto tcp from $local_net to $vpn_ip port pptp $tcp_state
pass in log on $int_if inet proto gre from $local_net to $vpn_ip           $udp_icmp_state

, где tcp_state="flags S/SA modulate state", udp_icmp_state="keep state" и $vpn_ip - адреса концов тунелей.

При соединении клиента происходит следующее:

pfctl -ss | grep ip_клиента
rl0 tcp $vpn_ip:1723 <- ip_клиента:59693       ESTABLISHED:ESTABLISHED
rl1 tcp ip_клиента:59693 -> $ext_ip_роутера:53210 -> $vpn_ip:1723       ESTABLISHED:ESTABLISHED
rl0 gre $vpn_ip <- ip_клиента       NO_TRAFFIC:SINGLE

При этом, в логе pf валится сообщение о разрешении прохождения трафика 1723, но нет сообщений о прохождении или не прохождении gre.

Организован по этому же принципу канал на IPsec - работает

Раньше данное решение работало на FreeBSD 6.2, 7.0 - все было ок.

После поиска в google.com наткнулся на интересную приписку по поводу NAT в фаерволе PF
http://www.pfsense.org/index.php?option=com_content&task=vie...
NAT Limitations

* PPTP and GRE Limitation - The state tracking code in pf for the GRE protocol can only track a single session per public IP per external server. This means if you use PPTP VPN connections, only one internal machine can connect simultaneously to a PPTP server on the Internet. A thousand machines can connect simultaneously to a thousand different PPTP servers, but only one simultaneously to a single server. The only available work around is to use multiple public IPs on your firewall, one per client, or to use multiple public IPs on the external PPTP server. This is not a problem with other types of VPN connections. A solution for this is currently under development.  

Но из этого следует, как я понял, что тунель способен работать, если присутствует одно соединение 1 клиент -> 1 сервер. У меня не выходит ни одного.

Заранее спасибо за все предложения и замечания!


Содержание

Сообщения в этом обсуждении
"OpenBSD 4.3, pf, NAT, VPN."
Отправлено A Clockwork Orange , 06-Авг-08 12:44 
>[оверквотинг удален]
>to a thousand different PPTP servers, but only one simultaneously to
>a single server. The only available work around is to use
>multiple public IPs on your firewall, one per client, or to
>use multiple public IPs on the external PPTP server. This is
>not a problem with other types of VPN connections. A solution
>for this is currently under development.
>
>Но из этого следует, как я понял, что тунель способен работать, если присутствует одно соединение 1 клиент -> 1 сервер. У меня не выходит ни одного.
>
>Заранее спасибо за все предложения и замечания!

все правила pf ?


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 13:13 

>все правила pf ?

# Interfaces
int_if="rl0"
ext_if="rl1"

# routers IPs
int_ip="192.168.0.2"
ext_ip="xxx.xxx.xxx.xxx"

# Other IPs
local_net="192.168.0.0/24"
tfs_ip="192.168.0.60"
ftp_ip="{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }"
o_ip="{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }"
vpn_ip="{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }"
dns_ip="{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }"

# Stateful macros
syn_state="flags S/SA synproxy state"
tcp_state="flags S/SA modulate state"
udp_icmp_state="keep state"

# Allow ports
common_ports="{ ssh, aol, ircd, rdp, 8080 }"
me_tcp_ports="{ www, https, 3128, ssh }"
me_udp_ports="{ domain, ntp }"
mail_ports="{ pop3, pop3s, smtp, smtps }"
ipsec_ports="{ 500, 4500, 10000, 20000 }"
ftp_port="8021"
dhcpd_ports="{ 67, 68 }"
wow_ports="{ 3724, 8879 }"
cod_ports="28960"

# ICMP-types macros
icmp_good="icmp-type 8 code 0"

# Stateful tracking options macros
www_track="(max 300, source-track rule, max-src-conn 100, max-src-nodes 50, max-src-states 5)"
ftp_track="(max-src-conn 5, max-src-conn-rate 3/30, overload <ftp-bruteforce> flush global)"
ssh_track="(max-src-conn 5, max-src-conn-rate 3/30, overload <ssh-bruteforce> flush global)"

# Table
table <ssh-bruteforce> persist
table <ftp-bruteforce> persist

# Misc Options
set debug urgent
set block-policy drop
set loginterface $ext_if
set state-policy if-bound
set fingerprints "/etc/pf.os"
set ruleset-optimization none

# Timeout Options
set optimization normal
set timeout { frag 30, tcp.established 28800 }
set timeout { tcp.first 120, tcp.closing 120, tcp.closed 120, tcp.finwait 120 }
set timeout { udp.first 120, udp.single 120, udp.multiple 120 }
set timeout { adaptive.start 6000, adaptive.end 12000 }

################ Skip ######################################
set skip on lo

################ Normalization #############################
scrub in log on $ext_if all random-id  fragment reassemble
scrub    log on $ext_if all reassemble tcp

################ Translation ###############################
no rdr on lo0 from any to any

nat on $ext_if from !($ext_if) to any -> ($ext_if:0)

# Ftp ( secure ftp-proxy for the internal LAN )
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if inet proto tcp from $int_if:network to !$int_ip port ftp -> lo0 port $ftp_port

########### TFS redirect ##############
rdr on $ext_if inet proto tcp from any     to $ext_ip port 83   -> $tfs_ip port 83
rdr on $ext_if inet proto tcp from $o_ip   to $ext_ip port rdp  -> $tfs_ip port rdp
rdr on $ext_if inet proto tcp from any     to $ext_ip port 8080 -> $tfs_ip port 8080
rdr on $ext_if inet proto tcp from $o_ip   to $ext_ip port 1433 -> $tfs_ip port 1433

################ Filtering #################################
# Deny bruteforce Atacks
block drop in quick on $ext_if from <ssh-bruteforce>
block drop in quick on $ext_if from <ftp-bruteforce>

# Deny spoofed packets
antispoof log quick for { lo0 $int_if }

# Drop to/from illegal sources/destinations
block        quick inet6
block in log quick            from no-route to any
block in     quick on $ext_if from any      to 255.255.255.255

# BLOCK all in/out on all interfaces and log by default
block        log on $ext_if
block return log on $int_if

#Block NMAP
block quick from any os NMAP

# Ftp ( secure ftp-proxy )
anchor "ftp-proxy/*"

# Icmp from any to any
pass log inet proto icmp from any to any $icmp_good

# In from $local_net to me
pass in  log on $int_if inet proto udp from 0.0.0.0         port bootpc to 255.255.255.255 port bootps            $udp_icmp_state tag Local_DHCPD
pass out log on $int_if inet proto udp from 255.255.255.255 port bootps to 0.0.0.0         port bootpc            $udp_icmp_state tag Local_DHCPD
pass in  log on $int_if inet proto udp from $local_net      port bootpc to $int_ip         port bootps            $udp_icmp_state tag Local_DHCPD
pass in  log on $int_if inet proto tcp from $local_net                  to lo0             port $ftp_port         $tcp_state      tag Local_FTP-PROXY
pass in  log on $int_if inet proto tcp from $local_net                  to $int_ip         port $me_tcp_ports     $tcp_state
pass in  log on $int_if inet proto udp from $local_net                  to $int_ip         port $me_udp_ports     $udp_icmp_state
pass in  log on $int_if inet proto tcp from $local_net                  to $int_ip         port { ftp, ftp-data } $tcp_state      tag Local_active_FTPD
pass in  log on $int_if inet proto tcp from $local_net                  to $int_ip         port 65500:65535       $tcp_state      tag Local_passive_FTPD

# In from any to me
pass in quick log on $ext_if inet proto tcp from any to $ext_ip port ssh               $tcp_state $ssh_track tag INTERNET_SSHD
pass in quick log on $ext_if inet proto tcp from any to $ext_ip port { ftp, ftp-data } $tcp_state $ftp_track tag INTERNET_ACTIVE_FTPD
pass in quick log on $ext_if inet proto tcp from any to $ext_ip port 65500:65535       $tcp_state            tag INTERNET_PASSIVE_FTPD

# In from any to $local_net
pass log inet proto tcp from any     to $tfs_ip port 83   $tcp_state
pass log inet proto tcp from any     to $tfs_ip port 8080 $tcp_state
pass log inet proto tcp from $o_ip   to $tfs_ip port rdp  $tcp_state
pass log inet proto tcp from $o_ip   to $tfs_ip port 1433 $tcp_state

# In from $local_net to any
pass in log on $int_if inet proto tcp          from $local_net to any     port $common_ports $tcp_state
pass in log on $int_if inet proto tcp          from $local_net to any     port $mail_ports   $tcp_state
pass in log on $int_if inet proto tcp          from $tfs_ip    to $o_ip   port { www, 8080 } $tcp_state
pass in log on $int_if inet proto { tcp, udp } from $local_net to $o_ip   port $ipsec_ports  $udp_icmp_state
pass in log on $int_if inet proto tcp          from $local_net to any     port $wow_ports    $tcp_state
pass in log on $int_if inet proto tcp          from $local_net to $vpn_ip port pptp          $tcp_state
pass in log on $int_if inet proto gre          from $local_net to $vpn_ip                    $udp_icmp_state

# Out from $local_net, me to any
pass  out log on $ext_if inet proto tcp              to any                  $tcp_state
pass  out log on $ext_if inet proto udp              to any                  $udp_icmp_state
pass  out log on $int_if inet proto udp from $int_ip to $local_net port snmp $udp_icmp_state
block out log on $ext_if inet proto { tcp udp } to any port $dhcpd_ports


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 13:18 
Пока отсылал листинг правил, обнаружил, что не хватает правила для прохода gre с внешнего интерфейса ))). Добавил правило вида
pass  out log on $ext_if inet proto gre to $vpn_ip $udp_icmp_state

В итоге сообщения изменились.
rl0 gre $vpn_ip <- ip_клиента       MULTIPLE:MULTIPLE
rl1 gre ip_клиента -> $ext_ip_роутера -> $vpn_ip       MULTIPLE:MULTIPLE

Но соединения не происходит.


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено A Clockwork Orange , 06-Авг-08 13:23 
>[оверквотинг удален]
>any          
>       $tcp_state
>pass  out log on $ext_if inet proto udp    
>          to
>any          
>       $udp_icmp_state
>pass  out log on $int_if inet proto udp from $int_ip to
>$local_net port snmp $udp_icmp_state
>block out log on $ext_if inet proto { tcp udp } to
>any port $dhcpd_ports

gre через внешний интерфейс?


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено A Clockwork Orange , 06-Авг-08 13:24 
tcpdump -i pflog0 -ttt

Посмотреть какие правила блокируют?


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 13:28 
>tcpdump -i pflog0 -ttt
>
>Посмотреть какие правила блокируют?

....
Aug 06 13:26:05.668475 client.46957 > $vpn_ip.pptp: [|tcp] (DF)
...
Aug 06 13:26:06.757489 call 4736 seq 1 gre-ppp-payload (gre encap)
Aug 06 13:26:06.757579 call 4736 seq 1 gre-ppp-payload (gre encap)
...


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено A Clockwork Orange , 06-Авг-08 13:48 
tcpdump -n -e -ttt -i pflog0

"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 13:57 
>tcpdump -n -e -ttt -i pflog0

Aug 06 13:50:55.900210 rule 129/(match) pass in on rl0: client_ip.2532 > $vpn_ip.1723: [|tcp] (DF)
Aug 06 13:50:55.900393 rule 132/(match) pass out on rl1: $ext_ip_router.56618 > $vpn_ip.1723: [|tcp] (DF)


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено A Clockwork Orange , 06-Авг-08 14:03 
а где ответ от vpn сервер?

"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 14:07 
>а где ответ от vpn сервер?

Хм...видать отключили (ping не идет)...
Как только, что-то измениться - я сообщу.



"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 14:19 
>>а где ответ от vpn сервер?
>
>Хм...видать отключили (ping не идет)...
>Как только, что-то измениться - я сообщу.

Спасибо за то, что откликнулись на мою проблему! Все получилось!

В настройках коннекта Windows XP, поставил другой ip дозвона (который доступен) и соединение пошло! Правда как и предполагалось только для одного клиента.

Вопрос в догонку, как можно не поднимая демона VPN на роутере (по той же схеме), организовать несколько соединений клиентов с одним VPN сервером?
Насколько я понял, ipf/ipnat больше не поддерживается в OpenBSD начиная с версии >3,5...
Есть ли какие-нибудь предложения?

Заранее спасибо!


"OpenBSD 4.3, pf, NAT, VPN."
Отправлено tomishinets , 06-Авг-08 14:33 
>а где ответ от vpn сервер?

Спасибо за то, что откликнулись на мою проблему! Все получилось!

В настройках коннекта Windows XP, поставил другой ip дозвона (который доступен) и соединение пошло! Правда как и предполагалось только для одного клиента.

Вопрос в догонку, как можно не поднимая демона VPN на роутере (по той же схеме), организовать несколько соединений клиентов с одним VPN сервером?
Насколько я понял, ipf/ipnat больше не поддерживается в OpenBSD начиная с версии >3,5...
Есть ли какие-нибудь предложения?

Заранее спасибо!