Пошаговая инструкция
Введение
Generic Routing Encapsulation (GRE) – это протокол туннелирования, разработанный Cisco Systems, который может инкапсулировать широкий спектр протоколов сетевого уровня в виртуальных двухточечных каналах или двухточечных каналах по сети Интернет-протокола.
Туннель GRE полезен в определенных ситуациях, например, для защиты сервера без защиты от DDoS с использованием другого с защитой, или для включения приложений, которые позволяют IPv4 только принимать IPv6.
Предпосылки
Прежде всего, у вас должно быть два сервера с правами доступа root. В этом руководстве они будут называться Сервер A и Сервер B и будут иметь следующие характеристики:
- Сервер A – сервер, к которому будут подключаться все клиенты
- IP: 198.51.100.1
- Внутренний IP-адрес туннеля GRE: 10.0.0.1
- Сервер B – сервер, на котором фактически запущены все приложения
- IP: 203.0.113.1
- Внутренний IP-адрес туннеля GRE: 10.0.0.2
Шаг 1 – Загрузить модуль
Для настройки туннеля GRE в Linux у вас должен быть ip_greзагружен модуль в вашем ядре. Чтобы убедиться, что он загружен, просто сделайте:
sudo modprobe ip_gre
lsmod | grep gre
И вы должны увидеть:
ip_gre ##### 0
gre ##### 1 ip_gre
Если вы видите что-то еще, возможно, ваше ядро не поддерживает GRE.
Для пересылки всего трафика в туннель GRE и из него мы будем использовать iptables и iproute2, которые уже должны быть установлены во всех основных дистрибутивах Linux. Если они не установлены, используйте следующую команду
для дистрибутивов на основе Debian:
sudo apt install iptables iproute2
для дистрибутивов Red Hat:
sudo yum install iptables iproute2
Шаг 2 – Настройка туннеля
Сначала мы должны настроить наш туннель.
На сервере A выполните этот код, чтобы включить пересылку ip:
sudo echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sudo sysctl -p
Теперь создайте новый сетевой интерфейс, который будет использовать туннель GRE:
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
Затем сделайте то же самое на сервере B, изменив IP-адреса:
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
На сервере А делайте:
ping 10.0.0.2
И на сервере Б сделайте:
ping 10.0.0.1
Если пинг работает, то туннель GRE правильно настроен.
Шаг 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
NAT используется для передачи данных через нашу GRE и на другой конец.
На сервере А запустить:
iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source 198.51.100.1
Чтобы проверить исходящее соединение, выполните на сервере B следующие команды:
для дистрибутивов на основе Debian:
sudo apt install curl
для дистрибутивов Red Hat:
sudo yum install curl
а потом:
curl http://www.cpanel.net/showip.cgi --interface 10.0.0.2
В конце вы должны увидеть IP-адрес сервера А.
Шаг 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
Затем мы хотим переслать все наши данные с сервера A на сервер B.
Выполнить на сервере A:
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