Доступ к открытым портам внутри сетевого пространства имен

Вопрос или проблема

У меня есть сетевое пространство имен, созданное с помощью WireGuard, и tinyproxy, определенное как:

age.identityPaths = [ "..." ];
age.secrets.protonvpn.file = ./protonvpn.age;
networking.wireguard.interfaces.protonvpn = {
  interfaceNamespace = "protonvpn";
  preSetup = "test -f /run/netns/protonvpn || ip netns add protonvpn || test -f /run/netns/protonvpn";
  postSetup = ''
    ${pkgs.iproute2}/bin/ip link add veth-main type veth peer name veth-protonvpn
    ${pkgs.iproute2}/bin/ip link set veth-protonvpn netns protonvpn
    ${pkgs.iproute2}/bin/ip addr add 192.168.100.1/24 dev veth-main
    ${pkgs.iproute2}/bin/ip netns exec protonvpn ip addr add 192.168.100.100/24 dev veth-protonvpn
    ${pkgs.iproute2}/bin/ip link set veth-main up
    ${pkgs.iproute2}/bin/ip netns exec protonvpn ip link set veth-protonvpn up
    ${pkgs.iproute2}/bin/ip route add 192.168.100.100 dev veth-main
  '';

  privateKeyFile = config.age.secrets.protonvpn.path;
  ips = [ "10.2.0.2/32" ];

  peers = [{
    publicKey = "...";
    endpoint = "...";
    allowedIPs = [ "0.0.0.0/0" "::/0" ];
  }];
};

services.tinyproxy = {
  enable = true;
  settings = {
    Allow = "0.0.0.0/0";
    Listen = "0.0.0.0";
    Port = 31281;
  };
};

systemd.services.tinyproxy =  {
  bindsTo = [ "wireguard-protonvpn.service" ];
  after = [ "wireguard-protonvpn.service" ];
  serviceConfig.NetworkNamespacePath = "/run/netns/protonvpn";
};

Интерфейсы правильно настроены:

$ ip addr
...
11: veth-main@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 76:5e:2f:14:dd:ed brd ff:ff:ff:ff:ff:ff link-netns protonvpn
    inet 192.168.100.1/24 scope global veth-main
       valid_lft forever preferred_lft forever
    inet6 fe80::f4e0:7aff:fe81:10da/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

В пространстве имен:

$ sudo ip netns exec protonvpn 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 noprefixroute 
       valid_lft forever preferred_lft forever
9: protonvpn: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.2.0.2/32 scope global protonvpn
       valid_lft forever preferred_lft forever
10: veth-protonvpn@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ae:d1:5f:b6:e2:a5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.100/24 scope global veth-protonvpn
       valid_lft forever preferred_lft forever
    inet6 fe80::acd1:5fff:feb6:e2a5/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

Я могу пинговать в обе стороны, службы работают нормально, но я не могу к ним подключиться:

$ curl --proxy http://192.168.100.100:31281 https://ifconfig.co
curl: (28) Не удалось подключиться к 192.168.100.100 порт 31281 после 134699 мс: Не удалось подключиться к серверу

Как я могу настроить свое сетевое пространство имен, чтобы я мог к нему подключиться?

Ответ или решение

Доступ к открытым портам внутри сетевого пространства имен

Введение

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

1. Понимание сетевого пространства имен

Сетевые пространства имен (network namespaces) в Linux позволяют изолировать сетевые конфигурации между различными приложениями или сервисами. Каждый сетевой пространств имен имеет свою собственную сетевую стеки и отдельные интерфейсы. Это может усложнить подключение к сервисам, работающим внутри этого пространства имен, если не настроена правильная маршрутизация.

2. Факторы, влияющие на доступ к портам

Несмотря на то, что вы можете пинговать обоих интерфейсов (как veth-main, так и veth-protonvpn), возникновение проблемы «Failed to connect» может быть связано с несколькими факторами:

  • Брандмауэр: Убедитесь, что никакие правила брандмауэра не блокируют доступ к порту 31281.
  • Настройки tinyproxy: Проверка конфигурации tinyproxy, включая разрешенные IP-адреса.
  • Сетевые маршруты: Неправильная маршрутизация может помешать подключению.

3. Проверка и настройка конфигурации tinyproxy

Ваши настройки tinyproxy выглядят корректно, но для уверенности вам стоит сделать следующее:

Allow = "0.0.0.0/0";
Listen = "0.0.0.0";  // Это уже указано, но проверьте, что tinyproxy слушает на всех интерфейсах
Port = 31281;

Попробуйте изменить Listen на 192.168.100.100, чтобы явно указать, на каком IP-адресе tinyproxy должен принимать подключения.

4. Проверка работы tinyproxy

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

sudo ip netns exec protonvpn curl -x http://127.0.0.1:31281 http://ifconfig.co

Это проверит, работает ли прокси внутри своего пространства имен. Если ответ положительный, и вы получаете ожидаемый вывод, это подтверждает, что tinyproxy функционирует.

5. Убедитесь, что доступ к tinyproxy осуществляется правильно

Когда вы проверяете подключение из другого пространства имен или из основной системы, убедитесь, что вы используете правильный IP-адрес и порт:

curl --proxy http://192.168.100.100:31281 https://ifconfig.co

6. Настройка маршрутов

Обратите внимание на маршруты. Ваша команда ip route add должна быть корректно настроена для маршрутизации трафика на нужный IP:

${pkgs.iproute2}/bin/ip route add 192.168.100.100 dev veth-main

7. Проверка брандмауэра

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

sudo iptables -L -n

Заключение

Для решения проблемы отсутствия доступа к порту внутри сетевого пространства имен вам следует проверить настройки tinyproxy, маршрутизация и возможные блокировки со стороны брандмауэра. Постепенно уточняя проблемы, вы сможете добиться успешного подключения. Если все вышеперечисленное не решает ваши проблемы, стоит также изучить логи tinyproxy и системные логи для получения более детальной информации о сбоях.

Оцените материал
Добавить комментарий

Капча загружается...