Как настроить IP-IP-тунель между FreeBSD и Linux

Posted by Alexey Kovyrin under Networks · english

Иногда бывают ситуации, когда мне необходимо соединить удаленные Unix-сервера тунелем для того, чтобы предоставить локальным пользователям определенные сервисы из удаленной сети или просто для того, чтобы получить доступ к удаленной внутренней сети. Я был очень удивлен, когда мой знакомый, молодой сисадмин, спросил меня о том, как поднять IP-IP тунель между разными операционными системами (в его случае: FreeBSD и Linux) и сказал, что не может найти информацию по этому вопросу. Как результат моих с ним изысканий появилось это HOWTO.

Давайте для начала посмотрим, что у нас есть и что нам надо получить в итоге.

Мы имеем 2 сервера:

  • Server1:
    • ОС: Linux
    • Сетевой интерфейс: eth0
    • IP: 100.100.100.100
  • Server2:
    • ОС: FreeBSD
    • Сетевой интерфейс: fxp0
    • IP: 200.200.200.200

Нам необходимо получить IPv4 over IPv4 тунель со следующими параметрами между указанными серверами:

  • Server1: 10.0.0.1 / 255.255.255.252
  • Server2: 10.0.0.2 / 255.255.255.252

Для настройки описанной конфигурации на Linux-сервере нам нужно выполнить следующие шаги:

  • Создадим ipip-тунельный интерфейс:

    # ip tunnel add tun0 mode ipip \\
    > remote 200.200.200.200 local 100.100.100.100 dev eth0
    

  • Установим IP-адреса:

    # ifconfig tun0 10.0.0.1 netmask 255.255.255.252 \\
    > pointopoint 10.0.0.2
    

  • Установим MTU и поднимем интерфейс:

    # ifconfig tun0 mtu 1500 up
    

Теперь на Linux-сервере мы имеем следующий интерфейс:

linux:~# ifconfig tun0
tun77     Link encap:IPIP Tunnel  HWaddr
          inet addr:10.0.0.1  P-t-P:10.0.0.2  Mask:255.255.255.252
          UP POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:504 (504.0 b)  TX bytes:624 (624.0 b)

Следующим шагом будет настройка конца тунеля на стороне FeeeBSD-сервера:

  • Создаем gif-интерфейс для тунеля:

    # # ifconfig gif0 create
    

  • Устанавливаем транспортные IP-адреса:

    # gifconfig gif0 inet 200.200.200.200 100.100.100.100
    

  • Устанавливаем IP-адреса тунеля:

    # ifconfig gif0 10.0.0.2 netmask 255.255.255.252 10.0.0.1
    

  • Устанавливаем MTU и поднимаем интерфейс:

    # ifconfig gif0 mtu 1500 up
    

В результате на стороне FreeBSD видим следующее:

# ifconfig gif0
gif0: flags=8051 mtu 1500
        tunnel inet 200.200.200.200 --> 100.100.100.100
        inet 10.0.0.2 --> 10.0.0.1 netmask 0xfffffffc

Для проверки результатов можно использовать утилиту ping на любой из сторон тунеля. Ны проверим со стороны Linux-сервера:

linux:~# ping -c 4 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.139 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.138 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.138 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.136 ms

--- 172.17.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.136/0.137/0.139/0.014 ms

Вот и все! Теперь у нас есть “прямое” соединение между серверами и мы можен настраивать маршрутизацию, используя этот линк.


Related posts:

  1. Обзор Неофициальных Репозитариев Пакетов Для Дистрибутива Debian GNU/Linux
  2. Настройка и оптимизация Red Hat Enterprise Linux для баз данных Oracle 9i и 10g
  3. Linux Traffic Shaping За 5 Минут При Помощи htb.init
  4. Включение поддержки NCQ Queing на чипсетах ICH7 Chipsets под Linux
  5. Как получить “не зависящий от провайдера” IP-адрес для домашнего сервера?

11 Comments » | Bookmark on del.icio.us

11 Responses to this entry

Thomas Anderson says:

# ifconfig tun0 10.0.0.1 netmask 255.255.255.252 \
> pointopoint 10.0.0.1

ошибочка – должно быть так:
ifconfig tun0 10.0.0.1 netmask 255.255.255.252 \
> pointopoint 10.0.0.2

zenith says:

У меня вот возник вопрос: как быть если число серверов больше двух? Настраивать туннели попарно? Или можно это сделать по-другому? У меня 14 подсетей :)

rcayenne says:

For which version of FreeBSD is this example intented? I tryed it on 5.2.1 and there is no gifconfig command.

Scoundrel says:

I’ve tried it in 4.X, but I think, that this command should be in 5.X and 6.X. maybe they’ve changed its name… Try to use Google ;-)

tunnel says:

In 5.x and 6.x the gifconfig command is included in the ifconfig command itself as an option “tunnel”.

Семён says:

Народ а расскажите можно ли теперь этот IP-тунель криптовать Racoon-ом???

Felipe Alfaro Solana says:

Using an MTU of 1,500 on the tun0 will likely cause fragmentation issues.

Typically, Ethernet maximum frame size is 1,500 bytes. MTU reflects the maximum payload that will fit in the Layer 2 without causing fragmentation. If you use an MTU of 1,500 for tun0, your encapsulating IP datagram will likely be fragmented because you are not accounting for the overhead of the encapsulation.

When using IP-over-IP, you need to discount 20 bytes for the encapsulating IP header. This means you should use an MTU of 1,480 and not 1,500. If you want to use GRE, you also need to deduct the size of the GRE header.