Назначение IP маскировки в том, чтобы позволить машинам в вашей сети с частными, не маршрутизируемыми IP-адресами, иметь доступ в Интернет через машину, осуществляющую маскировку. Трафик из вашей сети, предназначенный для Интернета, должен быть обработан так, чтобы ответы могли вернуться обратно на машину, которая организовала запрос. Чтобы это сделать, ядро должно изменить IP-адрес источника в каждом пакете так, чтобы ответы возвращались на сервер, а не на частный IP-адрес (что невозможно в Интернете), с которого сделан запрос. Linux использует Connection Tracking (conntrack) для хранения записи о том, каким машинам принадлежат соединения, и перенаправляет каждый возвращенный пакет соответствующим образом. Таким образом, трафик, покидающий вашу сеть, "замаскирован", как будто исходит от машины, которая выполняет роль шлюза. В документации Microsoft этот процесс упоминается как технология Internet Connection Sharing.
Этого можно достичь с помощью простого правила в iptables, которое может слегка варьироваться в зависимости от настроек вашей сети:
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
В команде, приведенной выше, предполагается, что вы используете закрытое адресное пространство 192.168.0.0/16, а подключение к Интернет обеспечено через устройство ppp0. Данный синтаксис может быть объяснен так:
-t nat -- правило, для обращения к таблице NAT
-A POSTROUTING -- правило, добавлямое (-A) к цепочке POSTROUTING
-s 192.168.0.0/16 -- правило применяется для трафика, происходящего из обозначенного адресного пространства
-o ppp0 -- правило применяется к трафику, который планируется направить через определенное сетевое устройство
-j MASQUERADE -- трафик попадающий под данное правило должен быть перенаправлен "jump" (-j) с маскировкой (MASQUERADE) для обработки, как описано выше
Любая цепочка правил в таблице фильтрации (это основная таблица, где происходит обработка большинства пакетов) имеет в качестве политики (policy) по умолчанию правило ACCEPT (принимать), но если вы создаете межсетевой экран в дополнение к устройству шлюза, вы можете настроить политики на использование правил DROP (пропустить) или REJECT (отклонить), в этом случае (для работы правила, описанного выше) необходимо разрешить прохождение вашего маскированного трафика через цепочку FORWARD (перенаправить):
sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT
Эти команды разрешают все соединения из вашей локальной сети в Интернет, а также позволяют всему трафику, относящемуся к этим соединениям, возвращаться на машины их инициировавшие.