LINUX.ORG.RU
решено ФорумAdmin

Перехват портов хост машиной (Iptables)


0

1

Здравствуйте уважаемые! Прошу Вас помочь разобраться с моей бедой. Суть проблемы: Имеется хост машина на Ubuntu 10.04, она же шлюз для локальной сети, файрволл. На ней запустил в виртуалке KVM гостевую ОС Debian 7.01 (веб сервер) Хост машина имеет белый адрес Виртуалка имеет белый адрес из той же сети, но сам адрес другой. На хост машине сделан бридж на виртуальную от сетевого интерфейса с белым адресом. Долго бившись с непонятками, я понял одну вещь. Если на хост машине(шлюз для локалки) стоит проброс на какой-либо порт в локалку, и если этот же порт слушает виртуалка, то при обращении на адрес виртуалки, пакет уходит по правилам проброса в локалку. К примеру: Хост машина br0(внешний ифейс с белым адресом) ip 1.2.3.4 eth0 (ифейс смотрящий в локалку) 192.168.0.1 В iptables стоит проброс 80го порта с br0 на IP 192.168.0.2(веб сервер в локалке) Виртуалка: eth0 (с белым адресом) ip 1.2.3.40 lo ---------- При обращении браузером на 1.2.3.40:80(внешний адрес виртуалки) меня забрасывает на веб сервер в локалке 192.168.0.2:80 взаместо веб сервера который стоит на виртуалке. Если пробросы портов на хост машине убрать, то все работает как и должно быть.

Как такое вообще может быть? Что за бред? Если такую же схему строить на виндовом VirtualBOX то порты хост машины никак не пересекаются с виртуалкой.

Ниже привожу конфиг iptables хост машины:

# Generated by iptables-save v1.4.4 on Fri Aug 16 08:40:43 2013
*mangle
:PREROUTING ACCEPT [75620532:66002994766]
:INPUT ACCEPT [20401451:18477124151]
:FORWARD ACCEPT [55223344:47526163646]
:OUTPUT ACCEPT [18903639:10772374931]
:POSTROUTING ACCEPT [74203747:58304927631]
COMMIT
# Completed on Fri Aug 16 08:40:43 2013
# Generated by iptables-save v1.4.4 on Fri Aug 16 08:40:43 2013
*filter
:INPUT ACCEPT [20401451:18477124151]
:FORWARD ACCEPT [55223344:47526163646]
:OUTPUT ACCEPT [18903554:10772364375]
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Aug 16 08:40:43 2013
# Generated by iptables-save v1.4.4 on Fri Aug 16 08:40:43 2013
*nat
:PREROUTING ACCEPT [722811:50066135]
:POSTROUTING ACCEPT [358360:25818346]
:OUTPUT ACCEPT [454848:36812591]
-A PREROUTING -i br0 -p tcp -m tcp --dport 1723 -j DNAT --to-destination 192.168.0.253
-A PREROUTING -i br0 -p tcp -m tcp --dport 5222 -j DNAT --to-destination 192.168.0.252
-A PREROUTING -i br0 -p tcp -m tcp --dport 5269 -j DNAT --to-destination 192.168.0.252
-A PREROUTING -i br0 -p gre -j DNAT --to-destination 192.168.0.253
-A PREROUTING -s XX.XXX.XXX.XX/32 -i br0 -p tcp -m tcp --dport 5060 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s XX.XXX.XXX.XX/32 -i br0 -p udp -m udp --dport 5060 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s XX.XXX.XXX.XX/32 -i br0 -p udp -m udp --dport 9000:20000 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s YYY.YY.YY.Y/32 -i br0 -p udp -m udp --dport 9000:20000 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s YYY.YY.YY.Y/32 -i br0 -p udp -m udp --dport 5060 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s YYY.YY.YY.Y/32 -i br0 -p tcp -m tcp --dport 5060 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -i br0 -p tcp -m tcp --dport 3001 -j DNAT --to-destination 192.168.0.13
-A PREROUTING -i br0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.0.252
-A PREROUTING -i br0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.0.252
-A PREROUTING -i br0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.252
-A PREROUTING -s XY.YY.XXX.46/32 -i br0 -p tcp -m tcp --dport 4569 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s XY.YY.XXX.46/32 -i br0 -p udp -m udp --dport 4569 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s ZZ.XYZ.YY.150/32 -i br0 -p tcp -m tcp --dport 4569 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s ZZ.XYZ.YY.150/32 -i br0 -p udp -m udp --dport 4569 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s AA.BB.CC.29/32 -i br0 -p tcp -m tcp --dport 4569 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s AA.BB.CC.29/32 -i br0 -p udp -m udp --dport 4569 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s DD.FFF.XXX.6/32 -i br0 -p tcp -m tcp --dport 5060 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s DD.FFF.XXX.6/32 -i br0 -p udp -m udp --dport 5060 -j DNAT --to-destination 192.168.0.216
-A PREROUTING -s DD.FFF.XXX.6/32 -i br0 -p udp -m udp --dport 9000:20000 -j DNAT --to-destination 192.168.0.216
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
-A POSTROUTING -s 192.168.5.0/24 -j MASQUERADE
COMMIT
# Completed on Fri Aug 16 08:40:43 2013

Ifconfig

br0       Link encap:Ethernet  HWaddr 78:e3:b5:fc:5f:f7
          inet addr:XX.YY.ZZ.253  Bcast:XX.YY.ZZ.255  Mask:255.255.255.0
          inet6 addr: fe80::7ae3:b5ff:fefc:5ff7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44576133 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41379279 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:41463078429 (41.4 GB)  TX bytes:30560125562 (30.5 GB)

eth0      Link encap:Ethernet  HWaddr 78:e3:b5:fc:5f:f6
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::7ae3:b5ff:fefc:5ff6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:388615077 errors:0 dropped:10 overruns:0 frame:4
          TX packets:415367524 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:286066760479 (286.0 GB)  TX bytes:341323070112 (341.3 GB)
          Interrupt:16

eth0:0    Link encap:Ethernet  HWaddr 78:e3:b5:fc:5f:f6
          inet addr:192.168.0.201  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:16

eth1      Link encap:Ethernet  HWaddr 78:e3:b5:fc:5f:f7
          inet6 addr: fe80::7ae3:b5ff:fefc:5ff7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:462370372 errors:3 dropped:0 overruns:0 frame:17
          TX packets:421590293 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:412339313699 (412.3 GB)  TX bytes:293060052353 (293.0 GB)
          Interrupt:17

eth6      Link encap:Ethernet  HWaddr 00:1b:21:39:86:95
          inet addr:192.168.5.254  Bcast:192.168.5.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:21ff:fe39:8695/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:56153 errors:0 dropped:0 overruns:0 frame:0
          TX packets:186742 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:4898347 (4.8 MB)  TX bytes:149654003 (149.6 MB)
          Память:df920000-df940000

lo        Link encap:Локальная петля (Loopback)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:144900 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144900 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:18025495 (18.0 MB)  TX bytes:18025495 (18.0 MB)

ppp0      Link encap:Протокол PPP (Point-to-Point Protocol)
          inet addr:192.168.138.2  P-t-P:192.168.138.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1410  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:57 (57.0 B)  TX bytes:48 (48.0 B)

tap0      Link encap:Ethernet  HWaddr c6:67:b8:d7:98:ba
          inet addr:192.168.253.1  Bcast:192.168.253.255  Mask:255.255.255.0
          inet6 addr: fe80::c467:b8ff:fed7:98ba/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1880943 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2652177 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:993190780 (993.1 MB)  TX bytes:1898998791 (1.8 GB)

virbr0    Link encap:Ethernet  HWaddr 6a:8b:27:97:0d:fa
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::688b:27ff:fe97:dfa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:84252 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:8289848 (8.2 MB)

vnet0     Link encap:Ethernet  HWaddr fe:54:00:5a:53:91
          inet6 addr: fe80::fc54:ff:fe5a:5391/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1293193 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2509417 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:118258869 (118.2 MB)  TX bytes:3268912939 (3.2 GB)

Оффтоп: Пытался закрыть все под спойлер, но почему-то лоркод [cut]text[/cut] не работает. Ниже приведен пример скопированной строки с используемым лоркодом со страницы http://www.linux.org.ru/wiki/en/Lorcode

Текст, который будет скрыт внутри спойлера



Последнее исправление: CeMKa (всего исправлений: 1)

Ну так укажи dst виртуалки в правиле.

Кстати расскажи мне сакральный смысл вот этого: -A FORWARD -i virbr0 -o virbr0 -j ACCEPT

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

Указать dst виртуалки, тем самым перекрыть доступ к веб серверу 192.168.0.252? т.е по русски: «отобрать у него порт» так чтоль?

Сакральный смысл рассказать не могу, сервак не мой и правила не я писал, мне виртуалку выделили по дружески, просто дали рута для выяснения косяков с виртуалкой.

И докучи я не гуру iptables. Сам не понимаю значения данного правила.

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

-A FORWARD -i virbr0 -o virbr0 -j ACCEPT

Предположим, что у одного из гостей конфигурация интерфейса 192.168.1.61/25, а у другого 192.168.1.129/24 и обоих default 192.168.1.1 (хост), в этом случае чтобы достучаться 61->129 будет задействован хост и это правило окажется необходимым.

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

Зачем лепить виртуальныю сеть с разными масками? Тем более что в вм при локальном обращении используются сокеты.

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

Зачем лепить виртуальныю сеть с разными масками?

Всякие ситуации бывают. Сети с разными масками - это просто пример. Есть еще алиасы, есть VPN. Что будет, если например в гостевой ОС будет поднят VPN-сервер? У него будет собственная подсеть для VPN-клиентов, хост (который default gateway) будет знать об этой подсети, а другеи гости - не будут, и будут маршрутизировать на VPN-клиентов через default, то бишь опять таки через это же правило.

Тем более что в вм при локальном обращении используются сокеты.

Внутри оно может быть реализовано как угодно, но «снаружи» это обычный интерфейс - примерно как tun, и соответственно все пакеты будут пролетать через iptables.

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

Тоесть, если верно понмаю, никак не отвертеться, если br0 на хосте он же бридж для виртуалки, и он же внешний ифейс хоста, и в то же время с br0 на хосте стоит правило проброса 80го порта в локалку. На виртуалке белый адрес, и слушается 80й порт.

Есть какие-нибудь выходы, кроме как смена порта на http в виртуалке? Еще одну сетевуху воткнуть возможности тоже нету.

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

Тебе же по-русски сказали, ИСПОЛЬЗУЙ dst в правиле! Хост 15.1.2.3, виртуалка 15.1.2.4, тогда правило на хосте должно быть не

iptables -A PREROUTING -t nat -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11
а
iptables -A PREROUTING -t nat -p tcp -d 15.1.2.3 --dport 80 -j DNAT --to-destination 192.168.10.11
Что, так сложно сделать что-ли?

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

О боже!! Нифига я тупанул то... внатуре слепой.... Спасибо вам большое за помощь!!! ))) Всю ночь не спал :) Видать это и сказывается на моей мозговой деятельности.... а оказалось то всего лишь...

Еще раз всем спасибо! Проблема решена.

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

Да уж. Писать правила с ACCEPT и это при таких-то политиках:

:INPUT ACCEPT 
:FORWARD ACCEPT 
:OUTPUT ACCEPT

Такое ощущение, что iptables шизофреник «настраивал» с одной лишь целью - чтобы заработало! Сжальтесь уже над таблицей nat, используйте multiport

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