The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 12:44 , 06-Авг-08 (1)
    >[оверквотинг удален]
    >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, 13:13 , 06-Авг-08 (2)

      >все правила 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, 13:18 , 06-Авг-08 (3)
        Пока отсылал листинг правил, обнаружил, что не хватает правила для прохода 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, 13:23 , 06-Авг-08 (4)
        >[оверквотинг удален]
        >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, 13:24 , 06-Авг-08 (5)
          tcpdump -i pflog0 -ttt

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

          • OpenBSD 4.3, pf, NAT, VPN., !*! tomishinets, 13:28 , 06-Авг-08 (6)
            >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, 13:48 , 06-Авг-08 (7)
              • OpenBSD 4.3, pf, NAT, VPN., !*! tomishinets, 13:57 , 06-Авг-08 (8)
                >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, 14:03 , 06-Авг-08 (9)
                  а где ответ от vpn сервер?
                  • OpenBSD 4.3, pf, NAT, VPN., !*! tomishinets, 14:07 , 06-Авг-08 (10)
                    >а где ответ от vpn сервер?

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


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

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

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

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

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

                  • OpenBSD 4.3, pf, NAT, VPN., !*! tomishinets, 14:33 , 06-Авг-08 (12)
                    >а где ответ от vpn сервер?

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

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру