Posterous theme by Cory Watilo

GRE tunnels in Linux

Вот случилась необходимость свзязать пару серверов в одну виртуальную сеть. Эдакая распределенная система. Причем некоторые сервера стоят в локальной сети, некоторые - у провайдеров. Разных. Для этого решил использовать GRE-тоннели. Есть самое простое и быстрое решение - IP-IP тоннели, но, к соалению, они не умеют пропускать IPv6 и Multicasting. А так как подымать все-равно с нуля, то решил сразу использовать GRE. Тоннель GRE равноправный - то есть для него нет клиента и сервера. Соответственно скрипт, запускающий тоннель должен выполняться с обоих машин. Тогда они его "прокопают" навстречу друг-другу. Итак, вот, собственно, такой скрипт у меня получился: [cc lang="bash"] #!/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 [/cc] Аналогично с другой стороны, но при этом надо не забыть поменять все IP-адреса местами. Да, с другой стороны еще может потребоваться прописать роуты. И еще одно. Есть ситуация, когда машинка-шлюз имеет 3-4 IP и надо вывести какую-то машину из локалки в инет. Это также можно сделать через GRE-тоннель, указав со стороны машинки (которая во внутрисети) LOCAL_POINT=внешний_IP, а на сервере соответственно как REMOTE_POINT. Тогда она сразу получит реальный IP и сможет ходить в интернет почти самостоятельно, и из интернета будут видеть именно ее, а не роутер за которым она стоит.