Вопрос или проблема
Я начал помогать в администрировании очень старого (более 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
. Обязательно протестируйте различные сценарии использования, чтобы убедиться, что настройки работают так, как ожидается. Также рекомендуется сделать резервную копию всех конфигураций перед внесением изменений и, при необходимости, проводить тестирование в безопасной среде, чтобы избежать неполадок в производственной среде. Если возникнут дополнительные вопросы или вам нужны уточнения, не стесняйтесь обращаться за помощью.