Есть две физически разнесенные сети:
1. 192.168.11.0/24
2. 192.168.0.0/24
В первой сети есть два канала выхода в интернет и подключение второй сети через pptp.
В первой сети всей маршрутизацией управляет сервер на базе freebsd, pf, mpd5. Во второй сети стоит Zyxel Keenetic Giga II. На нем настроен интернет pppoe и настроен pptp туннель к первой сети и прописана статическая маршрутизация:
192.168.11.0 / 255.255.255.0 192.168.11.6 PPTP0 yes
192.168.11.6 это статический адрес который выдается подключению с zyxel.
Во freebsd следующие настройки:
Настройки mpd:
# cat mpd.conf
startup:
set user komal * admin
set console self 127.0.0.1 5005
set console open
set web self 0.0.0.0 5006
set web open
log +alldefault:
load pptp_server
pptp_server:
set ippool add pool1 192.168.11.32 192.168.11.99
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp ranges 192.168.11.5/32 ippool pool1
set ipcp dns 192.168.11.254
set bundle enable compression
set ccp yes mppc
set mppc yes e40
set mppc yes e128
set mppc yes stateless
create link template L pptp
set link action bundle B
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap eap
set link enable chap
set link keep-alive 10 60
set link mtu 1460
set pptp self 85.x.x.x,192.168.11.254
set link enable incoming
# cat mpd.secret
rb "password" 192.168.11.6
Настройки pf приведу все, то что касается этого подключения прокоментирую:
# cat /etc/pf.rules
strnz_if="re1"
ttk_if="re2"
int_if="re0"
#Это как раз тот интерфейс, который создается при подключении второй сети с адресом 192.168.11.6
rb_if='ng2'gw_strnz="85.x.x.229"
strnz_ip="85.x.x.230"
gw_ttk="192.168.22.1"
ttk_ip="192.168.22.2"
#ip адрес подключения из второй сети
gw_rb='192.168.11.6'
int_net="192.168.11.0/24"
ttk_net="192.168.22.0/24"
#подсеть второй сети
rb_net="192.168.0.0/24"
to_strnz="{ 192.168.11.2, 192.168.11.3, 192.168.11.4 }"
services_ext="{ 22 25 53 80 }"
icmp_types="{ echoreq, unreach}"
set block-policy return
set skip on lo0
scrub in all
nat on $strnz_if from $int_net to any -> ($strnz_if)
nat on $ttk_if from $int_net to any -> ($ttk_if)
rdr on $ttk_if inet proto tcp from any to any port 25 -> 192.168.11.17 port 25
#перенаправление трафика адресованного в подсеть второй сети в интерфейс, который знает где эта сеть.
rdr on $int_if inet proto tcp from any to $rb_net -> ($rb_if)
block all
pass in on $ttk_if inet proto { tcp,udp } from any to any port $services_ext flags S/SA keep state
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port ssh keep state
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port ssh keep state
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 1723
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port 1723
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 25
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 110
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port 110
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 143
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port 143
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 21
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port 21
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 80
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port 80
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto tcp from any to $strnz_if port 53
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto tcp from any to $ttk_if port 53
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto udp from any to $strnz_if port 53
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto udp from any to $ttk_if port 53
pass in on $strnz_if reply-to ($strnz_if $gw_strnz) proto icmp from any to $strnz_if icmp-type $icmp_types
pass in on $ttk_if reply-to ($ttk_if $gw_ttk) proto icmp from any to $ttk_if icmp-type $icmp_types
pass quick on $int_if from any to any
pass quick from $int_net to $int_net
#разрешаем все на интерфейсе из второй сети
pass on $rb_if from any to any
#перенаправляем трафик пришедший на интерфейс первой локальной сети и адресованный во вторую сеть в интерфейс из второй сети.
pass in quick on $int_if route-to ($rb_if $gw_rb) from $int_net to $rb_net keep state
pass in quick on $int_if route-to ($ttk_if $gw_ttk) from $int_net to $ttk_net keep state
pass in quick on $int_if route-to ($strnz_if $gw_strnz) from $to_strnz to any keep state
pass in quick on $int_if route-to ($ttk_if $gw_ttk) from $int_net to any keep state
#перенаправляем весь исходящий трафик от vpn интерфейса из второй сети в этот канал.
pass out quick route-to ($rb_if $gw_rb) from $rb_if to any keep state
pass out quick route-to ($strnz_if $gw_strnz) from $strnz_if to any keep state
pass out quick route-to ($ttk_if $gw_ttk) from $ttk_if to any keep state
Добавлен статический маршрут из первой сети во вторую:
route add -net 192.168.0.0/24 192.168.11.6
netstat -nr
Routing tablesInternet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.22.1 UGS 0 7127390 re2
85.234.126.228/30 link#4 U 0 2501 re1
85.234.126.230 link#4 UHS 0 542 lo0
127.0.0.1 link#9 UH 0 449160 lo0
192.168.0.0/24 192.168.11.6 UGS 0 2 ng2
192.168.11.0/24 link#3 U 0 592239 re0
192.168.11.5 link#10 UHS 2 0 lo0
192.168.11.6 link#12 UH 0 96469 ng2
192.168.11.7 link#10 UH 0 814 ng0
192.168.11.9 link#11 UH 0 22360 ng1
192.168.11.254 link#3 UHS 0 556156 lo0
192.168.22.0/24 link#5 U 0 2700 re2
192.168.22.2 link#5 UHS 0 1226 lo0
И все вроде бы работает, но пропадают пакеты. Собственно делается это в основном из-за того, что один из серверов для второй сети расположен в первой.
Теряется довольно много пакетов. Ну примерно процентов 25-30.
И в первой сети и во второй есть виндовый сервер win2003. Так вот если я на сервере из второй сети настраиваю входящие подключения, на зикселе пробрасываю tcp порт 1723, а на сервере из первой сети настраиваю vpn подключение к серверу из второй сети. По сути тот же впн туннель, то пинги не теряются. Канал стабилен.
и есть еще одно странное обстоятельство. Когда я пингую с сервера freebsd(на котором настроена вся эта маршрутизация и на котором присутствует этот впн интерфейс от зикселя) из первой сети любой комп из второй сети, то пакеты тоже не теряются.
Как только пинг из второй сети или или из первой сети с любого другого компа то пинги начинают теряться.
Я отсюда сделал вывод (не знаю правильный или нет) что пакеты теряются где то в процессе маршрутизации между интерфейсами на сервере freebsd, а не в канале.
Подскажите куда капать. Очень нужно настроить это все.
Да кстати, самое важное. Пинги начинают пропадать, когда увеличиваешь размер пакета. Обычные пакеты в 32 бита не пропадают. А в том канале, между двумя серверами не пропадают никакие пакеты.