Рейтинг:0

Почему пакеты netcat перенаправляются по правилам iptables, а не по запросу curl?

флаг in

Я пытаюсь направить весь свой трафик через туннель SSH/прокси-сервер SOCKS5. У меня есть некоторые правила IP-таблиц, настроенные для перенаправления (почти) всего трафика в программу на основе сокетов, которая затем согласовывает и перенаправляет трафик на прокси-сервер SOCKS5. Я обнаружил, что не весь мой трафик перенаправляется должным образом, и я подозреваю, что это моя проблема. iptables правила, которые не работают. Кто-нибудь согласится одолжить мне вторую пару глаз?

Например, я могу запустить 8.8.8.8 80 2>&1 и я вижу в своей программе на основе сокетов, что происходит перенаправление. Но когда я завиток google.com, я получаю ошибку разрешения: curl: (6) Не удалось разрешить хост: google.com. В моей программе на основе сокетов нет журналов, которые показывают, что была предпринята попытка перенаправления.

У меня есть программа на основе сокетов, прослушивающая 0.0.0.0:9900 а прокси-сервер SOCKS5 инициируется, например, на порту 9901. Я запускаю все это в контейнере Docker, если это имеет значение (но я не думаю, что это должно иметь большое значение...).

Я инициирую прокси-сервер SOCKS5, например:

#!/usr/bin/env bash

ssh -D 127.0.0.1:9901 -N пользователь@192.168.0.25

Вот iptables правила, которые я использую:

#!/usr/bin/env bash

# Создать новую цепочку в таблице NAT.
iptables -t nat --new-chain ПОЛЬЗОВАТЕЛЬСКИЙ

# Создайте правило, позволяющее не трогать пакеты, предназначенные для локального хоста.
iptables -t nat --append CUSTOM --destination 127.0.0.0/8 --jump RETURN

# Создайте правило для выхода из туннеля, который мы создадим в одиночку.
# 192.168.0.25 — это статический IP-адрес машины, на которой работает сервер SOCKS5.
iptables -t nat --append CUSTOM --destination 192.168.0.25 --protocol tcp --destination-port 22 --jump RETURN

# Создайте правило для перенаправления всего остального трафика TCP через туннель SSH.
iptables -t nat --append CUSTOM --protocol tcp --jump LOG --информация на уровне журнала --log-prefix='[iptables] '
iptables -t nat --append CUSTOM --protocol tcp --jump REDIRECT --to-ports 9900

# Свяжите цепочки OUTPUT и PREROUTING таблицы NAT с нашей пользовательской цепочкой.
iptables -t nat -I ВЫВОД 1 --jump ПОЛЬЗОВАТЕЛЬСКИЙ
iptables -t nat -I PREROUTING 1 --jump CUSTOM

А вот и полный вывод iptables -t nat -L -v:

Цепочка PREROUTING (политика ACCEPT 165 пакетов, 21537 байт)
 pkts bytes target prot opt ​​in out source target         
  165 21537 ПОЛЬЗОВАТЕЛЬСКАЯ все -- любая любая где угодно где угодно            
 5129 389K DOCKER все -- любое любое где угодно ADDRTYPE соответствует dst-type LOCAL
 6987 1026K delegate_prerouting all -- любой любой везде где угодно            

Цепочка INPUT (политика ACCEPT 114 пакетов, 8854 байта)
 pkts bytes target prot opt ​​in out source target         

Цепочка OUTPUT (политика ACCEPT 40 пакетов, 2369 байт)
 pkts bytes target prot opt ​​in out source target         
   40 2369 ПОЛЬЗОВАТЕЛЬСКОЕ все -- любое любое в любом месте в любом месте            
    0 0 DOCKER все -- любое любое где угодно !127.0.0.0/8 ADDRTYPE соответствует dst-type LOCAL

Цепочка POSTROUTING (политика ACCEPT 39 пакетов, 2301 байт)
 pkts bytes target prot opt ​​in out source target         
   72 9027 MASQUERADE all -- any !docker0 172.17.0.0/16 везде            
 1614 99565 delegate_postrouting all -- любой любой везде где угодно            

Сеть DOCKER (2 ссылки)
 pkts bytes target prot opt ​​in out source target         
    0 0 RETURN all -- docker0 любой где угодно где угодно            

Цепочка CUSTOM (2 ссылки)
 pkts bytes target prot opt ​​in out source target         
   39 2301 ВОЗВРАТ все -- любой любой любой 127.0.0.0/8         
    0 0 RETURN tcp -- любой любой любой 192.168.0.25 tcp dpt:ssh
    0 0 LOG tcp -- любой любой в любом месте Префикс информации об уровне журнала "[iptables] "
    0 0 ПЕРЕНАПРАВЛЕНИЕ tcp -- любое любое куда угодно перенаправить порты 9900

Цепь МИНЮНППД (2 наименования)
 pkts bytes target prot opt ​​in out source target         

Сеть delegate_postrouting (1 упоминание)
 pkts bytes target prot opt ​​in out source target         
 1614 99565 postrouting_rule all -- любой любой где угодно /* цепочка пользователей для постмаршрутизации */
    0 0 zone_lan_postrouting all -- любой br-lan в любом месте в любом месте            
    0 0 zone_wifi_postrouting all -- любой br-wifi везде где угодно            
   55 5757 zone_wan_postrouting all -- любой eth0 в любом месте в любом месте            

Сеть delegate_prerouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
 6987 1026K prerouting_rule all -- любой любой где угодно /* цепочка пользователей для предварительной маршрутизации */
 4545 342K zone_lan_prerouting all -- br-lan любой где угодно где угодно            
    1 32 zone_wifi_prerouting all -- br-wifi в любом месте в любом месте            
 2441 684K zone_wan_prerouting all -- eth0 любой где угодно где угодно            

Сеть postrouting_lan_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Цепочка postrouting_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Сеть postrouting_wan_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Сеть postrouting_wifi_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Сеть prerouting_lan_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Цепь prerouting_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Сеть prerouting_wan_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Сеть prerouting_wifi_rule (1 ссылка)
 pkts bytes target prot opt ​​in out source target         

Сеть zone_lan_postrouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
    0 0 postrouting_lan_rule all -- любой любой где угодно /* цепочка пользователей для постмаршрутизации */

Сеть zone_lan_prerouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
 4545 342K prerouting_lan_rule all -- любой любой где угодно в любом месте /* цепочка пользователей для предварительной маршрутизации */

Сеть zone_wan_postrouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
   55 5757 postrouting_wan_rule all -- любой любой где угодно /* цепочка пользователей для постмаршрутизации */
   55 5757 МАСКАРАД все -- любой любой где угодно где угодно            

Сеть zone_wan_prerouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
 2441 684K MINIUPNPD все -- любые любые где угодно где угодно            
 2441 684K MINIUPNPD все -- любые любые где угодно где угодно            
 2441 684K prerouting_wan_rule all -- любой любой везде где угодно /* цепочка пользователей для предварительной маршрутизации */

Сеть zone_wifi_postrouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
    0 0 postrouting_wifi_rule all -- любой любой где угодно /* цепочка пользователей для постмаршрутизации */

Сеть zone_wifi_prerouting (1 ссылка)
 pkts bytes target prot opt ​​in out source target         
    1 32 prerouting_wifi_rule all -- любой любой где угодно /* цепочка пользователей для предварительной маршрутизации */

Дайте мне знать, если есть какая-либо другая информация, которую я должен включить, и заранее спасибо!

dave_thompson_085 avatar
флаг jp
Проблема не в curl, а в DNS, который использует UDP, а не TCP (за исключением некоторых особых случаев, которые здесь не актуальны), и хотя iptables может перенаправлять UDP (с соответствующими изменениями), вы не можете отправить его через туннель OpenSSH. `curl http://142.250.65.206` будет перенаправлен на одну из (многих) систем Google, хотя он просто даст вам 301 на www.google.com, который находится по _разным_ адресам, включая 142.250.251.32, что даст еще 301 для запроса с использованием IP-адреса. Большая часть Интернета зависит от DNS, и попытки использовать адреса «вручную» чаще всего вызывают проблемы. Может быть, вы хотите VPN.
Рейтинг:0
флаг cn

Добро пожаловать в StackOverflow!

Основываясь на ошибке вашего запроса curl, кажется, что запрос DNS завершается сбоем еще до того, как будет предпринята попытка подключения к google.com.

В системах POSIX разрешение DNS контролируется файлом /etc/resolv.conf. Если этот файл не содержит строк сервера имен, ваша система не сможет разрешить хост. Добавить его можно так же просто, как добавить эту строку:

сервер имен 8.8.8.8

В более новых системах Linux разрешение может контролироваться systemd-resolved, и вы увидите такую ​​строку:

сервер имен 127.0.0.53

В этом случае редактирование /etc/resolv.conf файл будет только временным решением, так как systemd будет периодически перезаписывать файл. В этом случае вам нужно будет отредактировать конфигурацию netplan в /и т.д./сетевой план/ или отключить systemd-resolved.

Использованная литература:

t-r0d avatar
флаг in
Спасибо за отзыв! Я согласен с тем, что DNS дает сбой, но не приведет ли ваше предложение к тому, что DNS будет работать на стороне клиента? Я хотел бы, чтобы разрешение DNS происходило на удаленной машине (сервере SSH).
dave_thompson_085 avatar
флаг jp
Нет; DNS использует UDP, который вы не можете перенаправить через SSH.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.