Как направить трафик через вторичный IP-адрес на том же интерфейсе?

Вопрос или проблема

Я начал помогать в администрировании очень старого (более 15 лет) и несколько запущенного виртуального веб-сервера, который был настроен с использованием одного интерфейса с двумя IP-адресами. Один из них используется для всего, а другой предназначен только для входящих SSH-соединений и ничего больше.

Сервер был настроен с Ubuntu, и мне удалось успешно обновить его до Ubuntu 24.02 вместе со всеми пакетами, которые на нем работают. Так что он должен быть довольно современным, но в любом уголке еще могут прятаться архаичные конфигурации.

Теперь, настраивая SMTP postfix на этом сервере, я заметил, что не могу настроить его на отправку сообщений через публичный IP, и после быстрого отладки я уверен, что это проблема маршрутизации.

Интерфейс был настроен так, что IP_SSH является основным IP-адресом, поэтому он теперь привязан к ядру, и я не уверен, как это исправить, так как я не очень хорошо знаком с настройкой интерфейсов и маршрутизацией.

Вот вещи, которые, вероятно, полезны для понимания моей проблемы. Я заменил IP-адреса на заполнители IP_SSH, IP_PUBLIC, GATEWAY, IPv6 и SOURCERANGE, но надеюсь, что это все еще будет понятно. Если вам нужна дополнительная информация, пожалуйста, спрашивайте.
Вывод ip a:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether ABC brd ff:ff:ff:ff:ff:ff
    inet IP_SSH/28 brd GATEWAY scope global eth0
       valid_lft forever preferred_lft forever
    inet IP_PUBLIC/28 brd GATEWAY scope global secondary eth0:0
       valid_lft forever preferred_lft forever
    inet6 IPv6/64 scope link 
       valid_lft forever preferred_lft forever

Вывод ip r:

default via OUTSIDE dev eth0 
SOURCERANGE/28 dev eth0 proto kernel scope link src IP_SSH
OUTSIDE dev eth0 scope link 

Отладка:

Вывод ip r g 142.251.179.26 (google mailserver, балансировка нагрузки, легкий тестовый кандидат):

142.251.179.26 via OUTSIDE dev eth0 src IP_SSH uid 1001 
    cache 

Вывод nc -vzs IP_PUBLIC -w 3 gmail-smtp-in.l.google.com 25

nc: connect to gmail-smtp-in.l.google.com (142.251.179.26) port 25 (tcp) timed out: Operation now in progress
nc: getaddrinfo: Address family for hostname not supported

Вывод nc -vzs IP_SSH -w 3 gmail-smtp-in.l.google.com 25

Connection to gmail-smtp-in.l.google.com (142.251.179.26) 25 port [tcp/smtp] succeeded!

Я полагаю, что “просто” заменив IP_SSH на IP_PUBLIC здесь, я достигну желаемого результата, хотя я далек от уверенности, правильно ли это на самом деле, и особенно не уверен в правильном способе достижения этого, и вмешательство в это с моими не совсем знаниями кажется мне очень рискованным:

default via OUTSIDE dev eth0 
SOURCERANGE/28 dev eth0 proto kernel scope link src IP_PUBLIC
OUTSIDE dev eth0 scope link 

SOURCERANGE содержит как IP_SSH, так и IP_PUBLIC

Есть ли способ аккуратно изменить это? Идеально, чтобы не отключать сервер и не рисковать поддержкой SSH.

Обновление: Вывод iptables -L -n

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Я не сетевой специалист, поэтому не уверен, правильно ли это отражает то, что запрашивают комментарии, но вот:

Вывод sudo tcpdump -vi any src host IP_PUBLIC and dst 142.251.179.27 во время выполнения nc -vzs IP_PUBLIC -w 3 142.251.179.27 25

tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
08:56:01.159952 eth0  Out IP (tos 0x0, ttl 64, id 12126, offset 0, flags [DF], proto TCP (6), length 60)
    HOSTNAME.44443 > pd-in-f27.1e100.net.smtp: Flags [S], cksum 0xfa64 (incorrect -> 0x0872), seq 3530529516, win 64240, options [mss 1460,sackOK,TS val 327818188 ecr 0,nop,wscale 7], length 0
08:56:02.221936 eth0  Out IP (tos 0x0, ttl 64, id 12127, offset 0, flags [DF], proto TCP (6), length 60)
    HOSTNAME.44443 > pd-in-f27.1e100.net.smtp: Flags [S], cksum 0xfa64 (incorrect -> 0x044c), seq 3530529516, win 64240, options [mss 1460,sackOK,TS val 327819250 ecr 0,nop,wscale 7], length 0
08:56:03.245951 eth0  Out IP (tos 0x0, ttl 64, id 12128, offset 0, flags [DF], proto TCP (6), length 60)
    HOSTNAME.44443 > pd-in-f27.1e100.net.smtp: Flags [S], cksum 0xfa64 (incorrect -> 0x004c), seq 3530529516, win 64240, options [mss 1460,sackOK,TS val 327820274 ecr 0,nop,wscale 7], length 0

Ответ или решение

Для обеспечения маршрутизации трафика через вторичный IP-адрес на одном и том же интерфейсе в Ubuntu, важно учитывать некоторые ключевые моменты, включая конфигурацию интерфейсов, маршрутизацию и настройки IPTables. Давайте разберем, как это можно сделать на вашем сервере, который, как вы описали, имеет два IP-адреса на одном физическом интерфейсе.

Шаг 1: Проверка текущей конфигурации сети

Во-первых, вам необходимо удостовериться, что оба IP-адреса корректно настроены. На основе вашей информации, у вас есть:

  • IP_SSH — назначен в качестве основного IP-адреса,
  • IP_PUBLIC — назначен как вторичный адрес (eth0:0).

Вы можете проверить текущую настройку интерфейсов с помощью команды:

ip a

Шаг 2: Настройка маршрутов

Ваша текущая таблица маршрутов показывает, что исходящая трафик идет через IP_SSH. Чтобы изменить это и маршрутизировать трафик исходящий от сервера через IP_PUBLIC, вам следует изменить маршрут по умолчанию.

sudo ip route change default via GATEWAY dev eth0 src IP_PUBLIC

После выполнения данной команды проверьте маршруты еще раз:

ip r

Вы должны увидеть, что теперь маршрут по умолчанию использует IP_PUBLIC как исходящий IP-адрес.

Шаг 3: Проверка подключения

После изменения маршрута рекомендуется проверить возможность подключения для отправки почты через ваш SMTP-сервер:

nc -vzs IP_PUBLIC -w 3 gmail-smtp-in.l.google.com 25

Шаг 4: Установка постоянных маршрутов

Записи о маршрутах могут потеряться после перезагрузки сервера. Чтобы сделать их постоянными, вам нужно изменить файл конфигурации сетевых настроек. В Ubuntu 24.02 вы можете использовать Netplan для этой цели.

Откройте файл конфигурации, например:

sudo nano /etc/netplan/01-netcfg.yaml

Добавьте или измените следующие строки:

network:
    version: 2
    ethernets:
        eth0:
            addresses:
                - IP_SSH/28
                - IP_PUBLIC/28
            routes:
                - to: 0.0.0.0/0
                  via: GATEWAY
                  table: main
                  src: IP_PUBLIC

После внесения изменений примените их с помощью команды:

sudo netplan apply

Шаг 5: Проверка iptables

Убедитесь, что ваши правила iptables не блокируют исходящий трафик. В соответствии с вашими данными, кажется, что политика по умолчанию разрешает трафик, но вы можете добавить дополнительное правило для разрешения исходящего трафика ясно указав его:

sudo iptables -A OUTPUT -s IP_PUBLIC -j ACCEPT

Заключение

Теперь у вас должна быть настроенная маршрутизация трафика через IP_PUBLIC. Обязательно протестируйте различные сценарии использования, чтобы убедиться, что настройки работают так, как ожидается. Также рекомендуется сделать резервную копию всех конфигураций перед внесением изменений и, при необходимости, проводить тестирование в безопасной среде, чтобы избежать неполадок в производственной среде. Если возникнут дополнительные вопросы или вам нужны уточнения, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...