- Вопрос или проблема
- Ответ или решение
- Доступ к открытым портам внутри сетевого пространства имен
- Введение
- 1. Понимание сетевого пространства имен
- 2. Факторы, влияющие на доступ к портам
- 3. Проверка и настройка конфигурации tinyproxy
- 4. Проверка работы tinyproxy
- 5. Убедитесь, что доступ к tinyproxy осуществляется правильно
- 6. Настройка маршрутов
- 7. Проверка брандмауэра
- Заключение
Вопрос или проблема
У меня есть сетевое пространство имен, созданное с помощью 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 и системные логи для получения более детальной информации о сбоях.