Вот случилась необходимость свзязать пару серверов в одну виртуальную сеть. Эдакая распределенная система. Причем некоторые сервера стоят в локальной сети, некоторые – у провайдеров. Разных.
Для этого решил использовать GRE-тоннели.
Есть самое простое и быстрое решение – IP-IP тоннели, но, к соалению, они не умеют пропускать IPv6 и Multicasting. А так как подымать все-равно с нуля, то решил сразу использовать GRE.
Тоннель GRE равноправный – то есть для него нет клиента и сервера. Соответственно скрипт, запускающий тоннель должен выполняться с обоих машин. Тогда они его “прокопают” навстречу друг-другу.
Итак, вот, собственно, такой скрипт у меня получился:
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 и сможет ходить в интернет почти самостоятельно, и из интернета будут видеть именно ее, а не роутер за которым она стоит.