Postrouting and IP Masquerading in Linux
IPTables is responsible to handle packet filtering in Linux system. IPTables contains several predefined and/or user-defined tables. Each table contains chains and chain contain packet rules. IPTables uses NAT table to forward packets to another node.
What is POSTROUTING?
A Postrouting chain in NAT table means altering the IP packet after the routing is completed. Logically, a postrouting can be used to change the Source Address. As the routing is completed and destination has his own address, the only unknown address that can be masked is the Source. This is why postrouting is used for SNAT.
What is IP MASQUERADING?
Now, when a packet leaves the local network and tries to travel the public network, it will fail to traverse if it keeps using the local details. This is where IP Masquerading plays the role. IP Masquerading is masking the packet with identity of the external interface.
How POSTROUTING and MASQUERADING relates?
When a packet arrives to the local gateway that has external interface, masks the packet with IP Masquerading and send it through the public interface. That says, packet has to be routed first before mangling it for Masquerading. That is why, you need to apply the Masquerading target on the Postrouting chain of the NAT table.
How to setup Masquerading in Linux Firewall?
The following command will enable IP Masquerading in Linux Firewall:
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
The above rule will use NAT table (-t nat) on built-in Postrouting Chain (-A POSTROUTING) on interface eth0 (-o eth0).
The target Masquerade (-j MASQUERADE) advises to mask the above matched IP packets from the related table to external interface of the system.
Thus the above, would allow the local networks to gain access to external network through IP Masquerading.
Leave a Reply Cancel reply
This site uses Akismet to reduce spam. Learn how your comment data is processed.
Источник
What is masquerade in linux
Автор оригинала Иван Н. Песин. Но так как статья морально устарела, то она будет взята лишь за основу. (Претензии автора принимаются).
Маскарадинг (masquerading) и трансляции ip-адресов (NAT)
Проблема маскарада (masquerading) и трансляции ip-адресов в Линуксе.
Что это такое,что там можно и что нельзя.
Каждому Linux админу рано или поздно приходится сталкиваться с проблемой маскарада (masquerading) и трансляции ip-адресов на Линуксе (кроме тех у кого есть куча реальных адресов и они раздают их всем компам в локальной сети :-)). Если у Вас есть локальная сеть, подключенная к сети Интернет через linux сервер, то без маскарада не обойтись.
Начнем, пожалуй, с определений.
- Маскарад (masquerade) и трансляция адресов (NAT) в мире Linux не являются синонимами.
- Маскарад — замена адреса на адрес машины, выполняющей маскарад.
- Трансляция адресов — замена адреса на любой указанный.
Если вы используете ОС Linux с ядром 2.0 или 2.2, Вам нужно будет опустить глаза
вниз — в конце этой статьи находится авторское описание настроек ipfwadm и ipchains.
Я же опишу настройку NAT, masquerading для ОС Linux с ядром 2.4- 2.6, где используются
iptables. Для чего это вообще нужно? Вы имеете сеть с адресами:
10.0.0.0-10.255.255.255 — сеть класса А
172.16.0.0 — 172.31.255.255 — сеть класса B
192.168.0.0-192.168.255.255 — сеть класса С
Эти сети зарезервированы для использования в локальных сетях (intranet) и в сети
Интернет не используются. Допустим ваш компьютер в локальной сети с ip 192.168.0.2
получает доступ к Интернет через сервер с внутренним ip адресом 192.168.0.1 (eth1)
и внешним адресом 111.111.111.111 (eth0). Если пакет с вашего компьютера будет иметь
ваш адрес источника (192.168.0.2), то он просто не придет обратно, так как
удаленный хост не будет знать по какому маршруту отослать его обратно.
Для того, чтобы этого не случилось и придуманы NAT и masquerading.
Итак как работает маскарад.
Ваш пакет (например на www.ibm.com) проходит через сервер и в нем сервер меняет
адрес источника НА СВОЙ АДРЕС, через который как раз и раздается интернет в локальной
сети (111.111.111.111). Пакет приходит на www.ibm.com и хост отвечает по адресу
в пакете (111.111.111.111). Так как Ваш сервер запомнил, что пакет для www.ibm.com
посылали вы, то он принимает пакет и отдает его вашему компьютеру. Вот и все, пакет
ушел и вернулся.
Включается маскарад в iptables очень просто:
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
из локальной сети 192.168.0.0/24)
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
в локальную сеть 192.168.0.0/24)
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
(и последняя команда — ей вы включили маскарад для сети 192.168.0.0/24).
Еще вам нужно проверить чтобы был включен forward ip в вашем ядре. Сделать это
можно командой
если Вы получили 1 на выходе значит все в порядке, если 0, тогда вам нужно
включить ip forward командой
echo 1 >/proc/sys/net/ipv4/ip_forward
Как работает NAT ?
Ваш пакет (например на www.ibm.com) проходит через сервер и в нем адрес источника
меняется НА УКАЗАННЫЙ АДРЕС (мы же укажем адрес сервера 111.111.111.111, и тогда).
Пакет приходит на www.ibm.com и хост отвечает по адресу в пакете (111.111.111.111).
Пакет приходит на Ваш сервер и происходит обратная замена.
Включается NAT в iptables так:
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
из локальной сети 192.168.0.0/24)
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
(этой командой вы разрешили прохождение пакетов между сетевыми интерфейсами
в локальную сеть 192.168.0.0/24)
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT —to-source 111.111.111.111
(и последняя команда — ей вы включили трансляцию адресов сети 192.168.0.0/24
на адрес 111.111.111.111).
Еще вам нужно проверить чтобы был включен forward ip в вашем ядре. Сделать это
можно командой
если Вы получили 1 на выходе значит все в порядке, если 0, тогда вам нужно
включить ip forward командой
echo 1 >/proc/sys/net/ipv4/ip_forward
Вот собственно и все.
Дальше идет статья Ивана Песина
Решение проблемы маскарада, на ядрах разных версий отличается, и потому
мы разделим нашу повесть на две части, ядра версии от, если не ошибаюсь,
2.0.29 до 2.2.9ас, и от 2.2.10 до 2.4.0. Ядра версии 2.4.х я обсуждать не буду,
потому как там имеется вполне сносное описание. Итак,
Ядра версий 2.0.29 — 2.2.9
Для функции маскарада в этих версиях необходим пакет ipfwadm либо ipchains,
зависит от версии. Установив их можно приступать к осмысленным действиям.
Очень тривиальная задача решается следующим образом:
ipchains -A forward -i ethX -s 192.168.1.0/24 -j MASQ
результатом этой команды будет замена исходных адресов пакетов из сети
192.168.1.0 класса С, при маршрутизации их через интерфейс ethX, на адрес машины
на которой выполнены команды.
Перейдем теперь к более сложным случаям. Допустим, вам необходимо, в зависимости
от адреса источника/назначения маскарадить под разными адресами. Как же это выполнить?
Тут нам придется обратиться к нестандартным средствам.
Для начала посмотрим урл
Хотя там написано не очень много, зато содержательно. После прочтения остается лишь
вытащить соответствующий архив с программой и патчем ядра. Пропатчив ядро, его надо
перекомпилировать (прочитать почитайки обязательно!) с соответствующими изменениями
в конфигурации. Устанавливаем скомпилированное ядро, при этом не забываем про «ядро
на всякий случай» (рабочее ядро, которое вы будете загружать, если новое ядро
не загрузится). После перезагрузки станет возможным использование команды ipnatadm.
Название говорит само за себя ;). Теперь легко можно изобразить команды вроде:
ipnatadm -O -i -b -S 192.168.1.1/24 -M 207.46.230.219
ipnatadm -O -i -b -S 192.168.1.2/24 -M 207.46.230.229
ну и так далее, думаю, разобраться можно. Есть еще полезная опция -W, позволяющая
задавать интерфейс. Да, не забудьте, что псевдонимы интерфейсов не понимаются ни
ipchains, ни ipfwadm, ни ipnatadm. Перейдем теперь к теме
Ядра версий 2.2.10 — 2.4.0
На этих версиях, к сожаленью, программа ipnatadm предательски перестает функционировать.
Почему предательски? Потому что удается пропатчить ядро, скомпилировать, загрузиться
и даже приконнектиться с помощью telnet, например. Но при попытке выполнить, допустим,
даже вышеописанные команды, интерфейс подвисает. Ну что ж, значит нужно искать другие
ходы.
Внимательно прочитав информацию, размещенную на сайте с ipnatadm, можно обнаружить
любопытный факт. А именно то, что один наш земляк Алексей Кузнецов, пишет часть ядра,
которая, в том числе, ведает маршрутизацией и маскарадом. Из этого прямо следует,
что функциональность этого кода огромна, а документация — м-да, хромает, мягко
выражаясь. Сам Кузнецов советует разбирать исходники ядра — для тех, кто сможет,
захочет, имеет время, и т.д. и т.п.
Ну а я попробую, насколько это возможно, сжато рассмотреть стандартный и нестандартные
методы маскарада, и NAT. Стандартный случай: необходимо маскарадить исходящие пакеты
хоста 192.168.1.1 в 207.46.230.219. Подход к решению этой задачи полностью аналогичен
случаю с более ранними ядрами. Необходимо лишь учесть, что в системах с этими ядрами
утилиты ipfwadm нет, вместо нее используется ipchains. Сразу перейдем к рассмотрению
более сложных случаев. Допустим, как и в предыдущем примере, пакеты с разных машин,
необходимо транслировать в разные адреса.
Тут придется прибегнуть к утилите ip из пакета iproute. Изобразим следующие команды:
ip rule add from 192.168.1.1 nat 207.46.230.219
ip rule add from 192.168.1.2 nat 207.46.230.229
ip route add nat 207.46.230.219 via 192.168.1.1
ip route add nat 207.46.230.229 via 192.168.1.2
Результатом этих действий будет маскарад и демаскарад адресов 192.168.1.1
и 192.168.1.2, соответственно в 207.46.230.219 и 229.
Вот такие пирожки. Это все теория и стандартные случаи, давайте рассмотрим более
интересный и совсем реальный пример. Имеется сеть на
250 машин, линукс красная
шапочка версии 6.2, в роли маршрутизатора, и выполняющий маскарад внутренних машин
под адрес, допустим, 207.46.230.219. Линукс включен в машину провайдера витой парой,
из сетевой в сетевую. Кроме того, провайдер, естественно, не желает тратить отдельный
ip-адрес на сетевую в которую включен наш линукс.
Вопрос: как это реализовать на линуксе? Вообще-то весьма просто. Для начала объясним
линуксу, как посылать пакеты на машину провайдера. Она находиться не в одной
логической сети с нами, а потому изначально линукс не знает как туда попасть.
Для этого укажем:
route add -host 192.168.100.1 eth1
что означает: машина 192.168.100.1 подсоединена непосредственно к интерфейсу eth1.
Далее, укажем, что все пакеты, предназначенные для интернета отсылать через машину
провайдера:
route add default gw 192.168.100.1
и остается лишь прописать правила маскарада. Допустим, я хочу, что бы машины
с адресами 192.168.1.101-105 ходили в интернет, а другие нет:
ipchains -A forward -s 192.168.1.101 -j MASQ
ipchains -A forward -s 192.168.1.102 -j MASQ
ipchains -A forward -s 192.168.1.103 -j MASQ
ipchains -A forward -s 192.168.1.104 -j MASQ
ipchains -A forward -s 192.168.1.105 -j MASQ
Источник
What is MASQUERADE in the context of iptables?
In iptables many times I see the target MASQUERADE. What is that? I searched and found lots of things. But I need someone to explain to me what MASQUERADE is in an easy to understand way?
An example (taken from this answer) is:
3 Answers 3
It is an algorithm dependant on the iptables implementation that allows one to route traffic without disrupting the original traffic.
I use the masquerade algorithm when I want to create a virtual wifi adapter and share my wifi.
Im NOT talking about sharing Ethernet connection through your wifi, Im talking about sharing the wifi connection through your wifi via masquerading it to a virtual adapter. This in effect lets you share your wifi connection through wifi.
All those questions about «Connectify for linux» can be solved by implementing the MASQUERADE algo.
I HAVE NOT READ THE LAST LINK. But the following is an accurate excerpt/example.
I really dislike how search engines make the algorithm out to be some evil type of hack.. I use it merely so share my internet with my android phones.
MASQUERADE is an iptables target that can be used instead of SNAT target (source NAT) when external ip of the inet interface is not known at the moment of writing the rule (when server gets external ip dynamically).
After study of above answers, this is what caused me to understand:
Masquerading allows an entire network of internal IP addresses to operate through one external IP address and masquerading allows conversion from one protocol to another (wired/wireless).
When the MASQUERADE chain sends a datagram from a computer it.
- Takes note of the type of datagram it is, «TCP,» «UDP,» «ICMP,» etc. Note: An unknown might not work correctly through MASQUERADE.
- Modifies the datagram so that it looks like it was generated by the router machine itself (the one external address).
- Remembers that it has done so, recording the local source and external destination IPs.
- Transmits the datagram onto the Internet with the single external IP address.
Note: When the destination host receives this datagram, it believes the datagram has come from the one routing host and sends any reply datagrams back to that address.
When the Linux MASQUERADE chain receives a datagram from its Internet connection,
- It looks in its table of established masqueraded connections to see if this datagram actually belongs to a computer on the LAN.
- If it does, it reverses the modification it did on the forward path and transmits the datagram to the LAN computer.
The MASQUERADE chain is useful for internally creating and entire private IP address space, and for forwarding packets that would otherwise be incompatible.
The Ethernet, or wired protocol, assumes that the packet comes from the source and reports itself. The Wifi, or wireless protocol, assumes that the packet is being repeated and reports itself and the original source.
For this reason, Wifi and Ethernet cannot be directly bridged because they are incompatible. Masquerading causes the packets to be rebuilt and will thereby handle conversion between wired and wireless standards. Note: There are ways to cause your computer to accept the incompatibility internally and bridge, but without a full masquerade, the bridge spoof will be viewed externally as a security risk and those requests will be rejected.
Источник