IPTables - порт на другой ip & порт (изнутри)


10

В настоящее время у меня есть устройство NAS, работающее под портом 80. Чтобы получить доступ к NAS извне, я назначил порт 8080 порту 80 на NAS следующим образом:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.32.25.2:80

Это работает как шарм. Однако это работает только в том случае, если я захожу на веб-сайт извне сети (на работе, в другом доме и т. Д.). Поэтому, когда я mywebsite.com:8080набираю, IPTables делает работу правильно, и все работает нормально.

Теперь у меня проблема, как я могу перенаправить этот порт изнутри сети? Мое доменное имя mywebsite.comуказывает на мой маршрутизатор (мой сервер Linux) изнутри (10.32.25.1), но я хочу перенаправить порт 8080 на порт 80 10.32.25.2 изнутри.

Любая подсказка?

Редактировать # 1

Пытаясь помочь облегчить этот вопрос, я составил эту схему. Пожалуйста, не стесняйтесь обновлять, если это неправильно или искажает то, что вы ищете.

                                 iptables
                                     |                   .---------------.
    .-,(  ),-.                       v               port 80             |
 .-(          )-.        port 8080________               |               |
(    internet    )------------>[_...__...°]------------->|      NAS      |
 '-(          ).-'     10.32.25.2    ^   10.32.25.1      |               |
     '-.( ).-'                       |                   |               |
                                     |                   '---------------'
                                     |
                                     |
                                   __  _ 
                                  [__]|=|
                                  /::/|_|

@slm Точно. Ничего не происходит на 10.32.25.2:8080, потому что сервер находится на порте 80. Снаружи NAT перенаправляет с порта 8080 на порт 80 на указанном IP (10.32.25.2). NET -> NAT: 8080 -> 10.32.25.2:80. Мне нужно правило изнутри, и я не знаю, что там поставить.
Дэвид Беланджер

@slm Да. Я не знаю, как я могу достичь чего-то подобного. Я хочу сказать, 10.32.25.1:8080перенаправить на 10.32.25.2:80. Мое правило выше работает снаружи, но не внутри моей сети. Поэтому, если я нахожусь в офисе, я могу получить доступ к своему NAS с сайта website.com:8080, и он полностью прозрачен. Из моего дома website.com:8080 указывает на 10.32.25.1, потому что это мой роутер или Linux-сервер. Я хочу перенаправить порт 8080 на NAS также на порт 80, но опять же прозрачным способом.
Дэвид Беланджер

@slm Да, все хорошо и работает. Я просто хочу перенаправить порт 10.32.25.1:8080 на 10.32.25.2:80 из внутренней сети.
Дэвид Беланджер

также упомяните интерфейс как eth0 10.32.25.2, чтобы мы могли писать iptables на основе входящего интерфейса
Рахул Патил

Оппс извините, я только что видел .. вы уже решили проблему ..
Рахул Патил

Ответы:


13

Я наконец нашел, как. Во-первых, я должен был добавить -i eth1свое «внешнее» правило (eth1 - это мое WAN-соединение). Мне также нужно было добавить еще два правила. Вот, в конце концов, что я пришел с:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A POSTROUTING -p tcp -d 10.32.25.2 --dport 80 -j MASQUERADE

2
Второе правило не является необходимым, поскольку первое правило уже содержит это ...
machineaddict

1
Первое правило ограничивает предварительную маршрутизацию, только если она поступает на интерфейс eth1. Второе правило является более общим, поскольку оно применяется ко всем интерфейсам. Остерегайтесь петель!
Tu-Reinstate Моника-Дор Дух

4

Вы также забыли упомянуть, что перенаправление пакетов должно быть включено, чтобы иметь возможность выполнять NAT назначения. По умолчанию он обычно выключен, поэтому правила iptables работать не будут. Это может быть включено путем выдачи:

echo 1 > /proc/sys/net/ipv4/ip_forward

Огромное спасибо за это, я бы тянула свои волосы часами!
ColinM

3

Сначала разрешите пересылку с

echo 1 > /proc/sys/net/ipv4/ip_forward

Затем установите приемлемые правила с

IF=eth1
PORT_FROM=8080
PORT_TO=80
DEST=10.32.25.2
iptables -t nat -A PREROUTING -i $IF -p tcp --dport $PORT_FROM -j DNAT --to $DEST:$PORT_TO
iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport $PORT_TO -j MASQUERADE

Вы можете поместить эти строки, /etc/rc.localнапример. Примечание: поскольку Debian jessie сделал его исполняемым и включил службу rc.local через

systemctl enable rc-local.service

0

Сначала вам нужно убедиться, что у вас активирована переадресация:

cat /proc/sys/net/ipv4/ip_forward

Если нет 1, беги echo 1 > /proc/sys/net/ipv4/ip_forward.

Если вы хотите, чтобы трафик с 10.32.25.1 через порты 80 и 443 переадресовывался в порт 80.32.25.2, то вам следует воспользоваться приведенным ниже правилом:

iptables -t nat -A PREROUTING -d 10.32.25.1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.32.25.2:80
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.