LINUX.ORG.RU
ФорумAdmin

Как сделать форвардинг портов, когда используются два интерфейса?

 


0

1

Доброго времени суток, уважаемые форумчане.

Есть следующая проблема. У меня сервер на дебиане с двумя интерфейсами - wan и lan(192.168.0.1). На lan:80 у меня висит сайт, который должен быть доступен в локальной сети. Также мне нужно, чтобы этот сайт был доступен на wan:777. Вот мои настройки:

iptables -A INPUT -i $LAN -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 777 -j DNAT --to-destination 192.168.0.1:80
iptables -A FORWARD -p tcp -d 192.168.0.1 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Однако, мое решение не работает. Оно работает только тогда, когда я убираю -i $LAN у INPUT. Я имею ввиду работает так:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 777 -j DNAT --to-destination 192.168.0.1:80
iptables -A FORWARD -p tcp -d 192.168.0.1 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Однако, этот вариант мне не подходит, так как в этом случае сайт также доступен на wan:80, а это не то, что я хочу. Подскажите, пожалуйста, как это исправить.

Я также задал этот вопрос на SuperUser



Последнее исправление: pashak (всего исправлений: 1)
Ответ на: комментарий от Spoofing

Нет, этот вариант не подходит. Во-первых, я использую GlassFish, а во-вторых, мне нужно общее решение, не только для веб-серверов.

pashak
() автор топика
Ответ на: комментарий от pashak

nginx это прокси-сервер который может слушать любой порт на любом интерфейсе, включая обработку SSL-соединений, а затем проксировать трафик дальше на другой, абсолютно не имеющий к вебу отношение сервис. в интернете можно посмотреть, как nginx выступает фронтом перед всякими DNS серверами, SMTP и прочая. nginx это не про веб. вернее, не только про веб.

Spoofing ★★★★★
()
Ответ на: комментарий от Spoofing

Я понял, спасибо. Буду рассматривать nginx как решение. Но вначале, хотелось бы попробовать найти решение на чистом iptables, если возможно, конечно.

pashak
() автор топика

Например так
iptables -t mangle -A PREROUTING -i $WAN -p tcp --dport 777 -j MARK --set-mark 0x1234
iptables -t nat -A PREROUTING -p tcp -i $WAN --dport 777 -j DNAT --to-destination 192.168.0.1:80
iptables -A INPUT -m mark --mark 0x1234 -j ACCEPT # Это правило должно быть до запрещающих в цепочке INPUT

anc ★★★★★
()
Ответ на: комментарий от anc

Правильно ли я понял ваше решение? Вы предлагаете помечать маркировкой пакеты, которые приходят на wan:777, а потом на input разрешать пакеты, которые имеют такую маркировку?

pashak
() автор топика
Ответ на: комментарий от anc

А пакеты маркируются только локально? Я имею ввиду пакет не может прийти с маркировкой из интернета?

pashak
() автор топика
Ответ на: комментарий от pashak

Это исключительно для прохождении в ядре, читай локально. Сам пакет не модифицируется. Там нет такой «особенности». :)

anc ★★★★★
()
Ответ на: комментарий от anc

Спасибо большое и за решение и за объяснение. Это супер хитрое решение! Если вы зарегистрированы на SuperUser, то можете разместить решение там, я передавам вам все баунти. Если нет, то скажите, пожалуйста, размещу сам - пусть и другие пользуются.

pashak
() автор топика
Ответ на: комментарий от pashak

Если вы зарегистрированы на SuperUser

Нет, не зарегистрирован. Размещайте сами.

anc ★★★★★
()
Ответ на: комментарий от anc

Похожая проблема

Нужно прокинуть порт для настройки IP-камеры. Буквально две недели назад прокидывал порты вот таким образом:

iptables -t nat -A PREROUTING -i enp1s11 -d 193.193.22.33 -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.0.2:80

iptables -A FORWARD -d 192.168.0.2 -p tcp --dport 80 -j ACCEPT

и все работало!!! Сейчас же, не понятно по какой причине, такая схема не работает. В настройках iptables ничего не менял, убрал с iptables почти все правила и фильтры, опробовал кучу разных вариантов - ничего не получается. Кто может подсказать, может дело не в iptables, наверное что-то еще упускаю… Недавно было обновление системы, возможно в связи с этим с проблемы? Буду благодарен любой подсказке, третий день пытаюсь понять в чем дело…

OS Ubuntu 18.04

iptables-save под спойлером. (Спойлер что-то не получилось сделать)


*mangle

:PREROUTING ACCEPT [264378:193158009]

:INPUT ACCEPT [126118:125488146]

:FORWARD ACCEPT [138260:67669863]

:OUTPUT ACCEPT [1613:208603]

:POSTROUTING ACCEPT [139875:67878530]

COMMIT

*nat

:PREROUTING ACCEPT [886:109004]

:INPUT ACCEPT [580:51133]

:OUTPUT ACCEPT [25:6994]

:POSTROUTING ACCEPT [25:6994]

-A PREROUTING -d 193.193.22.33/32 -i enp1s11 -p tcp -m tcp –dport 8088 -j DNAT –to-destination 192.168.0.2:80

-A POSTROUTING -s 192.168.0.0/24 -o enp1s11 -j MASQUERADE

-A POSTROUTING -s 10.0.0.0/24 -o enp1s11 -j MASQUERADE

-A POSTROUTING -s 10.0.0.0/24 -o enp1s10 -j MASQUERADE

COMMIT

*filter

:INPUT ACCEPT [126098:125470255]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [1610:208195]

-A FORWARD -d 192.168.0.2/32 -p tcp -m tcp –dport 80 -j ACCEPT

-A FORWARD -i enp1s11 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -i enp1s10 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -i tun0 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -i enp1s10 -o enp1s11 -m iprange –src-range 192.168.0.1-192.168.0.5 -j ACCEPT

-A FORWARD -i enp1s10 -o enp1s11 -m iprange –src-range 192.168.0.9-192.168.0.20 -j ACCEPT

-A FORWARD -i enp1s10 -o enp1s11 -m iprange –src-range 192.168.0.30-192.168.0.35 -j ACCEPT

-A FORWARD -i enp1s10 -o enp1s11 -m iprange –src-range 192.168.0.102-192.168.0.106 -j ACCEPT

-A FORWARD -s 192.168.0.110/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.111/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.113/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.114/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.115/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.117/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.130/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.131/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.191/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.192/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.195/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.196/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.193/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.250/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.252/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -s 192.168.0.253/32 -i enp1s10 -o enp1s11 -j ACCEPT

-A FORWARD -i tun0 -o enp1s11 -m iprange –src-range 10.0.0.1-10.0.0.20 -j ACCEPT

-A FORWARD -i tun0 -o enp1s10 -m iprange –src-range 10.0.0.1-10.0.0.20 -j ACCEPT


VladV
()
Последнее исправление: VladV (всего исправлений: 1)
Ответ на: Похожая проблема от VladV

1. Смотрите tcpdump, пакеты на 192.168.0.2:80 улетают? Если да то прилетает ли ответ от камеры?
2. А в локалке камера отвечает?

anc ★★★★★
()
Ответ на: комментарий от VladV

Спасибо большое anc за направление, нашел в чем была проблема и удалось ее решить следющим образом:

----------------

iptables -t nat -A PREROUTING -i $EXT_ETH -d $EXT_IP -p tcp -m tcp --dport $PORT_SRC -j DNAT --to-destination $IP_DST:$PORT_DST

iptables -A FORWARD -d $IP_DST -p tcp --dport $PORT_DST -j ACCEPT

iptables -t nat -A POSTROUTING -o $INT_ETH -p tcp --dport $PORT_DST -d $IP_DST -j MASQUERADE

где EXT_ETH - внешний интерфейс,

INT_ETH - внутренний интерфейс,

PORT_SRC - порт внешний,

PORT_DST - порт внутренний

IP_DST - IP локального оборудования

EXT_IP - IP внешний

----------------

Но появилась новая проблемма, может еще раз дадите совет, сам что-то не могу понять где ошибка.

Если пытаюсь зайти на эту камеру EXT_IP:PORT_SRC, не из локальной сети, допустим через мобильный интернет, все четко работает, но если пытаюсь зайти находясь внутри сети - ничего не получается. Т.е. если я внутри сети набираю внешний адрес и порт, то на этот порт ничего не приходит, хотя внутренний интерфейс, который смотрит в локальную сеть, получает пакеты. При этом, если, находясь внутри сети набрать внешний адрес и порт 80, то веб-сервер отвечает, но веб-сервер установлен на той же машине, что и шлюз и не требует переадресации... Уже голова закипает, как понять-то из-за чего пакет не приходит на внешний интерфейс?

VladV
()
Ответ на: комментарий от anc

ИМХО, проще в ″-t mangle″ рубить ″-i $WAN --dport 80″.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.