1

В настоящее время у меня есть VPS с одним статическим IP. Будет ли возможен следующий сценарий, если я куплю второй статический IP?

Предположим, что IP A для eth0:0 равен 1.2.3.4, а статический IP B для eth0:1 равен 5.6.7.8. Я хочу направить весь трафик, идущий к IP A, на мой домашний маршрутизатор, без использования NAT на стороне сервера. Я думаю об установлении GRE-туннеля (защищенного с помощью IPsec) между моим домашним маршрутизатором и IP-адресом B. Затем входящие IP-пакеты на IP-A необходимо будет передавать внутри туннеля. Я думаю, что диаграмма должна прояснить это:Диаграмма сети Обычно это было бы очевидным случаем использования VPN-соединения между сайтами и использования NAT на VPS, но на самом деле я не хочу использовать NAT на стороне сервера. Вместо этого я хочу, чтобы мой домашний маршрутизатор выполнял srcnat для исходящего трафика и dstnat для определенного входящего трафика. VPS должен только "проходить" через входящие и исходящие IP-пакеты.

Я представляю поток пакетов следующим образом:

  1. Хост внутри локальной сети 192.168.100.0/24 хочет отправить пакет, скажем, 8.8.8.8

  2. Домашний маршрутизатор проверяет это на статический IP A (1.2.3.4)

  3. пакет проходит через gre1 и попадает в VPS

  4. VPS пересылает пакет через eth0:0, оставляя исходное поле IP без изменений

  5. ответ от 8.8.8.8 поступает на VPS с IP-адресом назначения 1.2.3.4

  6. VPS берет пакет и помещает его в gre1, не делая NAT

  7. Домашний маршрутизатор обрабатывает пакет и проверяет, является ли оно установленным или связанным соединением, и пересылает его соответствующему клиенту локальной сети.

Я думаю, я мог бы просто добавить еще один IP на интерфейсе gre1 на моем маршрутизаторе, а именно 1.2.3.4, так что он 1) принимает IP-пакеты с этим значением назначения и 2) отправляет исходящие пакеты с этим IP вместо туннельного IP (10.0). 0.2)?

Короче говоря, я просто хочу, чтобы все пакеты, поступающие в eth0:0, поступали без изменений в gre1 на моем домашнем маршрутизаторе. Возможно ли это описанным способом?

Кстати, я использую маршрутизатор Mikrotik дома, если это какой-либо дополнительной информации.

Спасибо за вашу помощь!

1 ответ1

1

Во-первых, перестаньте думать о eth0 и eth0:1 как об отдельных интерфейсах. Прекратите рисовать их как отдельные интерфейсы. Они не. У вас есть один интерфейс eth0 с двумя IP-адресами - остальное иллюзия, которую Linux играет на старых инструментах, таких как ifconfig.


Учитывая это, это довольно просто на стороне сервера.

  1. Чтобы настроить это на своем сервере, начните с удаления адреса 5.6.7.8 из eth0. Вы не хотите, чтобы сервер думал, что эти пакеты принадлежат ему и потребляют их; Вы хотите, чтобы он действовал как чистый маршрутизатор, а наличие маршрутизируемого адреса, назначенного локальному интерфейсу, является именно тем, что маршрутизатору не нужно.

    ip addr del 5.6.7.8/x dev eth0
    
  2. Теперь добавьте статический маршрут для адреса через ваш туннель:

    ip route add 5.6.7.8/32 dev gre1
    
  3. Вот и все (почти). Единственное оставшееся осложнение заключается в том, что серверу все еще нужно отвечать на ARP-запросы для этого адреса, поступающего с локального шлюза вашей хостинговой компании. Для этого вам нужна функция прокси-ARP :

    ip neigh add proxy 5.6.7.8 dev eth0
    

    Это включает прокси-ARP для одного адреса. Не используйте sysctl net.ipv4.conf.all.proxy_arp=1 чтобы включить его глобально; это вызвало бы ответы прокси-ARP на все, для чего у вашего сервера есть маршрут, что может быть удобно в некоторых случаях, но не нужно в этом случае.

    (Как примечание, пользовательское пространство parpd или ndppd может быть проще для понимания, чем основанный на ядре прокси-ARP/NDP.)

На клиентском маршрутизаторе может потребоваться более сложная конфигурация, поскольку ему приходится выбирать между двумя шлюзами по умолчанию (прямой маршрут или GRE) в зависимости от исходного IP-адреса.

К счастью, Mikrotik RouterOS имеет функцию маршрутизации политики Linux как минимум для IPv4 (но все же не для IPv6), поэтому вы можете следовать широко распространенным инструкциям ip rule Linux и сопоставить их 1:1 с командами RouterOS. Короче:

  1. Добавить маршрут по умолчанию через туннель GRE к другой маршрутизации Таблица mark (RouterOS называет это "меткой маршрутизации"):

    /ip route add dst-address=0.0.0.0/0 gateway=gre0 routing-mark="tunnelled"
    
  2. Добавьте правило политики, чтобы выбрать эту маршрутизацию отметка таблица (RouterOS ...) для пакетов с этого адреса источника:

    /ip rule add src-address=5.6.7.8/32 table="tunnelled"
    

Комментарий упоминает мостовое соединение. Это не сработает по двум причинам.

GRE - это туннель уровня 3, который не транспортирует Ethernet-подобные заголовки и, следовательно, не является мостовым. Есть варианты Layer2, такие как Linux gretap и Mikrotik eoip - к сожалению, они взаимно несовместимы, несмотря на то, что оба основаны на GRE.

В комментарии фактически упоминается tun, возможно, при условии, что туннелем является OpenVPN (GRE не OpenVPN), но tun также является интерфейсом Layer3. Теперь существует версия Layer2 - интерфейс tap - и Linux OpenVPN может фактически быть настроен для его использования и быть VPN-сервером Layer2 ... но реализация RouterOS OpenVPN в любом случае не поддерживает этот режим.

Более того, поскольку eth0:1 не является отдельным интерфейсом, он не может быть соединен без соединения самого eth0. Может ли виртуальный интерфейс macvlan быть создан из eth0 и затем соединен с туннелем? Точно сказать не могу. Вероятно, будет больше проблем, чем оно того стоит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .