Простой Ethernet-туннель на Linux в четыре-шесть команд
Когда требуется объединить несколько компьютеров в псевдолокальную сеть через интернет часто это решается настройкой OpenVPN.
Решение хорошо работает, но не лишено недостатков:
1. Нужно ставить дополнительный софт и его настраивать. Причем с первого раза настраивается он не очень просто — надо посидеть и поразбираться.
2. Шифрование трафика происходит в пользовательском режиме и вносит дополнительные задержки, это не всегда важно но для IP-телефонии может быть заметно.
3. Шифрование не всегда нужно. Например в моем случае все соединения и так защищенные (ssh), мне нужна просто удобная плоская адресация между несколькими компьютерами так как будто они объединены в локальную сеть.
В Linux GRE-туннели настраиваются до неприличия просто (если не нужно шифрование), из требований Linux и по публичному IP на каждый.
В интернете на эту тему информации как-то исчезающе мало — в основном объясняются IP (а не ethernet) туннели и сразу вкупе с шифрованием трафика (которое нужно не всегда). man ip тоже очень обширный и информацию по
Пусть у нас есть два хоста:
HOST1 с внешним адресом 1.2.3.4
HOST2 с внешним адресом 2.3.4.5
Хочется сделать между ними ethernet-сеть, ну и для примера поверх нее можно настроить IP-адреса 192.168.0.1 192.168.0.2, но можно и любые другие или IPv6 или что угодно еще — получится обычная сеть как через коммутатор.
Все команды выполняются от ROOT, после перезагрузки — теряются. Чтобы не терялись нужно прописать команды в скрипты автозагрузки или в конфиги (у каждого дистрибутива свои).
1. Добавить виртуальную сетевую карту-шлюз на HOST1:
HOST1: ip link add grelan type gretap local 1.2.3.4 remote 2.3.4.5
На HOST1 он будет выглядеть как обычная сетевая карта — можно назначать IP-адреса, запускать DHCP-сервер, включать в Bridge и т.п.
2. Включить добавленную карту
2. Если запущен IP-tables — разрешаем GRE-трафик
HOST1: iptables -I INPUT -p gre -s 2.3.4.5 -j ACCEPT
3. Симметричная настройка на втором хосте:
HOST2: ip link add grelan type gretap local 2.3.4.5 remote 1.2.3.4 HOST2: ip link set grelan up HOST2: iptables -I INPUT -p gre -s 1.2.3.4 -j ACCEPT
В этот момент ethernet-сеть уже работает. Для проверки этого можно настроить приватные IP-адреса на каждой стороне туннеля и пустить пинги.
HOST1: ip addr add 192.168.0.1/24 HOST2: ip addr add 192.168.0.2/24
root@ubuntu:~# ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=2.45 ms 64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=1.19 ms 64 bytes from 192.168.0.1: icmp_req=3 ttl=64 time=2.45 ms
Для пингов возможно тоже придется добавить правила в iptables (или вообще выключить его на время экспериментов).
Туннель спокойно настраивается между разными версиями linux, пока писал этот пост один конец был на ubuntu, второй на centos, разницы в настройке нет абсолютно никакой.
Повторяю — это туннель не дает никакой защиты от прослушивания/внедрения трафика.
Настройка GRE туннелей в Debian Ubuntu FreeBSD Mikrotik
GRE-туннели — это туннели 3-го сетевого уровня L3 модели OSI, на которых видны IP-адреса обоих сторон. Через них можно прокидывать маршрутизацию (в том числе и default route) точно также, как и через любые другие интерфейсы.
GRE (Generic Routing Encapsulation) туннель является одним из популярных разновидностей VPN. Туннели GRE совместимы с аппаратными шлюзами безопасности, маршрутизаторами Mikrotik, Linux-роутерами, а также с оборудованием, которое умеет работать с GRE (например, Cisco, Juniper и др).
Важно! Туннели GRE относятся к типу точка-точка. Оба участника туннеля должны иметь внешние IP-адреса (или находится в одной сети) и между ними не должно быть никакой трансляции адресов NAT. Это необходимые условия для установки туннеля.
В простом виде, никаких механизмов безопасности для этих туннелей не предусмотрено (отсутствуют механизмы шифрования и аутентификации).
Обращаем ваше внимание, что сами по себе туннели GRE работают без сохранения состояния соединения (их называют stateless или connectionless), то есть невозможно понять находится ли в работоспособном состоянии туннель или нет. Мы можем только настроить обе стороны и после этого проверить передачу данных.
Туннели GRE работают непосредственно поверх IPv4-протокола. GRE используют номер IP-протокола 47.
Настройка GRE туннелей в Debian и Ubuntu идентичны
В моем распоряжение 3 удаленных сервера Debian и Ubuntu и FreeBSD с реальными статическими IP адресами. Нужно это дело объединить в одну локальную сеть c главным роутеров, в роли которого является роутер Mikrotik :
Вся настройка GRE туннеля сводиться к прописыванию в /etc/network/interfaces следующих параметров:
На первом Debian сервере в /etc/network/interfaces
auto tun0 iface tun0 inet static address 192.168.100.2 netmask 255.255.255.252 up ifconfig tun0 multicast pre-up iptunnel add tun0 mode gre local 123.124.125.10 remote 123.124.125.30 ttl 225 pointopoint 192.168.100.1 post-down iptunnel del tun0
На втором Ubuntu сервере в /etc/network/interfaces
auto tun0 iface tun0 inet static address 192.168.101.2 netmask 255.255.255.252 up ifconfig tun0 multicast pre-up iptunnel add tun0 mode gre local 123.124.125.20 remote 123.124.125.30 ttl 225 pointopoint 192.168.100.1 post-down iptunnel del tun0
Настройка GRE на FreeBSD сервере в /etc/rc.conf
cloned_interfaces="gre0" ifconfig_gre0="192.168.102.2 192.168.102.1 netmask 255.255.255.252 link0 tunnel 123.124.125.15 123.124.125.30"
Настройка GRE на Mikrotik
/interface gre add local-address=123.124.125.30 name=gre-tunnel remote-address=123.124.125.10 /interface gre add local-address=123.124.125.30 name=gre-tunnel remote-address=123.124.125.20 /interface gre add local-address=123.124.125.30 name=gre-tunnel remote-address=123.124.125.15 /ip addresses add address=192.168.100.1 interface=gre-tunnel-debian /ip addresses add address=192.168.101.1 interface=gre-tunnel-ubuntu /ip addresses add address=192.168.102.1 interface=gre-tunnel-freebsd
После настройки в Mikrotik нужно еще разрешить ip серверов в фаерволе
/ip firewall address-list add address=123.124.125.10/32 list=srv_list add address=123.124.125.15/32 list=srv_list add address=123.124.125.20/32 list=srv_list /ip firewall filter add action=accept chain=input comment="accept from our servers" connection-state=new in-interface=WAN1 src-address-list=srv_list
Настройка 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