Я пытаюсь заставить Linux работать через VPN (GRE-TAP). Самое смешное, что это работает, только когда у меня tcpdump
работает на обоих хостах, но об этом позже ...
Есть две машины, называемые pxn1
и pxn2
. Они соединяются вместе с помощью простого переключателя через eth1.
pxn1 has IP address 10.1.1.197
pxn2 has IP address 10.1.1.199
Чтобы получить безопасное соединение, весь IP-трафик шифруется с помощью IPsec. Это работает, Я могу без проблем пинговать между двумя машинами и tcpdump
показывает только зашифрованные пакеты.
GRE-TAP (туннелирует кадры Ethernet через IP) Затем интерфейс настраивается в обоих направлениях, потому что позже мне понадобится виртуальный сетевой интерфейс:
ip link add vpn_gre_pxn2 type gretap local 10.1.1.197 remote 10.1.1.199 dev eth1
ifconfig показывает:
vpn_gre_pxn2 Link encap:Ethernet HWaddr 1a:73:32:7f:36:5f
inet6 addr: fe80::1873:32ff:fe7f:365f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1462 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1294 (1.2 KiB) TX bytes:1916 (1.8 KiB)
Это на pxn1
. На другом хосте тот же интерфейс настроен в другом направлении.
Настроен мост, который в настоящее время использует только устройство GRE-TAP.
Мне нужен мост, потому что позже я хочу добавить больше машин (мой план - соединить все туннели GRE вместе). Конечным результатом должна стать ячеистая сеть VPN (с выделенным интерфейсом GRE-TAP для каждой комбинации хост-хост). Но поскольку сейчас я просто провожу первый тест с двумя машинами, мост, конечно, несколько бесполезен, но, тем не менее, важен для самого теста.
brctl addbr vpn_br
brctl addif vpn_br vpn_gre_pxn2
Мост работает потому что когда я активирую vpn_br
интерфейс и настроить несколько IP-адресов (только для тестирования моста), ICMP PING работают отлично.
vpn_br Link encap:Ethernet HWaddr 02:00:0a:01:01:c5
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1462 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:448 (448.0 B) TX bytes:468 (468.0 B)
Интерфейс связывания Linux настроен. Опять же, поскольку это всего лишь первое испытание концепции, я добавлю к связи только одного ведомого устройства.
Позже также будет реальная отдельная сетевая карта Gbit с выделенным коммутатором, который будет действовать как основное ведомое устройство (при этом VPN будет только резервным), но пока интерфейс связывания будет использовать только VPN.
modprobe bonding mode=1 miimon=1000
ifconfig bond0 hw ether 02:00:0a:01:01:c5 # some dummy MAC
ifconfig bond0 up
ifconfig bond0 mtu 1462
ifenslave bond0 vpn_br # as said, only a single slive at the moment
ifconfig bond0 172.16.1.2/24 up
Другой хост настроен как 172.16.1.1/24 с HWaddr 02: 00: 0a: 01: 01: c7.
Это приводит к теоретически работающему интерфейсу связывания:
bond0 Link encap:Ethernet HWaddr 02:00:0a:01:01:c5
inet addr:172.16.1.2 Bcast:172.16.1.255 Mask:255.255.255.0
inet6 addr: fe80::aff:fe01:1c5/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1462 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:448 (448.0 B) TX bytes:468 (468.0 B)
Статус тоже мне нравится:
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: vpn_br
MII Status: up
MII Polling Interval (ms): 1000
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: vpn_br
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: 1a:73:32:7f:36:5f
Slave queue ID: 0
... как и таблица маршрутизации:
# ip route show
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
172.16.1.0/24 dev bond0 proto kernel scope link src 172.16.1.2
10.1.1.0/24 dev eth1 proto kernel scope link src 10.1.1.197
default via 10.1.1.11 dev eth1
NB: eht0
это отдельный активный сетевой адаптер (кросс-кабель Ethernet), но это не имеет значения, ИМХО.
Настройка мне кажется хорошей, однако PING не работает (это было запущено на pxn1
):
# ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
From 172.16.1.2 icmp_seq=2 Destination Host Unreachable
From 172.16.1.2 icmp_seq=3 Destination Host Unreachable
From 172.16.1.2 icmp_seq=4 Destination Host Unreachable
Во время пинга, tcpdump
на другой машине (pxn2
) говорит:
# tcpdump -n -i bond0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:45:13.013791 ARP, Request who-has 172.16.1.1 tell 172.16.1.2, length 28
17:45:13.013835 ARP, Reply 172.16.1.1 is-at 02:00:0a:01:01:c7, length 28
17:45:14.013858 ARP, Request who-has 172.16.1.1 tell 172.16.1.2, length 28
17:45:14.013875 ARP, Reply 172.16.1.1 is-at 02:00:0a:01:01:c7, length 28
17:45:15.013870 ARP, Request who-has 172.16.1.1 tell 172.16.1.2, length 28
17:45:15.013888 ARP, Reply 172.16.1.1 is-at 02:00:0a:01:01:c7, length 28
Однако, когда я также бегу tcpdump
на pxn1
в отдельном терминале я внезапно получаю свои ICMP-ответы!
...
From 172.16.1.2 icmp_seq=19 Destination Host Unreachable
From 172.16.1.2 icmp_seq=20 Destination Host Unreachable
64 bytes from 172.16.1.1: icmp_req=32 ttl=64 time=0.965 ms
64 bytes from 172.16.1.1: icmp_req=33 ttl=64 time=0.731 ms
64 bytes from 172.16.1.1: icmp_req=34 ttl=64 time=1.00 ms
64 bytes from 172.16.1.1: icmp_req=35 ttl=64 time=0.776 ms
64 bytes from 172.16.1.1: icmp_req=36 ttl=64 time=1.00 ms
Это работает только до тех пор, пока обе машины имеют tcpdump
Бег. Я могу начать / остановить tcpdump
и постоянно видеть ответы только тогда, когда программа работает на обеих машинах одновременно. Неважно, на какой машине я пробую.
Это ошибка ядра или (что более вероятно) проблема с моей конфигурацией?
Это нормально, что мост и интерфейс соединения показывают один и тот же MAC-адрес? Я только вручную настраиваю его для интерфейса связывания, который, по-видимому, также меняет мост ..
FYI, обзор конфигурации:
Я получаю рабочую настройку, когда устанавливаю интерфейс моста в неразборчивый режим (ifconfig vpn_br promisc
). Я не совсем уверен, что это обычно необходимо. OTOH я не считать у него есть минусы ...
Кстати, есть аналогичный Отчет об ошибке RedHat существует, но установка bond0
вниз / вверх не помогает в моем случае ..
Работает ли он без склеивающего элемента? Я подозреваю, что проблема в том, что сообщения LACP не проходят через мост, пока вы не переведете его в беспорядочный режим.
Если вы используете ядро 3.5 или выше, это также может помочь включить передачу IGMP-запросов для интерфейса моста. Это может помочь мосту подписаться на группу многоадресной рассылки LACP.
echo -n 1 > /sys/devices/virtual/net/vpn_br/bridge/multicast_querier