Fork me on GitHub

The WebDevil

Enjoy development

Вот случилась необходимость свзязать пару серверов в одну виртуальную сеть. Эдакая распределенная система. Причем некоторые сервера стоят в локальной сети, некоторые – у провайдеров. Разных.

Для этого решил использовать GRE-тоннели.

Есть самое простое и быстрое решение – IP-IP тоннели, но, к соалению, они не умеют пропускать IPv6 и Multicasting. А так как подымать все-равно с нуля, то решил сразу использовать GRE.

Тоннель GRE равноправный – то есть для него нет клиента и сервера. Соответственно скрипт, запускающий тоннель должен выполняться с обоих машин. Тогда они его “прокопают” навстречу друг-другу.

Итак, вот, собственно, такой скрипт у меня получился:

#!/bin/bash

modprobe ip_gre
#Как назовем наш интерфейс
DEV=tun0

#TTL для пакетов в тоннеле
TTL=255

#IP удаленного хоста
REMOTEIP=172.16.0.1

#IP с которого будем копать к вышеуказанному
LOCALIP=172.16.0.2

#Адрес с этой стороны тоннеля
LOCAL_POINT=10.1.1.2

#Адрес с той стороны тоннеля
REMOTE_POINT1=10.1.1.3

#Сетевая маска
NETMASK=255.255.255.0

start()
{
  iptunnel add $DEV remote $REMOTEIP local $LOCALIP mode gre ttl $TTL
  ifconfig $DEV $LOCAL_POINT netmask $NETMASK pointopoint $REMOTE_POINT
}
stop()
{
  ifconfig $DEV down
  iptunnel del $DEV
}

case "$1" in
  start)
    start ;;
  stop)
    stop ;;
  restart)
    stop
    start ;;
esac

Аналогично с другой стороны, но при этом надо не забыть поменять все IP-адреса местами.

Да, с другой стороны еще может потребоваться прописать роуты.

И еще одно. Есть ситуация, когда машинка-шлюз имеет 3-4 IP и надо вывести какую-то машину из локалки в инет. Это также можно сделать через GRE-тоннель, указав со стороны машинки (которая во внутрисети) LOCAL_POINT=внешний_IP, а на сервере соответственно как REMOTE_POINT. Тогда она сразу получит реальный IP и сможет ходить в интернет почти самостоятельно, и из интернета будут видеть именно ее, а не роутер за которым она стоит.

Comments are closed.