Keenetic + icmp до заблокированных хостов

Суть проблемы - есть полоумная косилка, которая постоянно пингует поддомены *.amazonaws.com для проверки качества сети(видно на tcpdump)

В силу заблокированности пинги не ходят либо ходят нерегулярно, косилка раз в 5 минут вслух жалуется на плохую сеть а я медленно схожу с ума)

При этом по факту связь есть, полезный траффик успешно проксируется, косилка косит. Есть ли способ силами стоковой прошивки keenetic каким-то образом либо зароутить icmp траффик либо так или иначе подделать успешный эхо-реплай от целевого хоста? entware нету(нет usb порта), средства обхода блокировок развёрнуты на сателлитном одноплатнике.

А DNS у неё свой? Если нет, пусть пингует саму себя)

127.0.0.1 <aws domain>

К моему глубочайшему сожалению - она их не только пингует, но и должна по идее обмениваться каким-то траффиком. Как именно - я точно не знаю, знаю только что она по идее должна работать через aws iot, но в дампе траффика вижу только обмен траффиком с api.anthbot.com и бесконечный перебор амазоновских хостов.

Sing-box / mihomo tun режим с фейк icmp ответами.
Ну и полное проксирование амазона

На любой не заблок впске поднять tls proxy и прописать ip в хостс роутера или в nextdns. У меня для tls proxy запущен sing-box, могу скинуть конф (или даже на своей впске разрешить твои домены, но без гарантий долговечности)

А на xray не работает? Пробовал делать tun inbound

  {
    "tag": "tun_in",
    "protocol": "tun",
    "settings": {
      "name": "xray0",
      "gateway": [
        "172.20.0.1/30",
        "fc00::1/64"
      ],
      "stack": "system",
      "mtu": 1500
    }

Но почему-то интерфейс xray0 не получает ipv4 адрес. Да и ipv6 получает только link local

Хотя доке как будто соответствует

Да как бы цепочка впсок своя есть. Я что-то возможно туплю просто

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

Не, у меня как раз через него и сделано. На одноплатнике живёт xray, ciadpi и wireproxy_awg и вешают наружу порт с сокс проксёй.

Так проверь вручную ходят ли пинги или нет, фейк они или реальные, до 1.2.3.4 и 1.1.1.1 например. Если есть авг сервер то почему просто не зароутить сети обычным встроенным awg в кинетике?

Разумеется я проверил. И нет, не ходят

Размеется проверил но не написал…

Я думал, что ответ “не, у меня через него и работает” подразумевает - опробовано, не прокатило)

Там разве не надо ещё штатными линуксовыми средствами роутинг писать?

Тогда наверное из пушки по желудям, что-то вроде:

Только этот мануал устарел, этот протокол теперь tunnel называется и возможно ещё что-то изменилось.

Потому что кинетик это поделка для домохозяек и NDM не умеет подтягивать адреса с интерфейса сама. Их нужно сообщить комнадами ndm вручную. А ipv6 не будет работать, если интерфейс не будет выбран главным в роутере и если не будет хотя бы /64 префикса на интерфейсе.

Я из этой ишью понял так, что он таки должен сам получить адрес

Плюс такая дока есть

В любом случае, даже если я добавляю на интерфейс адрес ручками - всё равно не катит

ip addr add 172.20.0.1/30 dev xray0
ip addr add 192.168.86.11/24 dev eth0
iptables -t nat -A PREROUTING -d 192.168.86.11 -j DNAT --to-destination 172.20.0.1
iptables -t nat -A POSTROUTING -o xray0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o xray0 -j ACCEPT
iptables -A FORWARD -i xray0 -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

На роутере соотв. маршрут через 192.168.86.11 до нужных хостов

Согласен. Но тут безвыходная ситуация, нельзя было ставить роутер, с которым бы без меня не справилась ТП провайдера. Так что некротик отменился.

v6 тоже отсутствует, нужен только v4

Не совсем понял. Промежуточный xray стоит на одноплатнике с честным линухом. На кинетике роутинг идёт через их новую фичу DNS маршрутов.

в таком случае то, что я писал не важно

Решил добить проблему и кажется нашёл решение

Вот этот проект GitHub - sensepost/wiresocks: A sock, with a wire, so you can tunnel all you desire. · GitHub

Правда его пришлось переделать

Исправленный docker-compose
version: '3.9'
services:

  wiresocks:
    image: wiresocks_mod:latest
    build:
      dockerfile: Dockerfile
    container_name: wiresocks
    mem_limit: 256m
    memswap_limit: 0m
    mem_reservation: 128m
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      - LOGLEVEL=${LOGLEVEL:-error}
      - TUN=tun0
      - ADDR=198.18.0.1/15
      - MTU=9000
      - PROXY=${PROXY_ADDRESS}
      - TUN_INCLUDED_ROUTES=${TARGET_ROUTES}
      - RESTAPI=
      - TCP_SNDBUF=
      - TCP_RCVBUF=
      - TCP_AUTO_TUNING=1
      - UDP_TIMEOUT=
      - EXTRA_COMMANDS=
    networks:
      - wiresocks
    extra_hosts:
      - host.docker.internal:host-gateway
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    ports:
      - ${WG_UDP_PORT}:${WG_UDP_PORT}/udp
    volumes:
      - ./config/coredns:/config/coredns
    restart: unless-stopped

  wireguard:
    image: lscr.io/linuxserver/wireguard
    container_name: wireguard
    depends_on:
      - wiresocks
    cap_add:
      - NET_ADMIN
      - SYS_ADMIN
    env_file:
      - .env
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - SERVERPORT=${WG_UDP_PORT}
      - SERVERURL=${WG_HOST}
      - PEERS=${WG_PEERS}
      - INTERNAL_SUBNET=10.13.13.0
      - ALLOWEDIPS=10.13.13.0/24,${TARGET_ROUTES}
      - TARGET_ROOT_DOMAINS=${TARGET_ROOT_DOMAINS}
    volumes:
      - ./config:/config
      - /lib/modules:/lib/modules
      - ./init.d:/custom-cont-init.d:ro
      - ./config/coredns:/config/coredns:ro
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    network_mode: container:wiresocks
    restart: always

networks:
  wiresocks:
    name: wiresocks
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: wiresocks0
Исправленный entrypoint.sh
#!/bin/sh

# Modified version of 
# https://github.com/xjasonlyu/tun2socks/blob/main/docker/entrypoint.sh

# Create Corefile with correct upstream DNS servers before anything else
create_corefile() {
  # Use the path where wireguard expects Corefile
  COREFILE_PATH="${COREFILE_PATH:-/config/coredns/Corefile}"
  COREFILE_DIR=$(dirname "$COREFILE_PATH")
  
  # Create directory if it doesn't exist
  if [ ! -d "$COREFILE_DIR" ]; then
    mkdir -p "$COREFILE_DIR" 2>/dev/null || true
    echo "Created directory: $COREFILE_DIR"
  fi
  
  # Always overwrite Corefile to ensure correct configuration
  echo "Creating Corefile at $COREFILE_PATH with upstream DNS: 8.8.8.8 1.1.1.1"
  cat > "$COREFILE_PATH" << 'EOF'
. {
    forward . 8.8.8.8 1.1.1.1 {
        prefer_udp
    }
    log
    errors
}
EOF
  chmod 644 "$COREFILE_PATH" 2>/dev/null || true
  echo "Corefile created successfully at $COREFILE_PATH"
  
  # Also create in the shared location for backup
  SHARED_PATH="/corefile/Corefile"
  SHARED_DIR=$(dirname "$SHARED_PATH")
  if [ ! -d "$SHARED_DIR" ]; then
    mkdir -p "$SHARED_DIR" 2>/dev/null || true
  fi
  cp "$COREFILE_PATH" "$SHARED_PATH" 2>/dev/null || true
}

TUN="${TUN:-tun0}"
ADDR="${ADDR:-198.18.0.1/15}"
LOGLEVEL="${LOGLEVEL:-info}"
PROXY_ADDRESS=${PROXY#*//}
PROXY_IP=${PROXY_ADDRESS%:*}
PROXY_PORT=${PROXY_ADDRESS#*:}
DEFAULT_ROUTE=$(ip route | grep default | head -1)

config_proxy_route() {
  # Use existing table 200
  ip route add default dev $TUN table 200 2>/dev/null || true
  ip rule add fwmark 200 table 200 priority 1000 2>/dev/null || true
}

# Route TCP traffic through proxy, except for DNS (port 53) and proxy IP
config_tcp_only() {
  # Remove existing default route from main table if it points to TUN
  ip route del default table main 2>/dev/null || true
  
  # Add default route through eth0 to main table (for UDP, ICMP, and exceptions)
  GATEWAY=$(echo "$DEFAULT_ROUTE" | awk '{print $3}')
  INTERFACE=$(echo "$DEFAULT_ROUTE" | awk '{print $5}')
  
  if [ -n "$GATEWAY" ] && [ -n "$INTERFACE" ]; then
    ip route add default via $GATEWAY dev $INTERFACE table main 2>/dev/null || true
  fi
  
  # Ensure TUN interface is up and has IP
  ip link set dev $TUN up 2>/dev/null || true
  
  # Add default route via TUN for TCP traffic (will be used by fwmark rule)
  ip route add default dev $TUN table 200 2>/dev/null || true
  
  # Flush all existing iptables rules
  iptables -t mangle -F 2>/dev/null || true
  iptables -t nat -F 2>/dev/null || true
  iptables -F 2>/dev/null || true
  
  # ----- Rules for LOCAL traffic (from container itself) -----
  # Mark ONLY TCP packets from container (except port 53)
  iptables -t mangle -A OUTPUT -p tcp -j MARK --set-mark 200
  
  # Unmark DNS traffic (TCP and UDP port 53) - Critical for CoreDNS
  iptables -t mangle -A OUTPUT -p tcp --dport 53 -j MARK --set-mark 0
  iptables -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 0
  
  # Unmark TCP packets going to proxy IP (avoid loop)
  if [ -n "$PROXY_IP" ]; then
    iptables -t mangle -A OUTPUT -p tcp -d $PROXY_IP -j MARK --set-mark 0
  fi
  
  # Unmark localhost traffic for safety
  iptables -t mangle -A OUTPUT -p tcp -d 127.0.0.0/8 -j MARK --set-mark 0
  iptables -t mangle -A OUTPUT -p udp -d 127.0.0.0/8 -j MARK --set-mark 0
  
  # ----- Rules for FORWARDED traffic (from WireGuard clients) -----
  # Mark ONLY TCP forwarded packets (except port 53)
  iptables -t mangle -A FORWARD -p tcp -j MARK --set-mark 200
  
  # Unmark DNS traffic (TCP and UDP port 53)
  iptables -t mangle -A FORWARD -p tcp --dport 53 -j MARK --set-mark 0
  iptables -t mangle -A FORWARD -p udp --dport 53 -j MARK --set-mark 0
  
  # Unmark TCP packets going to proxy IP
  if [ -n "$PROXY_IP" ]; then
    iptables -t mangle -A FORWARD -p tcp -d $PROXY_IP -j MARK --set-mark 0
  fi
  
  # Unmark localhost traffic for forwarded packets
  iptables -t mangle -A FORWARD -p tcp -d 127.0.0.0/8 -j MARK --set-mark 0
  iptables -t mangle -A FORWARD -p udp -d 127.0.0.0/8 -j MARK --set-mark 0
  
  # Allow forwarding
  iptables -A FORWARD -i $TUN -j ACCEPT
  iptables -A FORWARD -o $TUN -j ACCEPT
  iptables -A FORWARD -i wg0 -j ACCEPT 2>/dev/null || true
  iptables -A FORWARD -o wg0 -j ACCEPT 2>/dev/null || true
  
  # ----- NAT for traffic going through TUN -----
  iptables -t nat -A POSTROUTING -o $TUN -j MASQUERADE
  
  # ----- Routing rules -----
  # Everything except TCP uses main table (eth0) by default
  # TCP marked traffic uses table 200
  ip rule del from all fwmark 200 lookup 200 priority 1000 2>/dev/null || true
  ip rule add from all fwmark 200 lookup 200 priority 1000
  
  # Policy routing for forwarded traffic from wg0
  ip rule del iif wg0 lookup 200 priority 500 2>/dev/null || true
  ip rule add iif wg0 lookup 200 priority 500
  
  # Flush route cache to apply changes
  ip route flush cache 2>/dev/null || true
}

create_tun() {
  # Check if TUN device already exists
  if ! ip link show $TUN > /dev/null 2>&1; then
    ip tuntap add mode tun dev "$TUN" 2>/dev/null || true
  fi
  ip addr add "$ADDR" dev "$TUN" 2>/dev/null || true
  ip link set dev "$TUN" up 2>/dev/null || true
}

config_route() {
  # This function is now handled by config_tcp_only
  return 0
}

run() {

  # Create Corefile first, before any network configuration
  create_corefile
  
  config_proxy_route
  create_tun
  config_tcp_only

  # execute extra commands
  if [ -n "$EXTRA_COMMANDS" ]; then
    sh -c "$EXTRA_COMMANDS"
  fi

  if [ -n "$MTU" ]; then
    ARGS="--mtu $MTU"
  fi

  if [ -n "$RESTAPI" ]; then
    ARGS="$ARGS --restapi $RESTAPI"
  fi

  if [ -n "$UDP_TIMEOUT" ]; then
    ARGS="$ARGS --udp-timeout $UDP_TIMEOUT"
  fi

  if [ -n "$TCP_SNDBUF" ]; then
    ARGS="$ARGS --tcp-sndbuf $TCP_SNDBUF"
  fi

  if [ -n "$TCP_RCVBUF" ]; then
    ARGS="$ARGS --tcp-rcvbuf $TCP_RCVBUF"
  fi

  if [ "$TCP_AUTO_TUNING" = 1 ]; then
    ARGS="$ARGS --tcp-auto-tuning"
  fi

  exec tun2socks \
    --loglevel "$LOGLEVEL" \
    --device "$TUN" \
    --proxy "$PROXY" \
    $ARGS
}

run || exit 1

соотв.
docker build --rm -t wiresocks_mod .
Правим .env и всё должно поехать