Маршрутизация на роутере для PC -> PC with Proxy

Приветствую, задача переводить весь трафик от определенных машин в локальной сети через машину в той же локальной сети на которой установлена прокси dokodemo-door.
У меня обычный роутер ASUS с дефолтной прошивкой, перепрошивать на OpenWRT и т.д. я не планирую. На текущей прошифки доступны буквально route \ iptables.

Я создал скрипт для этого. И проблема в том, что на client машине пропадает интернет. В статистике я вижу что на вход прокси идет трафик, НО выходного(обратного на клиент) трафика 0 байт. Прокси настроена правильно, весь входной трафик идет на DIRECT (в директ статистике я также вижу на выход в интернет идущие байты).
В чём может быть проблема?

Во второй версии я добавил правила MASQUERADE.
В третьем варианте я добавил правила FORWARD.
Поведение абсолютно одинаковое… Просто пробовал, насколько понимаю MASQUERADE, FORWARD не нужны, т.к. на роутере будут обратные NAT адреса определяться по таблице DNAT.
Вообще концепция работоспособная или я запутался?
image

#!/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 работает?

Если без каких изменений в iptables , интернет в браузере работает, ваша команда выдает:

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

dokodemo-door.
Когда я через него пытался Wireguard перекинуть, то он работал. Я посчитал что он корректно работает.
Возможно такие настройки подходят для WG, но не clear трафика?

{
  "id": 2,
  "userId": 0,
  "up": 3240,
  "down": 0,
  "total": 0,
  "remark": "in_proxy",
  "enable": true,
  "expiryTime": 0,
  "listen": "",
  "port": 43844,
  "protocol": "dokodemo-door",
  "settings": "{\n  \"network\": \"tcp,udp\",\n  \"followRedirect\": true\n}",
  "streamSettings": "",
  "tag": "inbound-35466",
  "sniffing": "{\n  \"enabled\": true,\n  \"destOverride\": [\n    \"http\",\n    \"tls\",\n    \"quic\"\n  ],\n  \"metadataOnly\": false,\n  \"routeOnly\": true\n}",
  "clientStats": []
}

логи нужно было включать с самого начала, и вы скорее всего взяли конфиг xray из примера где использовалcя iptables TPROXY а не DNAT. у вас в сниффинге как минимум включен routeOnly, значит xray даже не будет резолвить адрес ваших доменов и будет гонять трафик из direct out в свой же in_proxy.

включайте debug лог и запускайте мою команду заново, смотрите что в нём

Там бесконечно повторяется access. Походу зацикливается сам на себя
192.168.50.198 - это IP сервера с прокси. 35466 порт прокси

2024/11/22 16:36:47 from 192.168.50.198:57407 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:47 from 192.168.50.198:57224 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:47 from 192.168.50.198:57226 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:47 from 192.168.50.198:57228 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:48 from 192.168.50.198:57230 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:48 from 192.168.50.198:57395 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:48 from 192.168.50.198:57415 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:48 from 192.168.50.198:57417 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:49 from 192.168.50.198:57429 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:49 from 192.168.50.198:57431 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:49 from 192.168.50.198:57441 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:49 from 192.168.50.198:57451 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:49 from 192.168.50.198:57457 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:50 from 192.168.50.198:57463 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:50 from 192.168.50.198:57473 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:50 from 192.168.50.198:57477 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:50 from 192.168.50.198:57489 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:51 from 192.168.50.198:57493 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]
2024/11/22 16:36:51 from 192.168.50.198:57232 accepted tcp:192.168.50.198:35466 [inbound-35466 >> direct]

routeOnly: false

или вот уже готовый конф sing-box

{
    "dns": {
        "servers": [
            {
                "address": "1.1.1.1",
                "detour": "direct",
                "strategy": "prefer_ipv4",
                "tag": "dns-remote"
            }
        ]
    },
    "inbounds": [
        {
            "domain_strategy": "prefer_ipv4",
            "listen": "0.0.0.0",
            "listen_port": 43844,
            "sniff": true,
            "sniff_override_destination": true,
            "tag": "direct-proxy",
            "type": "direct"
        }
    ],
    "log": {
        "level": "debug"
    },
    "outbounds": [
		{
            "tag": "direct",
            "type": "direct"
        },
        {
            "tag": "direct-proxy",
            "type": "direct",
			"override_port": 443
        },
        {
            "tag": "block",
            "type": "block"
        },
        {
            "tag": "dns-out",
            "type": "dns"
        }
    ],
    "route": {
      "final": "direct",
        "rules": [
            {
                "outbound": "dns-out",
                "protocol": "dns"
            },
            {
                "inbound": "direct-proxy",
                "outbound": "direct-proxy"
            }
        ]
    }
}


Да так не зацикливается

всего 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

у меня xray , конфиг выше не подходит.

Да вижу странно что стало tcp:2ip.me:35466

а, так ты сам поменял порт, в начале ты кидал конфиг с другим портом, нужно правило override как я сделал на синге, или делай порт прокси 443

да в первом посте был другой порт прокси, просто я удалил и еще раз создал, сейчас порт прокси 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.

тогда вам нужна другая схема проксирования трафика, например можно сделать шлюзом не роутер а 192.168.50.198, на котором уже будет tproxy или tun


вот такой исходный пакет 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

  1. установка TCP соединения где нету никакой информации о протокольной информации. Установка соединения будет от случайного порта TCP: 192.168.50.36:1234 → 192.168.50.198:35466
  2. После установки TCP, в этом канале идет пакет HTTP, у которого уже есть и адрес и заголовки
    GET /
    HOST: Host: myip.com:8080

Когда в xray sniffer с опцией HTTP включён, как раз и получает эту информацию, по этой информации идет маршрутизация. Так почему он не делает DIRECT запрос по этой информации.
Разве это не баг? Где я ошибаюсь?