"Oskar Andreasson. Iptables Tutorial 1.1.19 " - читать интересную книгу автора

будет перенаправлен траффик. Для этого после ip адреса через двоеточие
укажите порт, например -to-destination 192.168.1.1:80, а указание диапазона
портов выглядит так: -to-destination 192.168.1.1:80-100. Как вы можете
видеть, синтаксис действий DNAT и SNAT во многом схож. Не забывайте, что
указание портов допускается только при работе с протоколом TCP или UDP, при
наличии опции -protocol в критерии.

Действие DNAT достаточно сложно в использовании и требует
дополнительного пояснения. Рассмотрим простой пример. У нас есть WEB сервер
и мы хотим разрешить доступ к нему из Интернет. Мы имеем только один
реальный IP адрес, а WEB-сервер расположен в локальной сети. Реальный IP
адрес $INET_IP назначен брандмауэру, HTTP сервер имеет локальный адрес
$HTTP_IP и, наконец брандмауэр имеет локальный алрес $LAN_IP. Для начала
добавим простое правило в цепочку PREROUTING таблицы nat:
iptables -t nat -A PREROUTING -dst $INET_IP -p tcp -dport 80 -j DNAT
\ -to-destination $HTTP_IP
В соответствии с этим правилом, все пакеты, поступающие на 80-й порт
адреса $INET_IP перенаправляются на наш внутренний WEB-сервер. Если теперь
обратиться к WEB-серверу из Интернет, то все будет работать прекрасно. Но
что же произойдет, если попробовать соединиться с ним из локальной сети?
Соединение просто не установится. Давайте посмотрим как маршрутизируются
пакеты, идущие из Интернет на наш WEB-сервер. Для простоты изложения примем
адрес клиента в Интернет равным $EXT_BOX.
1. Пакет покидает клиентский узел с адресом $EXT_BOX и направляется на
$INET_IP
2. Пакет приходит на наш брандмауэр.
3. Брандмауэр, в соответствии с вышеприведенным правилом, подменяет
адрес назначения и передает его дальше, в другие цепочки.
4. Пакет передается на $HTTP_IP.
Пакет поступает на HTTP сервер и сервер передает ответ через
брандмауэр, если в таблице маршрутизации он обозначен как шлюз для $EXT_BOX.
Как правило, он назначается шлюзом по-умолчанию для HTTP сервера.
5. Брандмауэр производит обратную подстановку адреса в пакете, теперь
все выглядит так, как будто бы пакет был сформирован на брандмауэре.
6. Пакет передается клиенту $EXT_BOX.
7. А теперь посмотрим, что произойдет, если запрос посылается с узла,
расположенного в той же локальной сети. Для простоты изложения примем адрес
клиента в локальной сети равным $LAN_BOX.
1. Пакет покидает $LAN_BOX.
2. Поступает на брандмауэр.
3. Производится подстановка адреса назначения, однако адрес отправителя
не подменяется, т.е. исходный адрес остается в пакете без изменения.
4. Пакет покидает брандмауэр и отправляется на HTTP сервер.
5. HTTP сервер, готовясь к отправке ответа, обнаруживает, что клиент
находится в локальной сети (поскольку пакет запроса содержал оригинальный IP
адрес, который теперь превратился в адрес назначения) и поэтому отправляет
пакет непосредственно на $LAN_BOX.
6. Пакет поступает на $LAN_BOX. Клиент "путается", поскольку ответ
пришел не с того узла, на который отправлялся запрос. Поэтому клиент
"сбрасывает" пакет ответа и продолжает ждать "настоящий" ответ.