Приветствую, задача переводить весь трафик от определенных машин в локальной сети через машину в той же локальной сети на которой установлена прокси dokodemo-door.
У меня обычный роутер ASUS с дефолтной прошивкой, перепрошивать на OpenWRT и т.д. я не планирую. На текущей прошифки доступны буквально route \ iptables.
Я создал скрипт для этого. И проблема в том, что на client машине пропадает интернет. В статистике я вижу что на вход прокси идет трафик, НО выходного(обратного на клиент) трафика 0 байт. Прокси настроена правильно, весь входной трафик идет на DIRECT (в директ статистике я также вижу на выход в интернет идущие байты).
В чём может быть проблема?
Во второй версии я добавил правила MASQUERADE.
В третьем варианте я добавил правила FORWARD.
Поведение абсолютно одинаковое… Просто пробовал, насколько понимаю MASQUERADE, FORWARD не нужны, т.к. на роутере будут обратные NAT адреса определяться по таблице DNAT.
Вообще концепция работоспособная или я запутался?
#!/bin/sh
# Конфигурация
PROXY_IP="192.168.0.3"
PROXY_PORT="43844"
CHAIN_NAME="xchain"
CLIENTS="192.168.0.2"
iptables -t nat -N $CHAIN_NAME 2>/dev/null
# Убедимся, что цепочка подключена к PREROUTING
iptables -t nat -C PREROUTING -j $CHAIN_NAME 2>/dev/null || iptables -t nat -A PREROUTING -j $CHAIN_NAME
for CLIENT in $CLIENTS; do
iptables -t nat -A $CHAIN_NAME -s $CLIENT -p tcp -j DNAT --to-destination $PROXY_IP:$PROXY_PORT
iptables -t nat -A $CHAIN_NAME -s $CLIENT -p udp -j DNAT --to-destination $PROXY_IP:$PROXY_PORT
done
iptables -t nat -A POSTROUTING -d $PROXY_IP -p tcp --dport $PROXY_PORT -j MASQUERADE
iptables -t nat -A POSTROUTING -d $PROXY_IP -p udp --dport $PROXY_PORT -j MASQUERADE
iptables -A FORWARD -s $CLIENTS -d $PROXY_IP -p tcp -j ACCEPT
iptables -A FORWARD -s $CLIENTS -d $PROXY_IP -p udp -j ACCEPT
iptables -A FORWARD -s $PROXY_IP -d $CLIENTS -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $PROXY_IP -d $CLIENTS -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
для теста будет достаточно двух правил, зачем раздувать до скрипта когда еще ничего не работает?
на 192.168.0.2 команда curl --connect-to ::192.168.0.3:43844 https://2ip.me работает?
dokodemo-door.
Когда я через него пытался Wireguard перекинуть, то он работал. Я посчитал что он корректно работает.
Возможно такие настройки подходят для WG, но не clear трафика?
логи нужно было включать с самого начала, и вы скорее всего взяли конфиг xray из примера где использовалcя iptables TPROXY а не DNAT. у вас в сниффинге как минимум включен routeOnly, значит xray даже не будет резолвить адрес ваших доменов и будет гонять трафик из direct out в свой же in_proxy.
включайте debug лог и запускайте мою команду заново, смотрите что в нём
всего 1 строка от CLIENT → PROXY SERVER access.log 2024/11/22 16:42:18 from 192.168.50.36:53548 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
error.log info:
2024/11/22 16:45:22 [Info] [1036928119] proxy/dokodemo: received request for 192.168.50.36:38966
2024/11/22 16:45:22 [Info] [1036928119] app/dispatcher: sniffed domain: 2ip.me
2024/11/22 16:45:22 [Info] [1036928119] app/dispatcher: default route for tcp:2ip.me:35466
2024/11/22 16:45:22 [Info] [1036928119] transport/internet/tcp: dialing TCP to tcp:2ip.me:35466
Ошибка:
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 2ip.me:443
почему-то порт назначения стал 35466, хз откуда это число, xray не пользуюсь, пробуй конф синга который выше дал, но я бы порт прокси на 443 сменил чтобы не писать правило override
да в первом посте был другой порт прокси, просто я удалил и еще раз создал, сейчас порт прокси 35466.
Но я как понимаю порт всеравно в логах не должен меняться , если я вызвал curl 2ip.me:433, то в логах xray dialing TCP to должен быть 433, а не 2ip.me:35466.
он и не меняется, curl отправляет пакеты на 192.168.50.198:35466, порта 443 в данных нигде нет, в данных пакета есть домен который xray сниффит и меняет адрес назначения с 192.168.50.198 на адрес домена, больше ничего не происходит, порт назначения нужно менять вручную: нужен новый direct outbound с редиректом на порт 443, хз можно ли сделать такой в xray, для синга я уже дал готовый конфиг, советую перейти на него
а для чего это нужно? чтобы только HTTPS сайты работали? Странный move, например если я захочу сделать запрос к 80.80.80.80:555, то мне не нужно чтобы порт override на 443.
вот такой исходный пакет TCP пакете отправлен в прокси, соответственно когда прокси примит его, у прокси будет информация и о 555 порте и о 35466 порте.
У меня ощущение что это должно работать без tproxy или tun, но он берет свой Destination port и лепит к REQUEST , вместо Source port 555.
Source port это рандомный порт который генерится для каждого исх. соединения, 555 в вашем примере это dest port, 35466 это тоже dest port.
Пример: Чтобы подключиться к 1.1.1.1(dest addr):443(dest port) используется 192.168.1.123(source addr):7375(source port)
Я в тильте до вечера. Почитал о механизмах работы сети.
Как я понял и пообщавшись в chatgpt
установка TCP соединения где нету никакой информации о протокольной информации. Установка соединения будет от случайного порта TCP: 192.168.50.36:1234 → 192.168.50.198:35466
После установки TCP, в этом канале идет пакет HTTP, у которого уже есть и адрес и заголовки
GET /
HOST: Host: myip.com:8080
Когда в xray sniffer с опцией HTTP включён, как раз и получает эту информацию, по этой информации идет маршрутизация. Так почему он не делает DIRECT запрос по этой информации.
Разве это не баг? Где я ошибаюсь?