Hi, All!Есть сети:
сеть A: 192.168.1.0/24(внутренние адреса, 192.168.1.1 - шлюз) 1.2.3.4(внешний адрес)
сеть B: 192.168.2.0/24(внутренние адреса, 192.168.2.1 - шлюз) 2.3.4.5(внешний адрес)
Задача: пользователи сети A могли пользоваться ресурсами сети B
На 2.3.4.5(сеть B) поднят VPN-сервер(mpd)
VPN-клиенту назначается IP: 192.168.2.100
из виндовых машин сети A(192.168.1.0/24) устанавливается VPN-соединение и ресурсы сети B доступны.
теперь необходимо поднять VPN-соединение на шлюзе сети A(192.168.1.1)
т.е. пользователь, ничего у себя не настраивая, использовал ресурсы сети B и ресурсы инета
pptpclient:
ppp.conf
--------
vpn:
set authname MyLogin
set authkey MyPass
set timeout 120
set ifaddr 0 0
add 192.168.2.0/24 HISADDR
alias enable yes
--------
устанавливаем VPN-соединение
# pptp 2.3.4.5 vpn&
Все работает как надо сеть B доступна из сети A и инет наместе :)
mpd:
mpd.conf
--------
default:
load vpn
vpn:
new -i ng8 vpn vpn
set iface route 192.168.2.0/24
set bundle authname "MyLogin"
set bundle password "MyPass"
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set pptp peer 2.3.4.5
set pptp enable originate incoming outcall
open
--------
mpd.links
--------
vpn:
set link type pptp
--------
Здесь ситуация складывается иначе
VPN-соединение устанавливается, но ресурсы сети B доступны только с шлюза(192.168.1.1),
но из локальной сети А сеть B недоступна
Начинаю копать.
Ищю отличия между соединениями pptpclient и mpd
# netstat -nr
(pptpclient)
..............
192.168.2 192.168.2.1 UGSc 0 0 tun0
192.168.2.1 192.168.2.100 UH 1 0 tun0
..............
(mpd)
..............
192.168.2 192.168.2.1 UGSc 0 0 ng0
192.168.2.1 192.168.2.100 UH 1 0 ng0
192.168.2.100 lo0 UHS 0 0 lo0
..............
# ifconfig
(pptpclient)
..............
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.100 --> 192.168.2.1 netmask 0xffffffff
Opened by PID 44655
..............
(mpd)
..............
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.2.100 --> 192.168.2.1 netmask 0xffffffff
..............
Трассировка с клиентских машин сети A:
c:\>tracert -d 192.168.2.1
Трассировка маршрута к 192.168.2.1 с максимальным числом прыжков 30
(pptpclient)
1 <1 мс <1 мс <1 мс 192.168.1.1
2 43 ms 43 ms 45 ms 192.168.2.1
(mpd)
1 <1 мс <1 мс <1 мс 192.168.1.1
2 * * * Превышен интервал ожидания для запроса.
3 * * * Превышен интервал ожидания для запроса.
..............
c:\>tracert -d ya.ru
Трассировка маршрута к ya.ru [213.180.204.8] с максимальным числом прыжков 30:
1 <1 мс <1 мс <1 мс 192.168.1.1
2 3 ms 3 ms 3 ms 1.2.3.x (IP провайдера)
..............
X 4 ms 3 ms 4 ms 213.180.204.8
Трассировка завершена.
Одинакова для pptpclient и mpd
Разница вывода 'netstat -nr'
кроме интерфейсов tun0 и ng0 в mpd добавилась строка
192.168.2.100 lo0 UHS 0 0 lo0
Что, собственно, логично
Разница вывода 'ifconfig'
В mpd добавились 2 интересных параметра NOARP, SIMPLEX
Может в них подвох?
Копаем глубже.
С клиенских машин сети A пингуем сеть B
c:\>ping -t 192.168.20.1
На машине с VPN-сервером запускаем
# tcpdump -pni ng0 -p icmp
И что явижу!
при запущеном VPN-клиенте pptpclient
10:57:07.095553 192.168.2.100 > 192.168.2.1: icmp: echo request
10:57:07.095883 192.168.2.1 > 192.168.2.100: icmp: echo reply
10:57:08.096375 192.168.2.100 > 192.168.2.1: icmp: echo request
10:57:08.096703 192.168.2.1 > 192.168.2.100: icmp: echo reply
10:57:13.593846 192.168.2.100 > 192.168.2.1: icmp: echo request
10:57:13.594175 192.168.2.1 > 192.168.2.100: icmp: echo reply
при запущеном VPN-клиенте mpd
10:56:09.084633 192.168.1.101 > 192.168.2.1: icmp: echo request
10:56:14.585967 192.168.1.101 > 192.168.2.1: icmp: echo request
10:56:20.086753 192.168.1.101 > 192.168.2.1: icmp: echo request
Нет ответа от VPN-сервера - его и не будет,
ведь запрос идет с адресом клиентской машины(192.168.1.101) а не VPN-клиента(192.168.2.100)
Если на машине VPN-сервера прописать маршрут к сети A
# route add -net 192.168.1.0/24 192.168.20.100
то все начинает работать,
даже более того, теперь не только сеть B доступна из сети A,
но и сеть A доступна из сети B, что не входило в мою задачю ;)
Вывод:
pptpclient маскарадит внутренние адреса
mpd - нет.
Буду маскарадить "в ручную"
добавляю в mpd.conf VPN-клиента две строки
.....................
set iface up-script /usr/local/etc/mpd/if-up.sh
set iface down-script /usr/local/etc/mpd/if-down.sh
.....................
if-up.sh
---------
#!/bin/sh
/sbin/natd -u -p 8669 -n $1
/sbin/ipfw add 00051 divert 8669 ip from any to any via $1
---------
if-down.sh
---------
#!/bin/sh
/bin/kill -9 `ps ax |awk '$5~/natd/ && $0~/-p 8669/ {print $1}'`
/sbin/ipfw delete 00051
---------
т.е. при конекте поднимаю natd на порту 8669 и интерфейсе ng0($1)
и, соответственно добавляю строку в firewall
При дисконекте - обратная процедура
И достигается нужный результат - запросы идут не с адреса клиентской машины(192.168.1.101), а с VPN-клиента(192.168.2.100)
Но выглядет это, как-то крючковато.
Есть ли стандартный параметр 'mpd.conf', который все это делает?
Что означают параметры NOARP, SIMPLEX в выводе 'ifconfig'?
Как pptpclient маскарадит внутренние адреса(для общего развития)?
Буду благодарен за любые советы и высказывания.