LINUX.ORG.RU
ФорумAdmin

Как настраивают сеть?

 


0

1

Я уже задавал этот вопрос лет пять назад, но тогда всем компетентным специалистам было лень разбираться, а все некомпетентные не смогли (и я тоже).

Проблема: не ходят пакеты.

# ping -I 10.0.0.3 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.3 : 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
148336 packets transmitted, 0 received, 100% packet loss, time 154273488ms

Сеть 10.0.0.0/8 создана при помощи утилит из состава пакета wireguard.

Проблема в настройке rule based policy или чего-то такого. Я читал все ссылки, которые давали в прошлый раз, и после длительных мучений мне несколько раз удавалось настроить, но всё это было временно и сеть в итоге разваливается и пакеты перестают ходить (по всей видимости это происходит при перебоях в электропитании, и отключении/подключении сетевого интерфейса).

И вот она отвалилась в очередной раз, и я снова не могу её настроить.

★★☆

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

Сеть работает по принципап:
- связи на физическом уровне, медный провод, оптоволокно, радио канал;
- связи на логическом уровне, VLAN, ТУННЕЛЬ, ШИФРОВАНИЕ,
- связи на уровне адресного пространства, IP адреса.

Так вот что бы у вас пинговался какой-либо IP адрес должна быть связь между узлами через которые пойдёт пакет на физическом уровне, при чём разные узлы на разных участках могут связываться разными физическимни каналами.

Так же должна быть связь на логическом уровне, т.е. общее шифрование или общий VLAN, прочее.

Доступность по адресному пространству, т.е. если IP адрес находится в одном адресном пространстве, то в случае если два выше стоящих условия выполняются происходит обмен пакетов.

Если IP адрес находится в другом адресном пространстве, то пакет машрутизируется до узлов являющихся шлюзами, которые являются посредниками и могут обеспечивать доступ в другие адресные пространства.

(по всей видимости это происходит при перебоях в электропитании, и отключении/подключении сетевого интерфейса).

Если вы пишете, что вы настраивали и у вас всё работало, но даже при отключении / подключении провода у вас связь терялась, то вывод только один: вы просто выполнили настройку командами, не прописав нужные настройки в конфигурационные файлы настройки сети вашего Linux. А при отключении / подключении провода выполняются сценарии про возникновении событий pre_up / post_up, pre_down / post_down и по этим событиям выполняется перенастройка интерфейсов в соответствии с конфигурационным файлом.

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

сетевой интерфейс wgN работает в lxc-контейнере. У меня вопрос - нужно ли именно в этом же контейнере иметь обычный интерфейс, который будет обеспечивать прохождение пакетов до удалённого узла с «сервером» wireguard, или пакеты из интерфейса wgN сразу попадают в ядро, а оттуда уходят с хостовой машины? Нужно ли хождение обычных пакетов настраивать в контейнере, или на хосте?

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

У меня вопрос - нужно ли именно в этом же контейнере иметь обычный интерфейс

Нужно что бы внешний реальный IP адрес сервера был доступн клиентам для подключения, т.к. клиенты подключаются на определённы внешний IP адрес и порт, устанавливают шифрованное соединение и тем самым поднимают шифрованный VPN канал.

В общем, т.к. работает любое клинт-серверное приложение.

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

Я сейчас мучаюсь с настройкой «клиента». Сервер находится с другой стороны и у него всё прекрасно с доступностью для подключения.

Мне непонятно, как пакеты уходят с клиента, поэтому я задал вопрос про wireguard в этом сообщении.

Вывод команд ip show то и это я в прошлый раз всё это записал на бумажку. Сейчас сравнил. Ничего не поменялось. Но тогда работало, а сейчас не работает.

Einstok_Fair ★★☆
() автор топика
Ответ на: комментарий от anonymous
# ip addr
3: wg3: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.0.3/8 brd 10.255.255.255 scope global wg3
       valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:01:01:01:01:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.2.203/24 brd 192.168.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::fc01:1ff:fe01:102/64 scope link 
       valid_lft forever preferred_lft forever

# ip rule
0:	from all lookup local 
49:	from all oif wg3 lookup wireguard 
50:	from all to 10.0.0.0/8 lookup wireguard 
51:	from 10.0.0.3 lookup wireguard 
32766:	from all lookup main 
32767:	from all lookup default

# ip route show table all
default via 10.0.0.1 dev wg3 table wireguard proto static src 10.0.0.3 
10.0.0.0/8 dev wg3 table wireguard proto static src 10.0.0.3 
default via 192.168.2.1 dev eth0 proto static 
123.45.67.89 via 192.168.2.1 dev eth0 proto static 
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.203 
broadcast 10.0.0.0 dev wg3 table local proto kernel scope link src 10.0.0.3 
local 10.0.0.3 dev wg3 table local proto kernel scope host src 10.0.0.3 
broadcast 10.255.255.255 dev wg3 table local proto kernel scope link src 10.0.0.3 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.2.0 dev eth0 table local proto kernel scope link src 192.168.2.203 
local 192.168.2.203 dev eth0 table local proto kernel scope host src 192.168.2.203 
broadcast 192.168.2.255 dev eth0 table local proto kernel scope link src 192.168.2.203 
local ::1 dev lo proto kernel metric 0 pref medium
local fe80::fc01:1ff:fe01:102 dev eth0 proto kernel metric 0 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
Einstok_Fair ★★☆
() автор топика
Ответ на: комментарий от Einstok_Fair

Пакеты уходят обычно, в начале определяется адресат, кому нужно направить пакет, определяется, что этот адресат доступен в сети wiregiard, он уходит в интерфейс wireguard, там он шифруется открытым ключём.

В этом пакете заголовок с IP адресом назначения из VPN сети и поле с передаваемыми данными.

----------------------------------------------------------------
|  VPN_IP | VPN DATA                                           |
----------------------------------------------------------------

Далее wireguard сервер, а точнее модуль работающий в простанстве ядра смотри какому абоненту на какой адрес нужно отправить шифрованный пакет.

Определяет его и создаёт ещё один IP пакет, в нём уже заголовок с IP адресом назначения из внешней реальной сети, а не VPN и в поле данных находится весь шифрованный IP пакет из VPN сети.

--------------------------------------------------------------
|         | Encrypted Data                                   |
| real_ip | VPN_IP | VPN DATA                                |
--------------------------------------------------------------

После чего пакет уходит через рельный интерфейс.

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

После чего пакет уходит через реальный интерфейс.

Какой из двух? Тот, который настроен в хостовой системе, или тот, который настроен в lxc-контейнере?

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

Какой из двух? Тот, который настроен в хостовой системе, или тот, который настроен в lxc-контейнере?

Тот который настроен в контейнере. Хостовый в контейнере у тебя вероятно не видно вообще.

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

А можно ли сделать так, чтобы пакеты уходили через хостовый интерфейс, а в контейнере был только один интерфейс wgN, без ethM ?

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

У тебя в контейнере должно быть два интерфейса. Один «виртуальный», пакеты, которые отправляются через него не уходят в сеть, а перехватываются и шифруются wireguardом. Второй «настоящий», через который wireguard отправляет шифрованые пакеты в сеть.

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

В начачале через интерфейс контейнера, а потом через интерфейс хост системы, если конечно в контейнер не проброшена сетевая карта как оборуование через passthrough.

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

Да, сейчас вроде бы так и есть, как ты говоришь. Вывод всяких там утилит есть выше.

Но если бы можно было оставить в контейнере только один интерфейс, это было бы интересно.

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

Я думаю, что интерфейс в контейнере включен на хосте в один мост с физическим интерфейсом.

Я так думаю потому что brctl show показывает

# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.f617032c339c	no		dummy0
							enp8s0
							guestos

dummy0 тут для того, чтобы мост не разрушался при отключении интерфейса enp8s0 и неактивном контейнере.

То есть, по моему пониманию, настройка сетевого интерфейса enp8s0 на хосте никак не влияет на хождение пакетов из контейнера, правильно?

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

Но если бы можно было оставить в контейнере только один интерфейс, это было бы интересно.

Нафига?

Можно запустить wireguard на хосте. Будет на хосте два интерфейса, «виртуальный» и «настоящий». Потом в контейнер пробрасываешь только виртуальный.

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

мне непонятны слова «запустить wireguard» (он ведь модуль ядра, а не демон, запускаемый из systemd в пространстве процессов), а так же «пробрасываешь».

Нафига?

для того, чтобы контейнер имел доступ только к VPN и быть уверенным, что он больше никуда не лезет.

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

br0 - это логическое объединение интерфейсов в один логический физический канал.

А далее связь осуществляется посредством IP адресации и если у вас на enp8s0 назначен IP адрес по которому доступен контейнер из вне, то удалив его или опустив, вы потеряете связь с внешним миром и VPN тоже работать не будет.

Т.к. пакет маршрутизируются между IP адресами.

А на dummy0 может висеть IP адрес из внутренней сети, через которую осуществляется связь с контейнерами через панель и прочее.

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

Что попробовать? Если я попробую поменять конфигурацию моста, то у меня пропадёт доступ через ssh к этой машине, на которой lxc-контейнер с клиентом wireguard.

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

Значит делаем вывод, что dummy0 - это какой-то специфический интерфейс, который не имеет связи на физическом уровне к тому физическому каналу, через который есть доступ к интерфейсу хост системы.

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

Можно запустить wireguard на хосте.

мне непонятны слова «запустить wireguard» (он ведь модуль ядра, а не демон, запускаемый из systemd в пространстве процессов)

Ключевое слово — «хосте». «Твоя ситуация сейчас: ip addr выполненый В КОНТЕЙНЕРЕ показывает интерфейс wr3. Тебе нужно: ip addr выполненый НА ХОСТЕ показывает wrЦифра. Т.Е. настроить wireguard не в контейнере, а в хосте.

а так же «пробрасываешь».

Сделай так, чтобы в br0 не было enp8s0, а был wgЦифра.

anonymous
()
Ответ на: комментарий от anonymous
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
    link/ether a6:38:ae:e1:8a:47 brd ff:ff:ff:ff:ff:ff
3: enp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:23:54:2e:e8:22 brd ff:ff:ff:ff:ff:ff
4: enp6s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:23:54:2e:e8:23 brd ff:ff:ff:ff:ff:ff
5: enp7s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:23:54:2e:e8:24 brd ff:ff:ff:ff:ff:ff
6: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:23:54:2e:e8:25 brd ff:ff:ff:ff:ff:ff
7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f6:17:03:2c:33:9c brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.2/24 brd 192.168.2.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::f417:3ff:fe2c:339c/64 scope link 
       valid_lft forever preferred_lft forever
19: guestos@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000
    link/ether fe:81:48:d0:52:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::fc81:48ff:fed0:52a6/64 scope link 
       valid_lft forever preferred_lft forever
Einstok_Fair ★★☆
() автор топика
Ответ на: комментарий от infomeh

я уже писал выше, что dummy0 это неиспользуемый интерфейс, через него пакеты не ходят и нужен он только для того, чтобы мост br0 не пропадал при отключении/подключении enp8s0

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

к enp8s0 подключен физический шнур, которой идёт в сторону NAT, оттуда в интернет, оттуда в сторону серверной части этого wireguard-соединения.

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

Как-то так: настраиваешь wireguard на хосте, получаешь интерфейс wrX. Через brctl создаёшь ещё один мост brX. Убираешь guestos из br0. Добавляешь guestos в brX. Добавляешь wrX в brX. Удаляешь wr3 из контейнера. В контейнере остаётся только eth0, он соеденён с guestos в хосте, guestos соеденён через brX с wrX.

br0 и enp8s0 с настроеным ip-адресом работают по старому, ssh не сломался.

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

это всё верно, и после такой настройки контейнер будет ходить только через VPN. Но это не отвечает на вопрос «почему пакеты не ходят прямо сейчас». Вдруг я перенастрою wireguard на хосте, а пакеты всё ещё не будут ходить?

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

Смотрите, br0 - это своего рода просто коммутатор, свич, в который подключено несколько проводов.

У вас сервер с NAT находится в том же сегменте сети, с той же адресацией (192.168.2.0/24), что и br0.

Поэтому вам и нужно, что бы в br0 был интерфейс enp8s0, т.к. только в этом случае пакет смаршрутизируется до шлюза.

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

Ну дык я тоже не вижу, почему они не ходят.

wireguard-сервер вообще пингуется?

Может пакеты идущие из guestos через br0 попадают не в enp8s0, а в dummy0 и выкидываются нахрен? Попробуй удалить dummy0 из br0.

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

Если из br0 удалить enp8s0, то т.к. IP адрес из сети 192.168.2.0/24 назначен на мост, то пакеты в enp8s0 не пойдут.

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

wireguard-сервер вообще пингуется?

да, он пингуется изнутри контейнера.

пакеты идущие из guestos через br0 попадают не в enp8s0, а в dummy0 и выкидываются нахрен?

Мост отличается от свитча там, что пакеты через него идут во все стороны.

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

Мост отличается от свитча там, что пакеты через него идут во все стороны.

Нет. Но если вас так заботит bridge, тогда настраивайте openvswitch.

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

Попробуй удалить dummy0 из br0.

не получается:

# brctl delif br0 dummy0
# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.f617032c339c	no		dummy0
							enp8s0
							guestos

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

таблицу маршрутизации посмотри.

# ip route show 
default via 192.168.2.1 dev br0 proto static 
192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.2
Einstok_Fair ★★☆
() автор топика
Ответ на: комментарий от Einstok_Fair

А смысл? У него стоит флаг noarp и через него в принципе пакеты не пойдут.

Не понятно вообще, что ты хочешь сделать.

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

Я хочу выяснить причину, по которой пакеты не идут из lxc-контейнера через wireguard с адреса 10.0.0.3 на адрес 10.0.0.1.

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

не получается:

Забей, если сервер из контейнера пингуется, значит нормально br0 работает. Он же не может различать wireguard/не wireguard.

iptables нечего не режет?

Ломается не маршрутизация, а сам wireguard? Тупо перезагрузиться пробовал?

Настройки wireguardа?

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

Смотрите, в контейнере у вас есть:

eth0: 192.168.2.203/24
wg3: 10.0.0.3/8

На хост системе:

br0: 192.168.2.2/24
guestos@if18: нет адреса
enp8s0: нет адреса

В br0 есть интерфейсы dummy0, guestos и enp8s0.
192.168.2.1 - шлюз для сети 192.168.2.0/24, через который либо доступен VPN сервер, либо он поднят на нём.

Когда пакет пойдет до VPN сервера он должен иметь доступ до 192.168.2.1, а для этого т.к. на хосте адрес из 192.168.2.0 назначен на br0, а на enp8s0 нет адреса и в контейнере такое же адресное пространство, в котором находится и шлюз 192.168.2.1, то все участники сети должны быть в одном физическом канале.

Т.е. guestos и enp8s0 должны быть либо подключены к одному свичу, либо в нашем случае к одному мосту.

Т.к. когда приходит пакет и ядро принимает решение куда его, а точнее на какой интерфейс его направить оно в начале ище интерфейс с той же сеть, что и IP назначение и что бы пакет дошёл от адреса 192.168.2.203 до 192.168.2.1 в мостдолжны быть объединены enp8s0, через который доступен 192.168.2.1 и guestos, а IP адреса на br0 может не быть.

Но если нужно подключаться по SSH из сети 192.168.2.0 на хост, то в данном случае IP адрес может быть назначен либо на br0, либо на enp8s0.

В такой схеме постероения сети всё будет работать только так.

Т.е. для того, что бы пакет ищ

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

И, скорее всего, когда откючается провод от enp8s0 он вываливается из моста или не происходит поднятие enp8s0 после переподключения провода.

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

Тупо перезагрузиться пробовал?

да (только что), ничего не меняется, пакеты ходить не начинают.

iptables нечего не режет?

не режет. Раньше же работало, и я его не перенастраивал.

Настройки wireguardа?

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

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

в мостдолжны быть объединены enp8s0, через который доступен 192.168.2.1 и guestos

так и есть

IP адрес может быть назначен ... на br0

так и есть

когда откючается провод от enp8s0 он вываливается из моста или не происходит поднятие enp8s0 после переподключения провода.

тогда бы не работал ssh, и выше мы видим, что enp8s0 в мосте.

А пакеты по wireguard не ходят.

Я так и не понял, что надо сделать, чтобы начали.

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

192.168.2.1 из контейнера сейчас пингуется, а в VPN пакет не ходят?

да. И это не «сейчас», а так и было с начала топика.

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

Что конкретно надо проверять?

Если бы кто знал.

После сбоя питания у тебя не меняется внешний ip-адрес? Сервер тебя не зафильтровал?

10.0.0.1 вообще существует?

Подсеть на сервере точно 10.0.0.0/8?

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