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

Проброс портов в Xen


1

2

Доброго времени суток всем!
Суть вопроса: есть хост XEN 4.2 на базе CentOS 6.5, имеет 2 сетевухи - одна смотрит наружу (ip xx.xx.xx.xx), другая в локалку 192.168.199.0/24 (ip 192.168.199.203). На хосте имеется виртуалка под Ubuntu Server 12.04, необходимо, чтобы она была подключена к этой же физической локальной сети и имела доступ в интернет. С подключением по локалке проблем нет, а вот с пробросом портов, что-то не разберусь. Сейчас конфигурация такая: на гипервизоре eth0 - внешний интерфейс с адресом ip xx.xx.xx.xx, eth1 - внутренний интерфейс, без адреса, воткнут в бридж, и xenbr1 - бридж с адресом 192.168.199.203, в него включены eth1 и виртуальный интерфейс виртуалки с адресом 192.168.199.218.
Пыталась настроить проброс портов с виртуалки на CentOS в iptables, но скорее всего, намудрила какую-то ерунду:

[root@adsl-75-045 network-scripts]# service iptables status
Таблица: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DNAT       tcp  --  0.0.0.0/0            80.243.75.45        tcp dpt:8080 to:192.168.199.218:80
2    DNAT       udp  --  0.0.0.0/0            80.243.75.45        udp dpt:8080 to:192.168.199.218:80

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0

Таблица: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            192.168.199.218     tcp dpt:80
2    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Помогите, пожалуйста, разобраться с пробросом портов.

Во-первых, не вижу ерунды: выглядит работающим (я бы предпочёл SNAT вместо MASQUERADE в такой ситуации, но это эстетство). Увы, в выводе iptables без -v (как делает status) не видно интерфейсов (-i, -o). Думаю, они у вас правильные (там ведь не фигурирует интерфейс eth1, который без адреса?), но вывод iptables-save был бы доходчивее. Или iptables -L -n -v -t nat, заодно и счётчики проверите.

Во-вторых, /proc/sys/net/ipv4/ip_forward не забыли включить? (У меня это типичная вещь, которую я забываю в подобных ситуациях с виртуалками).

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

Действительно, в /proc/sys/net/ipv4/ip_forward стоял 0 (я до этого включила net.ipv4.ip_forward = 1 в /etc/sysctl.conf, подумала, что этого достаточно, но пинги с виртуалки в интернет не ходили вообще). Вот только вопрос - значение /proc/sys/net/ipv4/ip_forward сохраняется после перезапуска сервера?

Включила /proc/sys/net/ipv4/ip_forward - при пинге с виртуалки в интернет, появились сообщения от шлюза типа:

#ping 8.8.8.8
From 192.168.199.203 icmp_seq=1 Destination Host Prohibited
...
Ну хоть шлюз стал реагировать - значит пакеты доходят, а потом отсеиваются. Теперь, видимо, проблема в правилах iptables. Сейчас конфигурация такая:
# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 27611 packets, 1401K bytes)
 pkts bytes target     prot opt in     out     source               destination
    3   120 DNAT       tcp  --  *      *       0.0.0.0/0            xx.xx.xx.xx        tcp dpt:8080 to:192.168.199.218:80
    0     0 DNAT       udp  --  *      *       0.0.0.0/0            xx.xx.xx.xx        udp dpt:8080 to:192.168.199.218:80

Chain INPUT (policy ACCEPT 2001 packets, 104K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 2521 packets, 188K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes)
 pkts bytes target     prot opt in     out     source               destination
 2527  188K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0

# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 606K   62M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       192.168.199.218      0.0.0.0/0
   44  2237 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
   10   600 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
 2100  109K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
35958 1776K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  xenbr1 *       192.168.199.218      0.0.0.0/0           tcp spt:80
    0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            192.168.199.218     tcp dpt:80
   27  2268 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 3912 packets, 6067K bytes)
 pkts bytes target     prot opt in     out     source               destination

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

при пинге с виртуалки в интернет, появились сообщения от шлюза

Шлюзом на локальном интерфейсе виртуалки прописан адрес моста xenbr1 (192.168.199.203)

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

Присмотревшись, не вижу у вас в цепочке FORWARD разрешения ICMP, да и вообще всё запрещено, кроме очень одинокого http-сервера (может, это неочевидно, но действия хоста в роли шлюза управляются цепочкой FORWARD. Пакет, подвергнутый NAT-у, не становится «локально исходящим» через OUTPUT, даже если у него source address переписан на локальный).

/proc/sys/net/ipv4/ip_forward сам по себе не сохраняется. Скорее всего надо в /etc/sysctl.conf прописать net.ipv4.ip_forward = 1 (у меня воспоминания десятилетней давности, что в RedHat это правильно делать по-другому, где-то около /etc/sysconfig/networking, но сейчас гуглится именно вариант с sysctl.conf).

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

Что-то я запуталась.. Добавила в FORWARD разрешение, но со шлюза вообще перестали ответы приходить про «Destination Host Prohibited», все пакеты теряются. Сейчас настройка такая:

# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      *       192.168.199.218      0.0.0.0/0
 127K 9910K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    1    60 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    1    60 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    4   176 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
  750 38776 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  142  6671 ACCEPT     all  --  eth0   xenbr1  0.0.0.0/0            192.168.199.218
  221 10525 ACCEPT     all  --  xenbr1 eth0    192.168.199.218      0.0.0.0/0
  434 22209 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 10854 packets, 8306K bytes)
 pkts bytes target     prot opt in     out     source               destination


# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 73 packets, 6903 bytes)
 pkts bytes target     prot opt in     out     source               destination
  510 24850 DNAT       all  --  *      *       0.0.0.0/0            xx.xx.xx.xx        to:192.168.199.218

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 1 packets, 84 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 4 packets, 336 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 SNAT       all  --  *      *       192.168.199.0/24     192.168.199.218     to:192.168.199.203
  169  8058 SNAT       all  --  *      *       0.0.0.0/0            192.168.199.218     to:xx.xx.xx.xx

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

Я тоже запутался: не понимаю, откуда у вас два SNAT взялись, почему их два и почему они такие :(

Моя версия вот:

  iptables -t nat -I POSTROUTING -s 192.168.199.0/24 -o eth0 -jSNAT --to-source xx.xx.xx.xx

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

Спасибо за помощь, разобралась, все работает. Вернула обратно MASQUERADE, но главное - в FORWARD прописала перенаправление только для пакетов не из локальной сети (!192.168.199.0/24 вместо 0.0.0.0/0):

# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   69  4536 ACCEPT     all  --  *      *       192.168.199.218      0.0.0.0/0
 416K   33M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
   39  2603 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    2   120 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
  219  9928 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
24697 1221K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
66180   95M ACCEPT     all  --  eth0   *      !192.168.199.0/24     192.168.199.218
38224 2296K ACCEPT     all  --  xenbr1 *       192.168.199.218     !192.168.199.0/24
 1895 92231 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 154K packets, 268M bytes)
 pkts bytes target     prot opt in     out     source               destination


# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 23568 packets, 1200K bytes)
 pkts bytes target     prot opt in     out     source               destination
    9   464 DNAT       tcp  --  *      *      !192.168.199.0/24     xx.xx.xx.xx        tcp dpt:8080 to:192.168.199.218:80
    0     0 DNAT       udp  --  *      *      !192.168.199.0/24     xx.xx.xx.xx        udp dpt:8080 to:192.168.199.218:80
 

Chain INPUT (policy ACCEPT 269 packets, 12952 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 143 packets, 10685 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 10 packets, 524 bytes)
 pkts bytes target     prot opt in     out     source               destination
  235 16667 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0

Incher ()

Помогите новичку

Обращаюсь к ТС. Прошу помощи разобраться в проблеме. Я - абсолютный новичок в виртуализации. В кратце, есть удаленный сервер с установленным XenServer 6.2. У него 2 физ. интерфейса: eth0 (выход в мир, IP получает по DHCP от прова) и eth1 (не подключен). Есть 2 белых IP из разных подсетей. Задача: организовать сеть внутри XenServer для виртуалок и обеспечить свободный выход последних в мир с форвардингом портов. Уже 3 недели изучаю китайские иероглифы (для меня это основы *nix и организация сетей). Затер до дыр гугл и яндекс. Прошу помощи здесь, т.к. Ув. Incher кажется разобралась в похожей проблеме, но мне не все понятно, какие вносить изменения в iptables?

Предварительно сделал все, как в посте http://techblog.conglomer.net/adding-different-subnet-ips-to-xenserver/

На хост установлен как ВМ Citrix DVS-Controller 6.1.0. В идеале вижу решение такое: первый белый IP 85.194.x.x 255.255.255.254 - это Management-interface XenServer`a, второй IP 85.194.y.y 255.255.255.255 - WAN порт для DVS-Controller'a, который должен выступать в роли шлюза, DNS и DHCP-сервера остальных ВМ во внутренней сети 192.168.10.0.

P.S. Может кто-то посоветует более изящное решение моей проблемы? Но желательно как новичку, поподробней опишите. Буду примного благодарен!

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