GRE тунель между 2 машинами

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
murder
Сообщения: 219
ОС: FreeBSD 8.0, Ubuntu 9.10

GRE тунель между 2 машинами

Сообщение murder »

Задача стоит такая: есть два офиса, нужно их соединить между собой, в частности, чтобы юзеры 1 офиса имели терминальный доступ к серверу другого офиса. Возникло 2 проблемы.
Как решение, решил быстро поднять gre тунель между ними.
Сервер_1 (в 1 офисе), на слаке, подключен к инету через pppoe, выдается реальник X.X.X.X, а в локалку смотрит как 192.168.3.1/29
Сервер_2 (во 2 офисе), тоже на слаке, подключен к инету напрямую (на интерфейсе висит реальник Y.Y.Y.Y), в локалку смотрит как 192.168.0.1/28, но он стоит за сервером openbsd, т.е. на obsd висит реальник и за этот реальник проручена другая реальная сетка, в которой стоит Сервер_2
На сервере_1 gre поднимается вот так:

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

#!/bin/sh
#
# Start tunnel
#

tnl_name=tnl_office
remote_ip=Y.Y.Y.Y
local_ip=X.X.X.X
ip=192.168.3.1
remote_range=192.168.0.0/28

tunnel_start() {
    insmod ip_gre
    ip tunnel add $tnl_name mode gre remote $remote_ip local $local_ip ttl 255
    ip addr add $ip dev $tnl_name
    ip link set $tnl_name up
    ip route add $remote_range dev $tnl_name
}

tunnel_stop() {
    ip tunnel del $tnl_name
    rmmod ip_gre
}

case "$1" in
    'start')
        tunnel_start
       ;;
    'stop')
        tunnel_stop
       ;;
    *)
        echo "usage $0 start|stop"
esac

На сервере_2 тунель поднимается аналогично:

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

#!/bin/sh
#
# Start tunnel
#

tnl_name=tnl_client
remote_ip=X.X.X.X
local_ip=Y.Y.Y.Y
ip=192.168.0.1
remote_range=192.168.3.0/29

tunnel_start() {
    insmod ip_gre
    ip tunnel add $tnl_name mode gre remote $remote_ip local $local_ip ttl 255
    ip addr add $ip dev $tnl_name
    ip link set $tnl_name up
    ip route add $remote_range dev $tnl_name
}

tunnel_stop() {
    ip tunnel del $tnl_name
    rmmod ip_gre
}

case "$1" in
    'start')
        tunnel_start
       ;;
    'stop')
        tunnel_stop
       ;;
    *)
        echo "usage $0 start|stop"
esac

Поднимается все отлично, и тут возникает 1 проблема:
Через некоторое время, с сервера_1 не работает тунель (не пингуются удаленные машины и т.д.), как только с сервера_2 я даю пинг или любое другое обращение к тунелю - то все начинает нормально работать в оба конца. Иногда, такое происходит сразу после поднятия тунеля. В чем проблема - не пойму. Фаерволы отключал - не помогает, пробовал играться с mtu - успехов не принесло. Пока проблему решаю тем, что в crontab висит на выполнение кажд 10 мин пинг в сторону сервера_1. В чем может быть трабл?
Проблема 2 - это openbsd =)
Ну тут вся проблема в pf я так думаю, т.е. при поднятии pf, работает только пинг, остальное ничего
[root@mail /root]# uname -srm
OpenBSD 4.0 i386
[root@mail /root]# cat /etc/pf.conf
# $OpenBSD: pf.conf,v 1.31 2006/01/30 12:20:31 camield Exp $
#

#
# Interface
ext_if = "nfe0"
ext_ip = "Z.Z.Z.Z/32"

int_if = "rl0"
int_ip = "Y.Y.Y.G/32"

ns_ip = "Y.Y.Y.Y/32"

#
# My services for all
tcp_svc = "smtp domain pop3 pop3s"
udp_svc = "domain"

# NS services for all
tcp_ns = "domain pptp ftp 2000><2100"
udp_ns = "domain"

#
# Services not for all
table <allow_ssh> const {192.168.0.0/16}

#
# Spam daemon
table <spamd> persist
table <spamd-white> persist
table <spamd-whitelist> persist file "/etc/postfix/filters/whitelist.txt"
table <spamd-whitegroup> { }

scrub in

#no rdr inet proto tcp from <spamd-whitelist> to port smtp
#no rdr inet proto tcp from <spamd-whitegroup> to port smtp

#rdr pass on $ext_if proto tcp from <spamd> to port smtp -> 127.0.0.1 port spamd
#rdr pass on $ext_if proto tcp from !<spamd-white> to port smtp -> 127.0.0.1 port spamd

pass quick on { lo }
antispoof quick for { lo $ext_if }

block on $ext_if
block return-rst in on $ext_if proto tcp

#
# Outgoing policy for all
pass out on $ext_if inet proto icmp icmp-type echoreq code 0 keep state
pass out on $ext_if proto udp keep state
pass out on $ext_if proto tcp flags S/SA keep state

#
# Incoming policy not for all
pass in proto tcp from <allow_ssh> to any port ssh keep state

#
# Incoming policy for all to me
pass in on $ext_if inet proto icmp icmp-type echoreq code 0 keep state
pass in on $ext_if proto udp from any to self port { $udp_svc } keep state
pass in on $ext_if proto tcp from any to self port { $tcp_svc } flags S/SA keep state

#
# Incoming policy for all to NS
pass in on $ext_if proto udp from any to $ns_ip port { $udp_ns } keep state
pass in on $ext_if proto tcp from any to $ns_ip port { $tcp_ns } flags S/SA keep state

#
# GRE between Сlient and Office
pass proto gre from any to any


За pf - сильно не ругайте, с obsd знаком небольше месяца, только учусь.
-//- Реальная смерть приходит с косой, а виртуальная с пассатижами -//-
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: GRE тунель между 2 машинами

Сообщение sash-kan »

(murder @ Dec 6 2006, в 09:28) писал(а):в локалку смотрит как 192.168.3.1/29
т.е. сеть 192.168.3.3.1/29 уже присутствует на одном из интерфейсов? тогда эта запись совершенно не верна:
(murder @ Dec 6 2006, в 09:28) писал(а):ip=192.168.3.1
т.к. туннель — это полноценный интерфейс. и на нем должна быть прописана уникальная для ядра сеть.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
stannum
Сообщения: 322
Статус: Свободолюбитель
ОС: Debian GNU/Linux unstable

Re: GRE тунель между 2 машинами

Сообщение stannum »

2 sash-kann: я бы не стал говорить прямо "не верна", обычно так не делают, а вот с GRE-туннелями я такое уже второй раз встречаю. Дело в том, данная запись позволяет к линух роутеру обращаться по одному и тому же адресу с обоих концов туннеля, что очень удобно.
Спасибо сказали:
Аватара пользователя
murder
Сообщения: 219
ОС: FreeBSD 8.0, Ubuntu 9.10

Re: GRE тунель между 2 машинами

Сообщение murder »

sash-kan писал(а):
06.12.2006 12:06
(murder @ Dec 6 2006, в 09:28) писал(а):в локалку смотрит как 192.168.3.1/29
т.е. сеть 192.168.3.3.1/29 уже присутствует на одном из интерфейсов? тогда эта запись совершенно не верна:
(murder @ Dec 6 2006, в 09:28) писал(а):ip=192.168.3.1
т.к. туннель — это полноценный интерфейс. и на нем должна быть прописана уникальная для ядра сеть.

хм, а на 2 машине как
-//- Реальная смерть приходит с косой, а виртуальная с пассатижами -//-
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: GRE тунель между 2 машинами

Сообщение sash-kan »

stannum
не буду спорить. у меня таким образом, к сожалению, туннели вообще не работали. ядро не знало куда отправлять трафик. возможно имеет место разница линуск-бсд.
(murder @ Dec 6 2006, в 13:03) писал(а):хм, а на 2 машине как
та же история.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
stannum
Сообщения: 322
Статус: Свободолюбитель
ОС: Debian GNU/Linux unstable

Re: GRE тунель между 2 машинами

Сообщение stannum »

Вот ради интереса надыбал ip a и ip r компутера с центрального офиса, где он работает как шлюз между остальными офисами и как шлюз-ip-телефонии: ОСь Fedora 4:

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

# ip a
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:13:d4:61:c1:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::213:d4ff:fe61:c125/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:e0:4d:02:e8:de brd ff:ff:ff:ff:ff:ff
    inet6 fe80::2e0:4dff:fe02:e8de/64 scope link
       valid_lft forever preferred_lft forever
4: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP> mtu 1492 qdisc pfifo_fast qlen 3
    link/ppp
    inet white-ip peer white-ip/32 scope global ppp0
6: gre0: <NOARP> mtu 1476 qdisc noop
    link/gre 0.0.0.0 brd 0.0.0.0
7: gre@NONE: <POINTOPOINT,NOARP,UP> mtu 1468 qdisc noqueue
    link/gre white-ip peer white-ip
    inet 192.168.0.100/32 scope global gre
8: gre2@NONE: <POINTOPOINT,NOARP,UP> mtu 1468 qdisc noqueue
    link/gre white-ip peer white-ip
    inet 192.168.0.100/32 scope global gre2
9: gre3@NONE: <POINTOPOINT,NOARP,UP> mtu 1468 qdisc noqueue
    link/gre  white-ip peer white-ip
    inet 192.168.0.100/32 scope global gre3

# ip r
 white-ip dev ppp0  proto kernel  scope link  src white-ip
192.168.3.0/24 dev gre3  scope link
192.168.2.0/24 dev gre  scope link
192.168.1.0/24 dev gre2  scope link
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.100
169.254.0.0/16 dev eth0  scope link
default via white-ip dev ppp0


Как видно аж у целых 4-х интерфейсов один и тот же IP 192.168.0.100 и никаких проблем это не вызывает. проверено сроком в 2-3 года - эт точна.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: GRE тунель между 2 машинами

Сообщение sash-kan »

stannum
понятно. просто я всегда туннели создавал обычным образом:
ip tun a <имя туннеля> mode gre remore <удаленный ip вне туннеля> local <локальный ip вне туннеля>
ip a a <локальный ip в туннеле> peer <удаленный ip в туннеле> dev <имя туннеля>

разницу я выделил.
а дальше уже средствами маршрутизации в туннель запихивается все, что нужно.

stannum
кстати, насколько я понимаю, этот самый адрес 192.168.0.100/32, закрепленный за туннелями, вообще излишен и роли (в данном случае) не играет.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
stannum
Сообщения: 322
Статус: Свободолюбитель
ОС: Debian GNU/Linux unstable

Re: GRE тунель между 2 машинами

Сообщение stannum »

Нет на самом деле не излишен, этот IP использется именно как локальный адрес туннельного устройства, добавляется так:

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

ip a a 192.168.0.100 dev greX

Без IP-адреса на итерфейсе невозможно добавить маршрут в таблицу для данного интерфейса, следовательно и пакеты не смогут ходить, а по идее там может быть абсолютно любой адрес, насколько я знаю, главное - должен быть.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: GRE тунель между 2 машинами

Сообщение sash-kan »

(stannum @ Dec 6 2006, в 16:58) писал(а):по идее там может быть абсолютно любой адрес
вот вот.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
murder
Сообщения: 219
ОС: FreeBSD 8.0, Ubuntu 9.10

Re: GRE тунель между 2 машинами

Сообщение murder »

На счет того, что адрес может быть и локальным - это проверено, что работает
Помница когда я поднимал тунель с Linux to cisco, то по ifconfig было что-то типа того

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

tnl0  Link encap:UNSPEC  HWaddr C3-A2-38-82-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.10.0.2  P-t-P:10.1.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP  MTU:1400  Metric:1
          RX packets:93954 errors:0 dropped:0 overruns:0 frame:0
          TX packets:112569 errors:25 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:0
          RX bytes:6584643 (6.2 Mb)  TX bytes:21160284 (20.1 Mb)

При этом на eth1 висел 10.10.0.2
И все бегало нормально
Здесь же настораживает вот что:

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

tnl0  Link encap:UNSPEC  HWaddr C3-A2-38-82-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.0.125  P-t-P:192.168.0.125  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP  MTU:1476  Metric:1
          RX packets:93954 errors:0 dropped:0 overruns:0 frame:0
          TX packets:112569 errors:25 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:0
          RX bytes:6584643 (6.2 Mb)  TX bytes:21160284 (20.1 Mb)

Адреса висят одинаковые.
-//- Реальная смерть приходит с косой, а виртуальная с пассатижами -//-
Спасибо сказали:
Аватара пользователя
stannum
Сообщения: 322
Статус: Свободолюбитель
ОС: Debian GNU/Linux unstable

Re: GRE тунель между 2 машинами

Сообщение stannum »

Адреса висят одинаковые.
- вот это действительно настораживает, и так все работает???
Спасибо сказали:
Аватара пользователя
murder
Сообщения: 219
ОС: FreeBSD 8.0, Ubuntu 9.10

Re: GRE тунель между 2 машинами

Сообщение murder »

Ну работает, только иногда отваливается, пока пинг не дашь с одной стороны - не появиться, я это описал
это и является проблемой 1-ой
-//- Реальная смерть приходит с косой, а виртуальная с пассатижами -//-
Спасибо сказали:
Аватара пользователя
stannum
Сообщения: 322
Статус: Свободолюбитель
ОС: Debian GNU/Linux unstable

Re: GRE тунель между 2 машинами

Сообщение stannum »

stannum писал(а):
07.12.2006 09:39
Адреса висят одинаковые.
- вот это действительно настораживает, и так все работает???


Я посмотрел так, и пришел к выводу, что это ifconfig как-то странно инфу подает.
У тех самых офисов тоже по ifconfig одинаковые адреса на

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

inet addr:192.168.3.1 P-t-P:192.168.3.1
, но это не про то похоже - не в этом соль. Тут похоже дело все в openbsd'e - такое ощущение, что что-то неверно с arp-таблицами - похоже они при нормальном коннекте у вас очищаются и восстанавливаются при пинге? Короче не знаю.
Спасибо сказали:
Аватара пользователя
murder
Сообщения: 219
ОС: FreeBSD 8.0, Ubuntu 9.10

Re: GRE тунель между 2 машинами

Сообщение murder »

pf отключен, но кстати обратил внимание на arp, перерыл логи obsd и время отвремени проскакивает вот такое

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

Dec  8 09:27:22 mail /bsd: arp info overwritten for Y.Y.Y.Y by 00:15:e9:41:97:3f on rl0
Dec  8 09:27:35 mail /bsd: arp info overwritten for Y.Y.Y.Y by 00:60:97:af:ca:a3 on rl0

Но вот в чем странность мак 00:15:e9:41:97:3f - это 192.168.0.1 !
-//- Реальная смерть приходит с косой, а виртуальная с пассатижами -//-
Спасибо сказали:
Аватара пользователя
murder
Сообщения: 219
ОС: FreeBSD 8.0, Ubuntu 9.10

Re: GRE тунель между 2 машинами

Сообщение murder »

1 проблема была именно в этом:
stannum писал(а):
07.12.2006 16:07
Тут похоже дело все в openbsd'e - такое ощущение, что что-то неверно с arp-таблицами - похоже они при нормальном коннекте у вас очищаются и восстанавливаются при пинге?

Оказалось, что один умник воткнул линк с офисной сеткой в реальную сетку, и obsd видел то 1 мак, то 2 мак, при пинге arp таблице очищались, ставился правильный мак, и все работало опять

2 проблема тоже разрешилась, проблема, как было высказано предположение раньше, была в pf
murder писал(а):
06.12.2006 10:31

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

...
#
# GRE between Сlient and Office
pass proto gre from any to any
...

А рабочий вариант такой:

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

...
#
# GRE between Сlient and Office
pass proto gre from $client to $office keep state
pass proto gre from $office to $client keep state
...

Так что вопрос пока снят. Всем спасибо за участие =)
-//- Реальная смерть приходит с косой, а виртуальная с пассатижами -//-
Спасибо сказали: