Входящее и исходящее — разные вопросы
Несколько сайтов на одной машине и распределение адресов — разные задачи. Здесь два вопроса: на какую строку списка приходит запрос и с какой строки машина уходит, когда сама открывает соединение.
Консоль делит адреса на строки. Первая строка — для SSH или RDP. Каждая следующая — отдельный купленный IPv4, а не свободное место в подсети. Как поставить строку на интерфейс и сохранить её после перезагрузки, написано в заметке как добавить каждый дополнительный IPv4. После этого строки назначаются сайтам.
Входящая сторона смотрит на DNS и адрес прослушивания. Клиент подключается к строке, которую называет запись A. Программа, которая слушает только первую строку, не ответит на тот же порт другой строки.
Исходящая сторона зависит от того, кто открыл соединение. После того как кто-то подключился к конкретной строке, ответы этого сеанса уходят с неё. Соединение, которое машина открывает сама, — обновление, вызов API, исходящая почта — использует первую строку, ту, что держит маршрут по умолчанию, если программа не задала локальный адрес.
Несколько сайтов делят первую строку
Если все сайты — веб на портах 80 и 443 и их различает имя, направьте все имена на первую строку. Новое имя не требует нового адреса.
У каждого имени одна запись A, и значение везде — первая строка. Веб-служба слушает 0.0.0.0 порт 443 или только порт 443 первой строки. Имя выбирает каталог сайта и сертификат. Сертификат следует за именем, а не за числом строк. На общей строке SNI разделяет сертификаты на одном порту.
server {
listen 443 ssl;
server_name a.example;
}
server {
listen 443 ssl;
server_name b.example;
}
Ни один блок не закрепляет адрес, поэтому оба слушают все адреса этого интерфейса и затем делятся по server_name. Если написать listen 203.0.113.10:443 ssl, внутрь попадёт только порт 443 первой строки. Порт 443 дополнительного адреса в эти блоки не войдёт.
IIS делает то же заголовком узла. Привяжите IP к первой строке или к «все неназначенные», в имя узла впишите каждый домен, порт оставьте 443. Новый сайт — это новая привязка и новая запись A, а не новая строка адреса.
Две программы не могут одновременно единолично занять один порт на одной строке. Вторая привязка не состоится. Если службе нужен этот порт целиком, перенесите одну из них на другую строку, как в следующем разделе.
Один сайт занимает одну строку
Делите по строкам в случаях ниже. Критерий — порт и адрес источника, а не само число сайтов.
Двум процессам нужен один порт, и имя их не разделяет. Обычно это два слушателя, каждому из которых нужен порт 25 или один и тот же свой порт. На одной строке у этого порта один слушатель. Второй процесс ставится на следующую строку.
Если запись A службы должна быть её собственным адресом, отличным от других сайтов, направьте это имя на другую строку списка. Процесс слушает эту строку или 0.0.0.0, чтобы строка входила в прослушивание.
Если исходящая почта, обратный вызов или вызов API должны выглядеть выбранной строкой, а не первой, эта строка уже должна быть на интерфейсе, и программа должна привязать к ней локальный адрес. Смена только записи A не меняет источник соединения, которое программа открывает сама.
server {
listen 203.0.113.10:443 ssl;
server_name a.example;
}
server {
listen 203.0.113.21:443 ssl;
server_name b.example;
}
203.0.113.10 и 203.0.113.21 — документационные адреса. Подставьте две строки из списка. Первый блок принимает только первую строку, второй — только дополнительную. Обе уже должны быть на интерфейсе как /32. Запись A для b.example — 203.0.113.21, а не первая строка.
Программа, слушающая 0.0.0.0, отвечает и на строки, добавленные позже. Если сайт должен быть виден только на одной строке, напишите её в listen и не оставляйте 0.0.0.0. Наоборот, программа, привязанная только к первой строке, не ответит на строку, добавленную потом.
Когда адрес отдан виртуальной машине, строка есть только на её карте. Не настраивайте ту же строку на мосту или физическом порту хоста. Если сайт работает на хосте, оставьте строку на интерфейсе, где уже есть первый адрес.
По этой таблице решают, сколько покупать
Включённая первая строка считается одним адресом, который можно назначить. Каждый следующий адрес, который нужно занять отдельно, — это один дополнительный IPv4. Имена, которые делят первую строку, число не увеличивают.
| Что нужно | Куда ставить адреса | Докупить |
|---|---|---|
| Несколько сайтов на 80/443, различие по имени | Все записи A указывают на первую строку | 0 |
| Четыре сайта, у каждого своя запись A и своя строка | Первая строка одному, остальным по строке | 3 |
| Сайты делят первую строку, ещё двум службам нужны свои адреса | Сайты на первой строке, службы по одной строке | 2 |
| Два процесса на одном порту, именем не разделить | Каждый слушает свою строку | Минимум 1 |
Четыре сайта, которым можно делить адрес, не требуют дополнительных. Четырём сайтам, каждому со своей строкой, нужны три дополнительных. Вместе с включённым адресом в списке четыре строки. Не покупайте «примерно /29» из-за четырёх сайтов. /29 — запись блока из восьми адресов. Здесь адреса не продаются блоком, и настраивать адрес сети или broadcast не из чего.
Каждый дополнительный адрес — $1.6 в месяц, не больше 255 дополнительных, вместе с включённым — не больше 256. Пять дополнительных — $8.0 в месяц. Сначала прибавьте это к месячной аренде, затем умножьте на число месяцев срока. Месяц — на 1, квартал — на 3, полгода — на 6, год — на 12. Скидки ни на одном сроке нет.
128GB — $454.8 в месяц, 256GB — $612.7. Память — DDR4-3200 ECC RDIMM, после заказа не наращивается. Процессор — AMD EPYC 7543P, 32 ядра и 64 потока, от 2,8 до 3,7 ГГц. По умолчанию два NVMe по 1TB, каждый напрямую, без аппаратного RAID, доступный объём — сумма, около 2TB. Канал с 250 Mbps и без лимита трафика. 1 Gbps добавляет $245.0 в месяц, 2 Gbps — $742.7. Платы за установку нет. Машина размещена в Токио, Япония. Linux использует SSH, Windows — RDP. Обе команды пишут только первую строку.
На странице конфигурации укажите число из этой таблицы. Ноль значит, что все общие сайты используют включённую строку. Новый каталог сайта при том же порте и том же адресе источника число дополнительных не увеличивает.
Новые соединения уходят с первой строки
Маршрут по умолчанию записывается при установке вместе с первой строкой. Адреса, добавленные позже как /32, в Linux являются вторичными на том же интерфейсе. Если программа создаёт сокет и не выбирает локальный адрес, ядро выбирает источник вдоль маршрута по умолчанию. Этот источник — основной адрес, первая строка.
Спросите таблицу маршрутов на машине. До цели ходить не нужно. 192.0.2.1 только заставляет систему показать, какой маршрут по умолчанию она выбрала бы наружу и какую строку взяла бы источником.
ip route get 192.0.2.1
src в выводе должен быть первой строкой списка. via — исходный шлюз. Если src стал строкой, добавленной позже, маршрут по умолчанию меняли или первая строка больше не основной адрес этого интерфейса. Верните маршрут по умолчанию к состоянию после установки, дополнительные адреса оставьте на интерфейсе как /32.
Уже открытый входящий сеанс под это правило не попадает. У клиента, подключившегося к 203.0.113.21, локальный адрес сокета — 203.0.113.21, и ответы уходят с него. Браузер, открывающий сайт на дополнительном адресе, видит эту строку. В то же время apt, задание по расписанию и HTTP-клиент без привязки адреса по-прежнему показывают первую строку как src.
Чтобы новые соединения конкретной программы уходили с дополнительной строки, привяжите локальный адрес внутри этой программы. У почты, обратного прокси и клиентов API обычно есть bind или interface. Впишите туда выбранную строку. Следующая команда только проверяет путь. Она предполагает, что источник уже дополнительная строка, и спрашивает, достижим ли ещё шлюз по умолчанию. Системное значение она не меняет и привязку в программе не заменяет.
ip route get 192.0.2.1 from 203.0.113.21
Адрес после from замените проверяемой строкой. Тогда src — эта строка. Без from src должен остаться первой строкой.
Политика маршрутизации обрабатывает пакеты, источник которых уже дополнительная строка. Если программа эту строку не привязывает, правило не срабатывает, и новые соединения продолжают уходить с первой строки. После привязки, если выходной шлюз неверный, отправьте этот источник в отдельную таблицу. Шлюз и устройство скопируйте из ip route show default. Маршрут по умолчанию основной таблицы не трогайте.
ip rule add from 203.0.113.21 table 121
ip route add default via 203.0.113.1 dev eno1 src 203.0.113.21 table 121
Таблица 121 совпадает только с пакетами, у которых источник уже 203.0.113.21. Остальные программы остаются в основной таблице и уходят с первой строки. Обе строки запишите в конфигурацию загрузки. Иначе после перезагрузки правила исчезнут, и программа, привязавшая дополнительную строку, потеряет прежний выход. Менять src основного маршрута по умолчанию на дополнительный адрес нельзя: сдвинется источник всех новых соединений машины, включая обновления.
В Windows дополнительный адрес с маской одного узла и SkipAsSource равным true тоже оставляет новые соединения на первой строке. Если программе нужно выходить с этой строки, задайте локальный адрес в программе или поставьте SkipAsSource в false и снова проверьте src. Второй шлюз по умолчанию на адаптер не добавляйте.
Почту, DNS и сертификаты проверяют отдельно
В почте два пути легче всего смешать. MX или запись A почтового имени может указывать на дополнительную строку, и процесс приёма может слушать её: входящая почта тогда приходит на эту строку. Новая отправка, которую машина открывает сама, по-прежнему показывает первую строку как источник, если почтовая программа не привязала локальный адрес.
Адрес в SPF должен совпадать с источником, который реально видит получатель. Если приём идёт на дополнительную строку, а отправка всё ещё с первой, в SPF пишите первую строку. Если отправка уже привязана к дополнительной строке, в SPF пишите её. Целый /29 не публикуйте.
Проверка идёт в таком порядке.
- 01 Число строк равно 1 плюс купленные дополнительные. После перезагрузки каждая строка всё ещё на интерфейсе.
- 02 Запись A каждого имени указывает на строку, куда оно должно приходить. Общие имена все указывают на первую строку.
- 03 Адрес прослушивания покрывает эту запись A. Программа, слушающая только первую строку, на остальные не отвечает.
- 04 Снаружи откройте порт службы этого имени и убедитесь, что запрос пришёл на ожидаемую строку.
- 05 На машине выполните ip route get 192.0.2.1 и убедитесь, что у непривязанного нового соединения src — первая строка. Программе с другим источником нужно самой привязать эту строку.
- 06 SSH или RDP по-прежнему используют первую строку. Не переносите управление так, чтобы оно слушало только дополнительный адрес: команда в консоли перестанет совпадать.
Сертификат следует за именем. На общей строке SNI выбирает сертификат на одном порту. На разных строках адрес прослушивания различен, а сертификат всё равно выбирается по имени визита. Перенос адреса не требует сертификата, имя которого — сам адрес.
Межсетевой экран открывает порты. Адрес может быть на интерфейсе, а запись A — указывать на него, но закрытый порт всё равно завершится по таймеру. Сначала закончите шесть проверок, потом смотрите экран. Когда все шесть сходятся, сайты либо делят первую строку по имени, либо занимают по строке из списка, а непривязанный исходящий трафик по-прежнему уходит с первой строки.
Сначала решить, как делить адреса, потом покупать число
От $454.8 / месяц