LINUX.ORG.RU
ФорумAdmin

NAT на тот же физический интерфейс


0

1

Есть два хоста A и B. На каждом из хостов работают виртуальные машины. Виртуальные машины находятся в сети 172.16.0.0/12. На хосте A есть интернет. Задача: сделать интернет на всех виртуальных машинах. Сложность заключается в том, что физический интерфейс один.

Делаем на хосте A:

/sbin/iptables -t nat -A POSTROUTING -s 172.16.0.0/12 ! -d 172.16.0.0/12 -j LOG --log-prefix "iptables nat"
/sbin/iptables -t nat -A POSTROUTING -s 172.16.0.0/12 ! -d 172.16.0.0/12 -j MASQUERADE

Делаем на виртуальной машине хоста A:

$ ping linux.org.ru
PING linux.org.ru (217.76.32.61) 56(84) bytes of data.
64 bytes from linux.org.ru (217.76.32.61): icmp_seq=1 ttl=56 time=2.82 ms
Зашибись!

Делаем на виртуальной машине хоста B:

$ ping linux.org.ru
PING linux.org.ru (217.76.32.61) 56(84) bytes of data.

--- linux.org.ru ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1010ms
Фигня!

В это время в логах хоста A:

Jun 10 17:56:12 machine-01c kernel: [22872.850936] iptables natIN= OUT=br0 PHYSIN=eth1 SRC=172.16.0.21 DST=217.76.32.61 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=9024 SEQ=1
то есть правило отрабатывает, а результата нет

Как это победить?

★★★★★

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

Хосты А и B тоже в сети 172.16.0.0/12? И вирт. машины там же через bridge?

скорее всего с раутингом проблемы, echo-request уходит (ты видишь логи на А), echo-reply не возвращается до вирт. на В

sdio ★★★★★
()

Вероятно, на машине A роутинг на всю сеть 172.16.0.0/12 заруливается на виртуалку на этой машине и до виртуалки на машину B трафик просто не доходит...

route -n с машины A какой?

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

Да, везде 172.16.0.0/12 и бридж. С машин хоста B я могу ходить на машины хоста A и на сам хост A.

Reset ★★★★★
() автор топика
Ответ на: комментарий от Slavaz
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
77.nda.ip-addr.0      0.0.0.0         255.255.255.224 U     0      0        0 br0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
172.16.0.0      0.0.0.0         255.240.0.0     U     0      0        0 br0
0.0.0.0         77.nda.ip-addr.30     0.0.0.0         UG    100    0        0 br0

Вот так. 192.168.122.0 создал libvirt. Оно не используется. Реальный ip'шник скрыт.

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

Reset> 192.168.122.0 создал libvirt. Оно не используется.

virsh net-destroy default

rm /etc/libvirt/qemu/networks/autostart/default.xml

ты iptables-save смотрел? сеть default тоже NAT поднимает

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

а на интерфейсе br0 кроме адреса из 172.16.0.0/12 сети ещё какие-нибудь адреса есть?

можно ли как разделить адресные пространства, чтобы получились две сетки? например

1) br0 <---> (хост B и виртуалки)
2) br0:0 <---> 77.nda.ip-addr.30

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

всё левое убрал, естественно, ничего не заработало

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  172.16.0.0          !172.16.0.0/12       LOG level warning prefix `iptables nat'
MASQUERADE  all  --  172.16.0.0/12       !172.16.0.0/12
$ sudo iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Reset ★★★★★
() автор топика
Ответ на: комментарий от Slavaz

1) br0 <---> (хост B и виртуалки)
2) br0:0 <---> 77.nda.ip-addr.30

с точностью до наоборот

Reset ★★★★★
() автор топика
Ответ на: комментарий от sdio
$ sudo tcpdump -n -i br0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:39:15.981954 IP 172.16.0.21 > 217.76.32.61: ICMP echo request, id 10000, seq 4, length 64
20:39:15.984648 IP 217.76.32.61 > 172.16.0.21: ICMP echo reply, id 10000, seq 4, length 64
...

Срубаю tcpdump и работать перестает. Чудеса.

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

Это уже радикальное решение. Смогу попробовать только во вторник. Если что-то сломается, то квм заказывать, а в выходные никто этого делать, естественно, не будет.

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

Чего ж в нём радикального? Проблемы с роутингом в другую сеть начинаются тогда, когда хост не имеет шлюза по умолчанию.

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

Не работает. Только request'ы идут.

$ sudo tcpdump -p -n -i br0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:16:11.212480 IP 172.16.0.21 > 217.76.32.61: ICMP echo request, id 1060, seq 1, length 64
21:16:11.212509 IP host-a-ip > 217.76.32.61: ICMP echo request, id 1060, seq 1, length 64
21:16:12.216864 IP 172.16.0.21 > 217.76.32.61: ICMP echo request, id 1060, seq 2, length 64
21:16:12.216888 IP host-a-ip > 217.76.32.61: ICMP echo request, id 1060, seq 2, length 64
21:16:13.236695 IP 172.16.0.21 > 217.76.32.61: ICMP echo request, id 1060, seq 3, length 64
Reset ★★★★★
() автор топика
Ответ на: комментарий от Reset

> Срубаю tcpdump и работать перестает. Чудеса.

tcpdump, наверное, ставит promiscous mode. Что намекает на проблему с конфигурацией моста.

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

Про promiscous mode я уже догадался. А какие могут быть проблемы с конфигурацией моста?

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

конфигурация выглядит так

auto lo
iface lo inet loopback
auto br0
iface br0 inet static
  address 77.nda.ip-addr.1
  netmask 255.255.255.224
  gateway 77.nda.ip-addr.30
  network 77.nda.ip-addr.0
  mtu 1450
  bridge_ports eth1
  bridge_stp off
  bridge_maxwait 0
  bridge_fd 0
auto br0:0
iface br0:0 inet static
  address 172.16.0.1
  netmask 255.240.0.0
  network 172.16.0.0

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

Reset> Это уже радикальное решение. Смогу попробовать только во вторник.

А как же до сих пор пинг на лор шел через хост А? Если ты добавил static routing для лора через хост А и это, как мы видим не работает, то и default route не поможет

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

route, естественно, не поможет, default route, кстати, там стоит правильный.
сейчас я вижу два решения:
1. поставить интерфейс в promisc
2. подключить второй шнурок и скорее всего даже в другой свитч.

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

Есть, ибо там есть второй белый ip-шник. Вариант сделать хост B роутером для виртуалок на нем работающих не рассматриваю. Очень сложная схема получится и с миграцией проблемы будут.

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

пробовал - не помогает

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

как вариант на время отключить bridge и убедиться, что это он виноват

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

Да, без bridge'а работает. Значит bridge глючит.

Reset ★★★★★
() автор топика

вроде не пробегало, так какой default gw на виртуалках на B?

ip ro

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