Я должен установить правила iptables, которые будут изменять все исходные адреса исходящих пакетов на общедоступный IP-адрес маршрутизатора и перенаправлять все входящие пакеты с портом назначения 80 на одну из машин, где находится веб-сервер. Это задание из университета, и у меня уже есть ответы на это, но они несколько противоречивы. Один набор ответов берется из книги, откуда взялась эта задача (поэтому она действительно должна быть правильной), а другая - от учителя. Итак, в книге говорится, что это должно быть сделано таким образом (eth0 - это общедоступный интерфейс с общедоступным IP-адресом, а eth1 - это интерфейс, подключенный к локальной сети - картинка для лучшего восприятия):

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source IPX
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-
destination IP1:80

и мой учитель считает, что это правильные ответы:

iptables -t nat -A POSTROUTING -i eth1 -j SNAT --to-source IPX
iptables -t nat -A PREROUTING -p -o eth1 tcp --dport 80 -j DNAT --to-\ 
destination IP1:80

Как видите, разница в выбранных интерфейсах. Из того, что я понимаю, параметры -i и -o позволяют различать исходящие и входящие "подынтерфейсы" в одном интерфейсе.

Итак, первое правило в ответе моей книги гласит, что для всех пакетов, предназначенных для отправки через интерфейс eth0, должен быть изменен исходный IP-адрес на публичный IP-адрес маршрутизатора. Мой учитель говорит, что для всех пакетов, которые поступают на локальный интерфейс маршрутизатора, адрес источника должен быть изменен на публичный IP-адрес маршрутизатора.

Во втором правиле книга говорит, что все пакеты, поступающие на входной "подинтерфейс" eth0, предназначенные для порта 80, должны изменить свой адрес назначения, и мой учитель говорит, что у всех пакетов, выходящих из eth1, должен быть изменен их адрес.

Какой набор ответов является правильным? Для меня они оба выглядят правильно, они просто подходят к проблеме с разных сторон, но после некоторого исследования я обнаружил, что большинство руководств в Интернете придерживаются подхода книги, и вполне возможно, что мой учитель мог ошибиться, поэтому я не знаю, какие именно один действительно правильно. Я был бы очень благодарен за быстрый ответ, потому что у меня есть тест по этому предмету через два дня.

1 ответ1

2

Итак, первое правило в ответе моей книги гласит, что для всех пакетов, предназначенных для отправки через интерфейс eth0, должен быть изменен исходный IP-адрес на публичный IP-адрес маршрутизатора. Мой учитель говорит, что для всех пакетов, которые поступают на локальный интерфейс маршрутизатора, адрес источника должен быть изменен на публичный IP-адрес маршрутизатора.

Для простого маршрутизатора с двумя интерфейсами ни то, ни другое не так.

Но если бы у маршрутизатора было несколько "внутренних" интерфейсов (скажем, eth1, eth2, eth3), решение книги было бы более правильным. Решение учителя будет без необходимости SNAT весь внутренний трафик, то есть пакеты из одной внутренней подсети в другую.

Во втором правиле книга говорит, что все пакеты, поступающие на входной "подинтерфейс" eth0, предназначенные для порта 80, должны изменить свой адрес назначения, и мой учитель говорит, что у всех пакетов, выходящих из eth1, должен быть изменен их адрес.

Если я правильно помню, исходящий интерфейс еще не определен на этапе предварительной маршрутизации (отсюда и название «предварительная маршрутизация»), поэтому вы не можете сопоставить с -o вообще. Таким образом, правило учителя даже не будет принято iptables. Но мне придется проверить ...

Во-вторых, опять же, если бы у маршрутизатора было несколько локальных сетей, вы бы не хотели, чтобы DNAT (переадресация портов) применялась к внутреннему трафику. (Представьте, что хост на eth2 пытается подключиться к HTTP-серверу на eth1 - вы не хотите, чтобы маршрутизатор случайно перенаправил его в другое место ...) Так что, если нет проверки -i , должна быть как минимум проверка -d адреса назначения, чтобы избежать этого.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .