Вопрос или проблема
У меня есть маршрутизатор – G, настольный компьютер – D, ноутбук – L. Я хочу подключить L к интернету через D.
G на 192.168.1.1
D: enp1s0 – 192.168.1.2/24, gw G,
eno1 – 10.0.0.1/16, выступает в роли маршрутизатора для L
L:
enp1s0 – 10.0.0.2, gw 10.0.0.1. Маршрутизирующие таблицы на L:
netstat -nr
Маршрутная таблица ядра IP
Назначение Шлюз Маска Флаги MSS Окно irtt Интерфейс
0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 enp1s0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
Перенаправление пакетов на D включено:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Однако L не подключается к интернету:
traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.0.0.1 (10.0.0.1) 0.346 ms 0.339 ms *
2 10.0.0.1 (10.0.0.1) 0.370 ms !X * *
Очевидно, что пакеты L могут достигать D, но не могут пройти дальше.
Однако L подключается, когда я включаю маскарадинг на D:
firewall-cmd --zone=public --add-masquerade=yes
успех
Можете объяснить, почему L подключается к интернету только когда маскарадинг на интерфейсе D (который соединен с L напрямую) включен?
Причина, по которой вам нужен MASQUERADE, заключается в том, как работает NAT.
Рассмотрите ваш маршрутизатор, G. Он получает IP-адрес от провайдера интернет-услуг. Этот IP-адрес — это то, что все системы за маршрутизатором используют для выхода в интернет, так что все системы маскируются под этот IP-адрес. (Так работают маршрутизаторы в основных домашних настройках).
Ваш компьютер D, выступая в качестве шлюза NAT для вашего ноутбука L, подчинен тем же правилам работы интернета. В идеале у вас должно быть как минимум один внутренний IP-адрес, и когда он запрашивает ресурс, отличный от других компьютеров в этой подсети, ему требуется возможность маскировать пакеты от L как внутренний IP-адрес D, чтобы правильно маршрутизировать пакеты через G.
То же самое происходит при использовании компьютера в качестве VPN-сервера; для выхода в остальную сеть или, в частности, во внешнюю сеть, вам необходимо маскировать IP-адрес этого сервера.
Это просто то, как работает NAT. То же самое относится к прокси и т. д.
Ответ или решение
Почему не работает без маскарадинга в сетях NAT
В данном сценарии множество компонентов сети взаимосвязаны, и их правильная конфигурация критически важна для обеспечения доступа в интернет. Рассмотрим более подробно, почему клиент, подключенный к D (ноутбук L), не может выйти в интернет без использования функции маскарадинга на D.
Основные элементы конфигурации сети
-
Сетевые интерфейсы:
- G (роутер): локальный адрес 192.168.1.1.
- D (рабочий компьютер): с двумя интерфейсами:
enp1s0
(192.168.1.2/24) — подключение к роутеру G.eno1
(10.0.0.1/16) — интерфейс, через который D выполняет маршрутизацию для L.
- L (ноутбук): настроен с IP-адресом 10.0.0.2 и шлюзом 10.0.0.1.
-
Маршрутизация:
- Как видно из таблицы маршрутизации на L, он знает, что для доступа к ресурсам за пределами своей подсети (10.0.0.0/24) ему нужно использовать шлюз 10.0.0.1, то есть D.
-
Пересылка пакетов:
- На D включена пересылка пакетов (
sysctl net.ipv4.ip_forward = 1
), что позволяет D пересылать пакеты от L к G и обратно.
- На D включена пересылка пакетов (
Проблема доступа к интернету
Когда L пытается получить доступ к интернет-адресу (например, 8.8.8.8), его пакеты достигают D, так как D выполняет функции маршрутизатора. Однако через D пакеты не могут выйти через G в интернет, и это связано с концепцией NAT (Network Address Translation) и маскарадингом.
-
Суть NAT:
- Когда внутренние устройства (например, L) пытаются подключиться к интернету, они отправляют свои пакеты в G, который, в свою очередь, использует свой внешний IP-адрес для общения с интернетом. Это значит, что все устройства в локальной сети выглядят за пределами сети как единое устройство — роутер G.
-
Необходимость маскарадинга:
- Без маскарадинга на D, когда L отправляет пакеты на URL-адрес в интернете, D не изменяет исходный IP-адрес пакета (10.0.0.2) на свой собственный IP-адрес (192.168.1.2). Вместо этого пакет уходит "как есть" и G не знает, куда приписать ответ, так как он не знает, что делать с пакетом, пришедшим с внутреннего адреса 10.0.0.2. Это приводит к тому, что G блокирует такие пакеты или игнорирует их, потому что они не соответствуют внутренним правилам NAT для выходящих соединений.
-
Активизация маскарадинга:
- При включении маскарадинга с помощью команды
firewall-cmd --zone=public --add-masquerade=yes
, все исходящие пакеты от L (и других устройств в сети) получают замененный IP-адрес — D. Теперь G видит пакет как исходящий из 192.168.1.2, и может корректно направить ответ обратно на D, который затем пересылает ответ L.
- При включении маскарадинга с помощью команды
Заключение
Таким образом, использование маскарадинга необходимо для корректной работы NAT. Это стандартная практика для маршрутизации трафика из частной сети в публичное пространство. Чтобы L мог установить соединение с интернетом, пакет должен быть "замаскирован", и на выходе должен быть виден только IP-адрес роутера G. Без выполнения этой операции, интернет-трафик остаётся недоступным для устройства L.
Надеюсь, данное объяснение проясняет важность маскарадинга в сетях NAT и его роль в обеспечении бесшовной связи между локальными устройствами и глобальной сетью.