Проблемы с bridge

 
+
-
edit
 

HolyBoy

аксакал

Весь вечер ковыряюсь и никак не могу увидеть, в чём затык.

Есть хост A. На нём настроен мост
code text
  1. # brctl show br3
  2. bridge name     bridge id               STP enabled     interfaces
  3. br3             8000.00259005540c       yes             bond1.3
  4.                                                         vnet0


в котором bond1.3 — интерфейс хоста, vnet0 — интерфейс виртуальной машины V.

V пингуется с любого внешнего хоста и пингует любой внешний хост. Если же пытаешься подключиться к V на любой из прослушиваемых портов:
code text
  1. # netstat -lnap
  2. Active Internet connections (servers and established)
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
  4. tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN      3697/slapd          
  5. tcp        0      0 0.0.0.0:56575           0.0.0.0:*               LISTEN      3639/rpc.mountd    
  6. tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -                  
  7. tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      3697/slapd          
  8. tcp        0      0 0.0.0.0:35654           0.0.0.0:*               LISTEN      3583/rpc.statd      
  9. tcp        0      0 0.0.0.0:33863           0.0.0.0:*               LISTEN      3639/rpc.mountd    
  10. tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      3569/rpcbind        
  11. tcp        0      0 0.0.0.0:57936           0.0.0.0:*               LISTEN      3639/rpc.mountd    
  12. tcp        0      0 0.0.0.0:37109           0.0.0.0:*               LISTEN      -                  
  13. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3715/sshd


то получаем облом, за исключением случая, когда соединяться пытаются с хоста A.

Вот так выглядит облом на V:
code text
  1. # tcpdump -i eth0 -n 'host 192.168.1.210'
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
  4. 04:04:01.980335 IP 192.168.1.210.40741 > 192.168.1.122.636: S 1326115610:1326115610(0) win 18236 <mss 9118,sackOK,timestamp 64614 0,nop,wscale 8>
  5. 04:04:04.990534 IP 192.168.1.210.40741 > 192.168.1.122.636: S 1326115610:1326115610(0) win 18236 <mss 9118,sackOK,timestamp 64915 0,nop,wscale 8>
  6. 04:04:11.000494 IP 192.168.1.210.40741 > 192.168.1.122.636: S 1326115610:1326115610(0) win 18236 <mss 9118,sackOK,timestamp 65516 0,nop,wscale 8>


А вот так на том хосте, с которого пытаются соединиться, B:
code text
  1. # tcpdump -i br3 -n 'host 192.168.1.122 '
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  3. listening on br3, link-type EN10MB (Ethernet), capture size 96 bytes
  4. 04:04:03.852997 IP 192.168.1.210.40741 > 192.168.1.122.636: S 1326115610:1326115610(0) win 18236 <mss 9118,sackOK,timestamp 64614 0,nop,wscale 8>
  5. 04:04:06.862985 IP 192.168.1.210.40741 > 192.168.1.122.636: S 1326115610:1326115610(0) win 18236 <mss 9118,sackOK,timestamp 64915 0,nop,wscale 8>
  6. 04:04:12.872983 IP 192.168.1.210.40741 > 192.168.1.122.636: S 1326115610:1326115610(0) win 18236 <mss 9118,sackOK,timestamp 65516 0,nop,wscale 8>



Вот так выглядит соединение с хоста A:
code text
  1. tcpdump -i br3 -n 'host 192.168.1.122 and tcp port 636'
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  3. listening on br3, link-type EN10MB (Ethernet), capture size 96 bytes
  4. 04:07:42.502219 IP 192.168.1.209.60449 > 192.168.1.122.636: S 3713155501:3713155501(0) win 18236 <mss 9118,sackOK,timestamp 122580 0,nop,wscale 8>
  5. 04:07:42.502454 IP 192.168.1.122.636 > 192.168.1.209.60449: S 3882010051:3882010051(0) ack 3713155502 win 14480 <mss 1460,sackOK,timestamp 1089495 122580,nop,wscale 4>
  6. 04:07:42.502500 IP 192.168.1.209.60449 > 192.168.1.122.636: . ack 1 win 72 <nop,nop,timestamp 122580 1089495>
  7. 04:07:44.911105 IP 192.168.1.209.60449 > 192.168.1.122.636: F 1:1(0) ack 1 win 72 <nop,nop,timestamp 122821 1089495>
  8. 04:07:44.911807 IP 192.168.1.122.636 > 192.168.1.209.60449: F 1:1(0) ack 2 win 905 <nop,nop,timestamp 1091904 122821>
  9. 04:07:44.911841 IP 192.168.1.209.60449 > 192.168.1.122.636: . ack 2 win 72 <nop,nop,timestamp 122821 1091904>



На мост br3 хоста A отлично соединяется любой внешний хост. Проблема появляется именно тогда, когда пытаешься соединиться с той частью, которая относится к V. Пересмотрел всё: ядро
code text
  1. CONFIG_BRIDGE=y
  2. CONFIG_BRIDGE_IGMP_SNOOPING=y
, iptables
code text
  1. iptables -L -nv
  2. Chain INPUT (policy ACCEPT 54417 packets, 87M bytes)
  3.  pkts bytes target     prot opt in     out     source               destination        
  4.  
  5. Chain FORWARD (policy ACCEPT 10654 packets, 798K bytes)
  6.  pkts bytes target     prot opt in     out     source               destination        
  7.  
  8. Chain OUTPUT (policy ACCEPT 42428 packets, 10M bytes)
  9.  pkts bytes target     prot opt in     out     source               destination
, ebtables
code text
  1. ebtables -L
  2. Bridge table: filter
  3.  
  4. Bridge chain: INPUT, entries: 0, policy: ACCEPT
  5.  
  6. Bridge chain: FORWARD, entries: 0, policy: ACCEPT
  7.  
  8. Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
и ничего не увидел. Пробовал STP отключать, но не помогло.

Проблема, кажется, с tcp, т.к. udp, тот же dns работает, вроде как с того же хоста, с которого не проходят tcp. Очень странно. Можно было бы грешить на управляемый свитч между хостами, но соединения с хостов за пределами этого свитча на хост A проходят, как писал уже.

В каком направлении ещё можно посмотреть?
 
Это сообщение редактировалось 06.01.2012 в 04:31
+
-
edit
 

HolyBoy

аксакал

На предыдущем ядре 2.6.39 всё работает как надо. Придётся разбираться, что же поломали в 3.х (как 0, так и 1).
 
+
-
edit
 

Полл

литератор
★★★★☆

HolyBoy> На предыдущем ядре 2.6.39 всё работает как надо. Придётся разбираться, что же поломали в 3.х (как 0, так и 1).
Глупый вопрос: если вместо моста поднять роутер с NAT - виртуалка сможет выходить в сеть по tcp?
 
+
-
edit
 

HolyBoy

аксакал

Полл> Глупый вопрос: если вместо моста поднять роутер с NAT - виртуалка сможет выходить в сеть по tcp?

Вопрос нормальный.

Отвечаю: за NAT неудобно, т.к. надо пробрасывать порты, проксировать широковещание, типа DHCP и т.п. Учитывая то количество сервисов, которое имеется нынче… А к ним ещё докручивать дополнительные. Кроме того, я NAT не очень люблю.

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

А вот бридж с сетевым интерфейсом — самое простое и эффективное решение: автоматически решается проблема с отслеживанием мигрирующих ВМ, с безопасностью и QoS (суём в бриджи в нужные VLAN) и тд и тп. Поэтому, я даже не рассматриваю предыдущие варианты. Тем более, что выяснилось: проблема именно в ядре, т.к. откат дал нужный эффект. Отосплюсь и буду неспешно разбираться.
 
+
-
edit
 

Mishka

модератор
★★★
HolyBoy> Тем более, что выяснилось: проблема именно в ядре, т.к. откат дал нужный эффект. Отосплюсь и буду неспешно разбираться.

Надо трясти VMWare я думаю. Чего-то там с драйверами не так. Кстати, патч до 3.2 для ядра лежит на кернел.орг.

Кстати, в 3.0 добавили дофига для MACа. А в 3.1 вернули взад некоторые вещи, что вызвало проблему с просыпанием у лаптопов снова.
 5.05.0
+
-
edit
 

HolyBoy

аксакал

Mishka> Надо трясти VMWare я думаю. Чего-то там с драйверами не так. Кстати, патч до 3.2 для ядра лежит на кернел.орг.

У меня KVM. Я пока грешу на какие-то неуказанные опции, типа Advanced router и что-то вроде того. Если найду причину, то отпишусь, конечно.
 
+
-
edit
 

Mishka

модератор
★★★
HolyBoy> У меня KVM. Я пока грешу на какие-то неуказанные опции, типа Advanced router и что-то вроде того. Если найду причину, то отпишусь, конечно.
Я когда компилял genkernel 3.0.6 (кажеться), то там были в сетевых настройках ссылки на поддержку сетевую виртуальных машин.

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

PS Advanced Router появился довольно давно, ИМХО.
 7.0.17.0.1
+
-
edit
 

Полл

литератор
★★★★☆

Еще один глупый вопрос - а никакого брэндмауэра по умолчанию в новой системе не стоит?
 
+
-
edit
 

Mishka

модератор
★★★
Полл> Еще один глупый вопрос - а никакого брэндмауэра по умолчанию в новой системе не стоит?
Там выше iptables даны. На Лине это и есть стандартный способ.
 7.0.17.0.1
+
-
edit
 

Полл

литератор
★★★★☆

Mishka> На Лине это и есть стандартный способ.
А в конкретной системе Холи некого нестандартного способа не забито с настройками по умолчанию?
 
+
-
edit
 

Mishka

модератор
★★★
HolyBoy> Есть хост A. На нём настроен мост и ничего не увидел. Пробовал STP отключать, но не помогло.

STP тут точно не причём. У тебя наверняка нет multipath на уровне 2 (эзера). Ну и пинги не ходили бы, т.к. ICMP всё же выше уровнем (сетевой). Собственно, STP отвечает, чтобы не было циклов при брадкасте, соответственно, чтобы "шторма пакетов" не случилось.

Хотя, если подумать, то STP может выбрать дерево таким образом, чтобы пакеты сыпались на раутер, где что-то будет отфильтровываться. Но поскольку STP сам решает, как выбрать дерево из графа, то контролировать это очень затруднительно.
 7.0.17.0.1
+
-
edit
 

Mishka

модератор
★★★
Полл> А в конкретной системе Холи некого нестандартного способа не забито с настройками по умолчанию?
Не знаю. Но из вывода ничего страшного не видно. Там показываются все правила. iptables это и NATP, и firewall (причём statefull), и ещё жнец и на дуде игрец. :)
 7.0.17.0.1
+
-
edit
 

HolyBoy

аксакал

Mishka> Я когда компилял genkernel 3.0.6 (кажеться), то там были в сетевых настройках ссылки на поддержку сетевую виртуальных машин.

Я пользуюсь genkernel, но всегда с запуском menucofig, потому что железо может быть разным, да и опции приходится менять. Всё, что имело отношение к виртуальным машинам, я включил, даже то, что требуется только для гостевой, а не для dom0.

Mishka> PS Advanced Router появился довольно давно, ИМХО.

Я имел в виду, что возможно я не включил какие-то опции, однако эта моя гипотеза провалилась. Сравнение конфига 2.6.39 и 3.1.6 показало, что никакой разницы в сетевых настройках нет вообще, кроме включения IPv6 и относящихся к нему моментов.
code diff
  1. --- config-2.6.39-r3    2012-01-07 13:04:38.997570860 +0400
  2. +++ /usr/src/linux/.config      2012-01-01 14:06:58.326311033 +0400
  3. @@ -1,7 +1,6 @@
  4.  #
  5.  # Automatically generated make config: don't edit
  6. -# Linux/x86 2.6.39-gentoo-r3 Kernel Configuration
  7. -# Sun Aug 28 10:39:56 2011
  8. +# Linux/x86 3.0.6-gentoo Kernel Configuration
  9.  #
  10.  
  11.  #
  12. @@ -530,6 +525,12 @@
  13.  #
  14.  CONFIG_PACKET=y
  15.  CONFIG_UNIX=y
  16. +CONFIG_XFRM=y
  17. +# CONFIG_XFRM_USER is not set
  18. +# CONFIG_XFRM_SUB_POLICY is not set
  19. +# CONFIG_XFRM_MIGRATE is not set
  20. +# CONFIG_XFRM_STATISTICS is not set
  21. +CONFIG_XFRM_IPCOMP=y
  22.  # CONFIG_NET_KEY is not set
  23.  CONFIG_INET=y
  24.  CONFIG_IP_MULTICAST=y
  25. @@ -555,7 +556,7 @@
  26.  # CONFIG_INET_ESP is not set
  27.  # CONFIG_INET_IPCOMP is not set
  28.  # CONFIG_INET_XFRM_TUNNEL is not set
  29. -# CONFIG_INET_TUNNEL is not set
  30. +CONFIG_INET_TUNNEL=y
  31.  # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
  32.  # CONFIG_INET_XFRM_MODE_TUNNEL is not set
  33.  # CONFIG_INET_XFRM_MODE_BEET is not set
  34. @@ -578,7 +579,28 @@
  35.  # CONFIG_DEFAULT_RENO is not set
  36.  CONFIG_DEFAULT_TCP_CONG="cubic"
  37.  CONFIG_TCP_MD5SIG=y
  38. -# CONFIG_IPV6 is not set
  39. +CONFIG_IPV6=y
  40. +CONFIG_IPV6_PRIVACY=y
  41. +CONFIG_IPV6_ROUTER_PREF=y
  42. +# CONFIG_IPV6_ROUTE_INFO is not set
  43. +CONFIG_IPV6_OPTIMISTIC_DAD=y
  44. +CONFIG_INET6_AH=y
  45. +CONFIG_INET6_ESP=y
  46. +CONFIG_INET6_IPCOMP=y
  47. +# CONFIG_IPV6_MIP6 is not set
  48. +CONFIG_INET6_XFRM_TUNNEL=y
  49. +CONFIG_INET6_TUNNEL=y
  50. +CONFIG_INET6_XFRM_MODE_TRANSPORT=y
  51. +CONFIG_INET6_XFRM_MODE_TUNNEL=y
  52. +CONFIG_INET6_XFRM_MODE_BEET=y
  53. +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
  54. +CONFIG_IPV6_SIT=y
  55. +# CONFIG_IPV6_SIT_6RD is not set
  56. +CONFIG_IPV6_NDISC_NODETYPE=y
  57. +CONFIG_IPV6_TUNNEL=y
  58. +CONFIG_IPV6_MULTIPLE_TABLES=y
  59. +CONFIG_IPV6_SUBTREES=y
  60. +# CONFIG_IPV6_MROUTE is not set
  61.  CONFIG_NETLABEL=y
  62.  CONFIG_NETWORK_SECMARK=y
  63.  # CONFIG_NETWORK_PHY_TIMESTAMPING is not set
  64. @@ -674,6 +696,7 @@
  65.  CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
  66.  CONFIG_NETFILTER_XT_MATCH_OSF=y
  67.  CONFIG_NETFILTER_XT_MATCH_OWNER=y
  68. +CONFIG_NETFILTER_XT_MATCH_POLICY=y
  69.  CONFIG_NETFILTER_XT_MATCH_PHYSDEV=y
  70.  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
  71.  CONFIG_NETFILTER_XT_MATCH_QUOTA=y
  72. @@ -700,6 +723,7 @@
  73.  CONFIG_IP_SET_HASH_NETPORT=y
  74.  CONFIG_IP_SET_LIST_SET=y
  75.  CONFIG_IP_VS=y
  76. +# CONFIG_IP_VS_IPV6 is not set
  77.  # CONFIG_IP_VS_DEBUG is not set
  78.  CONFIG_IP_VS_TAB_BITS=12
  79.  
  80. @@ -770,6 +794,29 @@
  81.  CONFIG_IP_NF_ARPTABLES=y
  82.  CONFIG_IP_NF_ARPFILTER=y
  83.  CONFIG_IP_NF_ARP_MANGLE=y
  84. +
  85. +#
  86. +# IPv6: Netfilter Configuration
  87. +#
  88. +CONFIG_NF_DEFRAG_IPV6=y
  89. +CONFIG_NF_CONNTRACK_IPV6=y
  90. +# CONFIG_IP6_NF_QUEUE is not set
  91. +CONFIG_IP6_NF_IPTABLES=y
  92. +CONFIG_IP6_NF_MATCH_AH=y
  93. +CONFIG_IP6_NF_MATCH_EUI64=y
  94. +CONFIG_IP6_NF_MATCH_FRAG=y
  95. +CONFIG_IP6_NF_MATCH_OPTS=y
  96. +CONFIG_IP6_NF_MATCH_HL=y
  97. +CONFIG_IP6_NF_MATCH_IPV6HEADER=y
  98. +CONFIG_IP6_NF_MATCH_MH=y
  99. +CONFIG_IP6_NF_MATCH_RT=y
  100. +CONFIG_IP6_NF_TARGET_HL=y
  101. +CONFIG_IP6_NF_TARGET_LOG=y
  102. +CONFIG_IP6_NF_FILTER=y
  103. +CONFIG_IP6_NF_TARGET_REJECT=y
  104. +CONFIG_IP6_NF_MANGLE=y
  105. +CONFIG_IP6_NF_RAW=y
  106. +CONFIG_IP6_NF_SECURITY=y
  107.  CONFIG_BRIDGE_NF_EBTABLES=y
  108.  CONFIG_BRIDGE_EBT_BROUTE=y
  109.  CONFIG_BRIDGE_EBT_T_FILTER=y
  110. @@ -778,6 +825,7 @@
  111.  CONFIG_BRIDGE_EBT_AMONG=y
  112.  CONFIG_BRIDGE_EBT_ARP=y
  113.  CONFIG_BRIDGE_EBT_IP=y
  114. +CONFIG_BRIDGE_EBT_IP6=y
  115.  CONFIG_BRIDGE_EBT_LIMIT=y
  116.  CONFIG_BRIDGE_EBT_MARK=y
  117.  CONFIG_BRIDGE_EBT_PKTTYPE=y
  118. @@ -836,6 +884,7 @@
  119.  CONFIG_NET_SCH_DRR=y
  120.  CONFIG_NET_SCH_MQPRIO=y
  121.  CONFIG_NET_SCH_CHOKE=y
  122. +# CONFIG_NET_SCH_QFQ is not set
  123.  CONFIG_NET_SCH_INGRESS=y


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

Пробовал откатить версии qemu-kvm и libvirt — не помогло. Кстати, если внутри виртуалки выбрать в качестве сетевой карты не virtio-устройство, а какое-нибудь эмулируемое, типа e1000 или rtl8139, то не работает уже вообще ничего: даже с dom0 виртуалка не пингуется.

Всё это похоже на баг или отставание разработчиков qemu от ядерных. В гугле ничего подходящего не нашлось. Странно, ведь ядра 3.х давно уже стабильные.
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru