Настройка gre туннеля linux

How to create a GRE tunnel on Linux

Question: I want to connect to remote networks by using a GRE tunnel. How can I create a GRE tunnel between two end points on Linux?

GRE tunnels are IP-over-IP tunnels which can encapsulate IPv4/IPv6 and unicast/multicast traffic. To create a GRE tunnel on Linux, you need ip_gre kernel module, which is GRE over IPv4 tunneling driver.

So first make sure that ip_gre is loaded.

$ sudo modprobe ip_gre $ lsmod | grep gre
ip_gre 22432 0 gre 12989 1 ip_gre

Here, we assume that you want to create a GRE tunnel between two interfaces with the following IP addresses.

On host A, run the following command.

$ sudo ip tunnel add gre0 mode gre remote 172.168.10.25 local 192.168.233.204 ttl 255 $ sudo ip link set gre0 up $ sudo ip addr add 10.10.10.1/24 dev gre0

In the above, we create a GRE-type tunnel device called gre0 , and set its remote address to 172.168.10.25 . Tunneling packets will be originating from 192.168.233.204 (local IP address), and their TTL field will be set to 255 . The tunnel device is assigned IP address 10.10.10.1 with netmask 255.255.255.0 .

Now verify that route for the GRE tunnel is set up correctly:

default via 135.112.29.1 dev eth0 proto static 10.10.10.0/24 dev gre0 proto kernel scope link src 10.10.10.1

On host B, run similar commands as follows.

$ sudo ip tunnel add gre0 mode gre remote 192.168.233.204 local 172.168.10.25 ttl 255 $ sudo ip link set gre0 up $ sudo ip addr add 10.10.10.2/24 dev gre0

At this point, a GRE tunnel should be established between host A and host B.To verify that, from one tunneling end point, ping the other end point.

PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data. 64 bytes from 10.10.10.2: icmp_req=1 ttl=64 time=0.619 ms 64 bytes from 10.10.10.2: icmp_req=2 ttl=64 time=0.496 ms 64 bytes from 10.10.10.2: icmp_req=3 ttl=64 time=0.587 ms

If you want to tear down the existing GRE tunnel, run the following command from either end.

$ sudo ip link set gre0 down $ sudo ip tunnel del gre0

Support Xmodulo

This website is made possible by minimal ads and your gracious donation via PayPal or credit card

Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.

Источник

Настройка проксирования внешнего адреса через GRE туннель между Linux серверами

Привет, друзья!
Я имею два сервера, сервер А и сервер Б, оба на Debian Wheezy. На сервер А зароучено определенное количество внешних IP-адресов, а на сервер Б — один, и то он стоит за натом. И возникла у меня на днях весьма нетривиальная задача — понадобилось пробросить один из IP-адресов сервера А на сервер Б, да так, чтобы реальные IP посетителей при проксировании сохранялись, и была возможность управлять трафиком, который будет поступать на сервер Б. NAT и ip-ip отпал сам собой из-за второго условия, да и они далеко не самые производительные. И я решил смотреть в сторону GRE туннеля.
Под катом настройка и тестирования GRE-туннеля, а также проксирование внешнего IP-адреса через GRE-туннель на другой сервер.

Читайте также:  Исо образ кали линукс

Для начала нам нужно загрузить модуль gre на обоих серверах перед выполнением операций, поскольку это автоматически не происходит. Мы укажем это в конфигах, так что при последующих активациях интерфейса туннеля он будет подгружаться автоматически, а пока давайте подргузим его сами:
modprobe ip_gre

Далее в /etc/network/interfaces сервера А прописываем следующее:

auto tun0
iface tun0 inet static
address 10.10.10.1
netmask 255.255.255.0
pointopoint $ip_to_proxy
pre-up modprobe ip_gre
pre-up ip tunnel add tun0 mode gre local $server1_ip remote $server2_ip ttl 255 dev $dev
up ifconfig tun0 multicast
up arp -sD $ip_to_proxy $dev pub
post-down ip tunnel del tun0

А теперь я объясню, что значит каждая строчка.
auto tun0 — интерфейс будет подниматься автоматически при запуске сети. Интерфейс можно назвать как угодно, не обязательно tun0, но главное, чтобы таких же имен в системе не было.
iface tun0 inet static — интерфейс туннеля у нас будет иметь статический IP-адрес.
address 10.10.10.1 — это адрес сервера А внутри туннеля. Из сервера Б он будет доступен по команде ping именно по этому адресу.
netmask 255.255.255.0 — маска подсети.
pointopoint $ip_to_proxy — вместо $ip_to_proxy подставьте IP-адрес, который вы собираетесь пробросить на сервер Б. Нужно, чтобы такой адрес никто не слушал и он нигде не был прописан.
pre-up modprobe ip_gre — загружать модуль туннеля ip_gre автоматически перед поднятием интерфейса.
pre-up ip tunnel add tun0 mode gre local $server1_ip remote $server2_ip ttl 255 dev $dev — вместо $server1_ip подставьте существующий публичный IP-адрес сервера А, который имеет интерфейс $dev. $dev — соответственно основной интерфейс, который будет использоваться GRE. Обычно это eth0. $server2_ip — внешний адрес сервера Б (неважно, что он за натом и имеет в действительности серый адрес, это будет учтено в конфигурации для сервера Б).
up ifconfig tun0 multicast — интерфейс у нас многоадресный, поэтому нам нужно включить для него мультикаст.
up arp -sD $ip_to_proxy $dev pub — этим трюком мы обойдем необходимость проксирования ARP (net.ipv4.neigh.$dev.proxy_arp = 1 в sysctl.conf), так как мы оперируем лишь с одним адресом. Да это и неважно, но при включении proxy_arp на все интерфейсы вашего сервера будет литься промежуточный трафик от роутера, что очень нехорошо, ибо он достигает внушительных размеров. Чтобы избавиться от такого «побочного эффекта», мы и воспользуемся этой командой. Значения переменных $ip_to_proxy и $dev смотрите выше.
post-down ip tunnel del tun0 — при отключении сети удалить информацию о созданном туннеле (которую можно просмотреть при помощи команды ip tunnel).

Читайте также:  Звук при запуске linux

В /etc/sysctl.conf сервера А также включаем IP Forwarding, прописав в файле net.ipv4.ip_forward = 1 , сохранив его и применив обновленное значение командой sysctl -p.

На этом мы закончили с сервером А, осталось только поднять интерфейс туннеля, что мы сделаем после аналогичных настроек на сервере Б.

Внизу файла /etc/iproute2/rt_tables дописываем 200 tun0 , сохраняем файл.
В /etc/network/interfaces сервера Б прописываем следующее:

auto tun0
iface tun0 inet static
address $ip_to_proxy
netmask 255.255.255.0
pointopoint 10.10.10.1
pre-up modprobe ip_gre
pre-up iptunnel add tun0 mode gre local $server2_ip remote $server1_ip ttl 255 dev $dev
up ifconfig tun0 multicast
post-up ip ru add from $ip_to_proxy lookup tun0 priority 32765
post-up ip ro add default via 10.10.10.1 dev tun0 src $ip_to_proxy table tun0
pre-down ip ro del default via 10.10.10.1 dev tun0 src $ip_to_proxy table tun0
pre-down ip ru del from $ip_to_proxy lookup tun0 priority 32765
post-down iptunnel del tun0

Я расскажу только про отличия данных от сервера А.
address $ip_to_proxy — вместо $ip_to_proxy подставляем IP адрес, который нам будет проксировать сервер А.
pre-up iptunnel add tun0 mode gre local $server2_ip remote $server1_ip ttl 255 dev $dev — отличий нет, замечу только, что в качестве $server2_ip можно указать и серый IP адрес. Обратите внимание, что если сервер за натом, и вы укажете адрес ната, а не реальный серый, то туннель работать не будет! Убедитесь, что IP, который вы сюда подставите, прибит к внешнему интерфейсу $dev (обычно eth0).
post-up ip ru add from $ip_to_proxy lookup tun0 priority 32765 — после поднятия интерфейса мы создадим правило маршрутизации для пакетов, приходящих с IP адреса, который нам будет отдавать сервер А. Правило будет иметь название tun0 и корректность его создания вы сможете проверить командой ip rule show.
post-up ip ro add default via 10.10.10.1 dev tun0 src $ip_to_proxy table tun0 — завернуть трафик для нашего туннеля внутрь вышесозданного правила маршрутизации. 10.10.10.1 — это IP адрес сервера А внутри туннеля.
Следующие два правила удалят сначало правило для заворота трафика, а затем и правило маршрутизации после того, как сеть будет отключена.

Вот и все! Теперь выполняем команду ifup tun0 на сервере А и сервере Б. Если все сделано правильно, то сервер А будет пинговаться из сервера Б по адресу 10.10.10.1, а команда traceroute $ip_to_proxy покажет, что трафик проходит через $server1_ip.

А теперь пару примеров.

Для того, чтобы убедиться, что IP-адреса клиентов реальны, а не IP сервера А, как это произойдет с NAT / ip-ip, запустим tcpdump на сервере Б:
tcpdump -i tun0 port 80
И увидим, что пакеты имеют реальные IP-адреса.
Теперь вы можете управлять трафиком, который будет проходить через сервер А на сервер Б. Для этого используйте нужные вам правила iptables в формате iptables -t raw -A PREROUTING -d $ip_to_proxy либо же iptables -t mangle -A PREROUTING -d $ip_to_proxy на сервер А. Они подействуют на трафик, который пройдет на сервер Б.
Пример: добавив на сервере А правило iptables -t mangle -A PREROUTING -d $ip_to_proxy -p tcp -m tcp —dport 80 -j DROP , мы заблокируем для сервера Б HTTP-трафик.
Стоит еще отметить, что туннель может корректно заработать не сразу в связи с задержками в обработке ARP кешей.
Если что-то не вышло, пишите в комментариях и я постараюсь помочь. Удачи вам!

Читайте также:  Path to jdk linux mint

Источник

Настройка Linux для туннеля GRE

Если вы видите что-то еще, возможно, ваше ядро не поддерживает GRE.
Для пересылки всего трафика в туннель GRE и из него мы будем использовать iptables и iproute2, которые уже должны быть установлены во всех основных дистрибутивах Linux. Если они не установлены, используйте следующую команду
для дистрибутивов на основе Debian:

sudo apt install iptables iproute2
sudo yum install iptables iproute2

Шаг 2 — Настройка туннеля

Сначала мы должны настроить наш туннель.
На сервере A выполните этот код, чтобы включить пересылку ip:

sudo echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf sudo sysctl -p
sudo ip tunnel add gre1 mode gre local 198.51.100.1 remote 203.0.113.1 ttl 255 sudo ip addr add 10.0.0.1/30 dev gre1 sudo ip link set gre1 up
sudo ip tunnel add gre1 mode gre local 203.0.113.1 remote 198.51.100.1 ttl 255 sudo ip addr add 10.0.0.2/30 dev gre1 sudo ip link set gre1 up

Шаг 2.1 — Тест Ping

Шаг 3 — Добавить новые маршруты

Маршрут необходим для правильной обработки данных, поступающих через туннель GRE.
На сервере B выполните:

sudo echo '100 GRE' >> /etc/iproute2/rt_tables sudo ip rule add from 10.0.0.0/30 table GRE sudo ip route add default via 10.0.0.1 table GRE

Шаг 4 — Настройте NAT

iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source 198.51.100.1

Чтобы проверить исходящее соединение, выполните на сервере B следующие команды:
для дистрибутивов на основе Debian:

curl http://www.cpanel.net/showip.cgi --interface 10.0.0.2

Шаг 5 — Порты пересылки

На сервере A выполните следующие команды, чтобы разрешить все данные, поступающие на сервер B и поступающие с него:

sudo iptables -A FORWARD -d 10.0.0.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT sudo iptables -A FORWARD -s 10.0.0.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -d 198.51.100.1 -p PROTO -m PROTO --dport PORT -j DNAT --to-destination 10.0.0.2

замена PROTO и PORT вашими фактическими.
Например, чтобы переслать все данные на веб-сервер (порт TCP 80), нам нужно выполнить:

sudo iptables -t nat -A PREROUTING -d 198.51.100.1 -p TCP -m TCP --dport 80 -j DNAT --to-destination 10.0.0.2

Шаг 6 — Сделай постоянным

На сервере перезагрузите все, что мы сделали, будут уничтожены. Чтобы убедиться, что туннель GRE и все остальное будет работать после перезапуска, мы должны отредактировать файл /etc/rc.local и добавить все команды, которые мы сделали (кроме эхо!) Перед exit 0 .

Заключение

Теперь, если мы подключаемся к серверу A, используя настроенные порты (например, порт TCP 80), мы вместо этого собираемся подключиться к серверу B, не зная об этом.
Примечание: если вы используете CSF для управления iptables, вам, возможно, придется поместить все команды iptables в свой /etc/csf/csfpost.sh и вставить IP-адрес обоих серверов (также GRE) в свой /etc/csf/csf.allow

Источник

Оцените статью
Adblock
detector