Dr4tez / sing-box4asus

sing-box script for Asus routers with Merlin's firmware
18 stars 2 forks source link

Problem with sing-box on merlin-wrt #1

Closed Andrewprvrzv closed 3 months ago

Andrewprvrzv commented 3 months ago

After install script, run sbs-setup and change config, start sbs, bit its fail with error that can't download files from resources (github and etc.). Any idea? Maybe Ithere is missing some pkg on entware? Could you show the list of your installed entware packages

Dr4tez commented 3 months ago

I didn't install any entware packages. The flash drive with entware is used here simply as a place for the sing-box binary file and the files it creates. Have you tried this config.json in sing-box on other platforms? You can show it here, after replacing sensitive data with X's, as it is done in my config.json template. What kind of router do you have? Do you speak Russian? Maybe it's more convenient to use it?

Andrewprvrzv commented 3 months ago
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "dns": {
    "servers": [
      {
        "tag": "dns-direct",
        "address": "XX.XX.XX.XX",
        "strategy": "prefer_ipv4",
        "detour": "direct"
      },
      {
        "tag": "dns-block",
        "address": "rcode://success"
      }
    ],
    "rules": [
      {
        "query_type": [
          "NIMLOC",
          "SRV"
        ],
        "server": "dns-block"
      },
      {
        "domain_suffix": ".lan",
        "server": "dns-block"
      }
    ],
    "final": "dns-direct",
    "strategy": "prefer_ipv4",
    "independent_cache": true
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "mtu": 9000,
      "inet4_address": "172.19.0.1/28",
      "auto_route": true,
      "endpoint_independent_nat": true,
      "stack": "system",
      "sniff": true,
      "sniff_override_destination": true
    }
  ],
  "outbounds": [
    {
      "type": "vless",
      "tag": "proxy",
      "server": "XXXXXXXXXXXXXXXX",
      "server_port": 443,
      "uuid": "XXXXXXXXXXXX",
      "flow": "xtls-rprx-vision",
      "tls": {
        "enabled": true,
        "server_name": "XXXXXXXX",
        "utls": {
          "enabled": true,
          "fingerprint": "XXXXXXX"
        },
        "reality": {
          "enabled": true,
          "public_key": "XXXXXXXXXXXXX",
          "short_id": "XXXXX"
        }
      },
      "packet_encoding": ""
    },
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "direct",
      "tag": "bypass"
    },
    {
      "type": "block",
      "tag": "block"
    },
    {
      "type": "dns",
      "tag": "dns-out"
    }
  ],
  "route": {
    "rules": [
      {
        "protocol": "dns",
        "outbound": "dns-out"
      },
      {
        "network": "udp",
        "port": [
          135,
          137,
          138,
          139,
          5353
        ],
        "outbound": "block"
      },
      {
        "rule_set": [
          "geoip-ru",
          "geoip-by",
          "geosite-yandex",
          "geosite-telegram",
          "geosite-whatsapp",
          "geosite-github",
          "geosite-tiktok"
        ],
        "outbound": "direct"
      },
      {
        "rule_set": [
          "geosite-youtube",
          "geosite-intel",
          "geosite-intel-dev"
        ],
        "outbound": "proxy"
      },
      {
        "ip_is_private": true,
        "outbound": "direct"
      },
      {
        "domain_suffix": [
          ".ru",
          "blizzard.com",
          "battle.net",
          "like.video",
          ".xn--d1acj3b",
          ".xn--80adxhks",
          ".xn--80asehdb",
          ".xn--c1avg",
          ".xn--p1acf",
          ".xn--p1ai",
          ".xn--80aswg"
        ],
        "domain_keyword": [
          "steam",
          "google",
          "steampowered"
        ],
        "ip_cidr": [
          "91.108.56.0/22",
          "91.108.4.0/22",
          "91.108.8.0/22",
          "91.108.16.0/22",
          "91.108.12.0/22",
          "149.154.160.0/20",
          "91.105.192.0/23",
          "91.108.20.0/22",
          "185.76.151.0/24",
          "2001:b28:f23d::/48",
          "2001:b28:f23f::/48",
          "2001:67c:4e8::/48",
          "2001:b28:f23c::/48",
          "2a0a:f280::/32"
        ],
        "outbound": "direct"
      },
      {
        "ip_cidr": [
          "224.0.0.0/3",
          "ff00::/8"
        ],
        "outbound": "block"
      },
      {
        "source_ip_cidr": [
          "224.0.0.0/3",
          "ff00::/8"
        ],
        "outbound": "block"
      }
    ],
    "rule_set": [
      {
        "type": "remote",
        "tag": "geoip-ru",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-ru.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geoip-by",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-by.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-youtube",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-youtube.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-intel-dev",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-intel-dev.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-intel",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-intel.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-yandex",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-yandex.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-telegram",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-telegram.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-whatsapp",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-whatsapp.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-github",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-github.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-tiktok",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-tiktok.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      }
    ],
    "final": "proxy",
    "auto_detect_interface": true
  },
  "experimental": {
    "cache_file": {
      "enabled": true
    },
    "clash_api": {
      "external_controller": "0.0.0.0:19090",
      "external_ui": "/opt/root/sing-box/ui",
      "secret": "XXXX"
    }
  }
}

This is my config, its work perfect on debian/ubuntu. But with your script on my AX86U with latest werlin-wrt I have an error: ERROR clash-api: download external ui error: Get "https://github.com/MetaCubeX/Yacd-meta/archive/gh-pages.zip": exchange4: context canceled | exchange6: context canceled Same error with github links.

Update: delete "dns" block of config and it's start!

But now have new problem. Execute on router curl --interface tun0 ipinfo.io return Failed to connect to ipinfo.io port 80 after 15149 ms: Couldn't connect to server. From local machines same result. All trafiic go through provider. No error in sing-box. Router is the default gateway in network (DHCP). Any idea?

Dr4tez commented 3 months ago

First, remove the line "auto_route": true, from the config, the router will not allow such impudence) The script itself configures the necessary routes and iptables rules. So how about continuing the discussion in Russian?

Andrewprvrzv commented 3 months ago

Давай по русски) Не помогло. Текущий конфиг

{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "mtu": 9000,
      "inet4_address": "172.19.0.1/28",
      "endpoint_independent_nat": true,
      "stack": "mixed",
      "sniff": true
    }
  ],
  "outbounds": [
    {
      "type": "vless",
      "tag": "proxy",
      "server": "XXXXXXXXXXXXX",
      "server_port": 443,
      "uuid": "XXXXXXXXXXX",
      "flow": "xtls-rprx-vision",
      "tls": {
        "enabled": true,
        "server_name": "XXXXXXX",
        "utls": {
          "enabled": true,
          "fingerprint": "XXXXXX"
        },
        "reality": {
          "enabled": true,
          "public_key": "XXXXXXXXXXXX",
          "short_id": "XXXX"
        }
      },
      "packet_encoding": ""
    },
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "direct",
      "tag": "bypass"
    },
    {
      "type": "block",
      "tag": "block"
    },
    {
      "type": "dns",
      "tag": "dns-out"
    }
  ],
  "route": {
    "rules": [
      {
        "rule_set": [
          "geoip-ru",
          "geoip-by",
          "geosite-yandex",
          "geosite-telegram",
          "geosite-whatsapp",
          "geosite-github",
          "geosite-tiktok"
        ],
        "outbound": "direct"
      },
      {
        "rule_set": [
          "geosite-youtube",
          "geosite-intel",
          "geosite-intel-dev"
        ],
        "outbound": "proxy"
      },
      {
        "ip_is_private": true,
        "outbound": "direct"
      },
      {
        "domain_suffix": [
          ".ru",
          "blizzard.com",
          "battle.net",
          "like.video",
          ".xn--d1acj3b",
          ".xn--80adxhks",
          ".xn--80asehdb",
          ".xn--c1avg",
          ".xn--p1acf",
          ".xn--p1ai",
          ".xn--80aswg"
        ],
        "domain_keyword": [
          "steam",
          "google",
          "steampowered"
        ],
        "ip_cidr": [
          "91.108.56.0/22",
          "91.108.4.0/22",
          "91.108.8.0/22",
          "91.108.16.0/22",
          "91.108.12.0/22",
          "149.154.160.0/20",
          "91.105.192.0/23",
          "91.108.20.0/22",
          "185.76.151.0/24",
          "2001:b28:f23d::/48",
          "2001:b28:f23f::/48",
          "2001:67c:4e8::/48",
          "2001:b28:f23c::/48",
          "2a0a:f280::/32"
        ],
        "outbound": "direct"
      }
    ],
    "rule_set": [
      {
        "type": "remote",
        "tag": "geoip-ru",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-ru.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geoip-by",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-by.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-youtube",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-youtube.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-intel-dev",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-intel-dev.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-intel",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-intel.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-yandex",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-yandex.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-telegram",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-telegram.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-whatsapp",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-whatsapp.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-github",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-github.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-tiktok",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-tiktok.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      }
    ],
    "final": "proxy",
    "auto_detect_interface": true
  },
  "experimental": {
    "cache_file": {
      "enabled": true
    },
    "clash_api": {
      "external_controller": "0.0.0.0:19090",
      "external_ui": "/opt/root/sing-box/ui",
      "secret": "XXXX"
    }
  }
}

Dashboard Clash работает, tun0 поднимается, sing-box тоже, но почему-то не редиректятся запросы

Dr4tez commented 3 months ago

Вот ваш конфиг. Во первых- исправил уровень логирования на error, а то слишком много ненужной инфы льётся в консоль. Во вторых- очистил от необязательных и неиспользуемых конфигом строк. По умолчанию всегда используется первый uotbound, так что указание его в final не обязательно. Т.к. у вас он по умолчанию, то это значит, что всё, что вы принудительно не направите в direct, будет идти в proxy. Так что тут бессмысленны правила, направляющие в proxy, достаточно только правил, направляющих в direct. Неиспользуемые outbounds и rule_set, оставшиеся не у дел после удаления правила, направляющего в proxy, тоже убрал. В третьих- для cache_file не был указан путь, так что он не мог быть создан на роутере. В том, что осталось, подставил свои ключи для vless и запустил- у меня всё работает.

{
  "log": {
    "level": "error",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "mtu": 9000,
      "inet4_address": "172.19.0.1/28",
      "endpoint_independent_nat": true,
      "stack": "mixed",
      "sniff": true
    }
  ],
  "outbounds": [
    {
      "type": "vless",
      "tag": "proxy",
      "server": "XXXXXXXXXXXXXXXXXX",
      "server_port": 443,
      "uuid": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "flow": "xtls-rprx-vision",
      "tls": {
        "enabled": true,
        "server_name": "XXXXXXXXXXXXXXXXXXX",
        "utls": {
          "enabled": true,
          "fingerprint": "XXXXXX"
        },
        "reality": {
          "enabled": true,
          "public_key": "XXXXXXXXXXXXXXXXXXXXXXXXX",
          "short_id": "XXXXXXXXX"
        }
      }
    },
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "rule_set": [
          "geoip-ru",
          "geoip-by",
          "geosite-yandex",
          "geosite-telegram",
          "geosite-whatsapp",
          "geosite-github",
          "geosite-tiktok"
        ],
        "outbound": "direct"
      },
      {
        "ip_is_private": true,
        "outbound": "direct"
      },
      {
        "domain_suffix": [
          ".ru",
          "blizzard.com",
          "battle.net",
          "like.video",
          ".xn--d1acj3b",
          ".xn--80adxhks",
          ".xn--80asehdb",
          ".xn--c1avg",
          ".xn--p1acf",
          ".xn--p1ai",
          ".xn--80aswg"
        ],
        "domain_keyword": [
          "steam",
          "google",
          "steampowered"
        ],
        "ip_cidr": [
          "91.108.56.0/22",
          "91.108.4.0/22",
          "91.108.8.0/22",
          "91.108.16.0/22",
          "91.108.12.0/22",
          "149.154.160.0/20",
          "91.105.192.0/23",
          "91.108.20.0/22",
          "185.76.151.0/24",
          "2001:b28:f23d::/48",
          "2001:b28:f23f::/48",
          "2001:67c:4e8::/48",
          "2001:b28:f23c::/48",
          "2a0a:f280::/32"
        ],
        "outbound": "direct"
      }
    ],
    "rule_set": [
      {
        "type": "remote",
        "tag": "geoip-ru",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-ru.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geoip-by",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-by.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-yandex",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-yandex.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-telegram",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-telegram.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-whatsapp",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-whatsapp.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-github",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-github.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      },
      {
        "type": "remote",
        "tag": "geosite-tiktok",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-tiktok.srs",
        "download_detour": "direct",
        "update_interval": "24h0m0s"
      }
    ],
    "auto_detect_interface": true
  },
  "experimental": {
    "cache_file": {
      "enabled": true,
      "path": "/opt/root/sing-box/cache.db"
    },
    "clash_api": {
      "external_controller": "0.0.0.0:9090",
      "external_ui": "/opt/root/sing-box/ui",
      "secret": "XXXX"
    }
  }
}
Andrewprvrzv commented 3 months ago

К сожалению, не помогло. Есть подозрения, что какая то проблема с iptables, правила не прописались или еще что-то, потому что после curl --interface tun0 ipinfo.io никаких пакетов на sing-box не улетает, логи пустые

Dr4tez commented 3 months ago

Давайте по порядку. Сохраните свой конфиг куда-нибудь и выполните sbs remove. Потом wget -O /jffs/scripts/sbs-ru https://raw.githubusercontent.com/Dr4tez/sing-box4asus/main/sbs-ru && chmod 775 /jffs/scripts/sbs-ru && /jffs/scripts/sbs-ru install и опубликуйте тут весь вывод консоли при установке.

Andrewprvrzv commented 3 months ago

Скрипт встал без ошибок

sbs setup
Change script settings? If sing-box is running, selecting option 2 will stop it.
1-No, 2-Yes: 2
Stop sing-box...
Terminated
sbs-monitor has stopped.
Updating the services-start script
sing-box has stopped.
Go to script setup.
Edit config.json (sing-box configuration file) using nano editor?
1-No, 2-Yes: 2
Opening config.json in nano editor.
config.json saved.
Current device IP addresses for tun0:  Change them? Selecting 2 will replace the existing IP addresses with the ones you entered.
1-No, 2-Yes: 1
Refusing to replace IP addresses.
The current routing table number for tun0 is 555. Change it?
1-No, 2-Yes: 1
Refusing to change the routing table number.
Settings have been saved.
Launch sing-box?
1-No, 2-Yes: 2
Launch sing-box...
TUN interface tun0 detected.
Updating the services-start script
sing-box is running.
sbs-monitor is running.

Тут все нормально.

ip a
63: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.19.0.1/28 brd 172.19.0.15 scope global tun0
       valid_lft forever preferred_lft forever

tun0 поднялся с нужным адресом, прописанным в конфиге. sing-box тоже запущен, работает

curl --interface tun0 ipinfo.io
curl: (28) Failed to connect to ipinfo.io port 80 after 15479 ms: Couldn't connect to server

С другой машины curl ipinfo.io возвращает провайдера адрес, пакеты не идут через sing-box((

Dr4tez commented 3 months ago

Я там подредактировал предыдущий пост. Давайте сначала. С установки. Хотя, я не вижу в выводе setup информации о введённых ip адресах устройств. Устройствам, трафик которых вы хотите пустить через sing-box, надо предварительно назначить в веб интерфейсе роутера постоянные айпишники и вбить эти айпишники при выполнении sbs setup. Если этого не сделать, то трафик устройств будет всё так же идти мимо sing-box. Про добавление ip адресов есть в readme. А если не назначить им постоянные айпишники, то они могут меняться время от времени, и опять их трафик пойдёт мимо sing-box. Я думаю это очевидно. У меня вообще всем устройствам в домашней сети с самого начала присвоены постоянные ip адреса, это полезно и для других целей.

Andrewprvrzv commented 3 months ago

А вот с этого момента поподробнее, в скрипте правила не прописаны, чтобы весь трафик ходил через него получается? Только адреса устройств, которые пропишем получается? В таком случае заработало, на то устройство, которое прописал, но хотелось бы чтобы все устрйоства сети ходили по умолчанию через sing box, возможно реализовать? У меня сейчас реализовано так, одна машина в роли шлюза выступает, коннекты к ней идут из локальной сети, там singbox работает. В роутере по умолчанию в dhcp шлюзом указана та машина. Все отлично работает, но хотелось бы на роутер повесить это дело, а так как часть машин на статических адресах машин, а часть на DHCP (то есть меняются адреса).

Dr4tez commented 3 months ago

Нет, т.к. роутер не допустит хозяйничать функции auto_route в себе, как я уже писал, это просто сломает работу роутера. Только по айпишникам. Но по мне так оно даже лучше, у меня есть устройства которым это не только не нужно, а даже вредно.

Andrewprvrzv commented 3 months ago

Подправил коммент выше. Вообще должно работать, потому что использовал решение от китайцев на другом движке, там так работало. По поводу огрнаичений, проще в конфиге sing-box прописать машины, которых только через direct пускать. Я не силен в iptables, потому и хотелось бы готовое решение найти или сделать. Как то же это реализовано в openwrt или кинетике том же, правда я не пробовал

Dr4tez commented 3 months ago

Я понятия не имею как это делается в openwrt и кинетиках. Роутер всё же не полноценная линукс машина, со своими особенностями и жесткими ограничениями. У разных роутеров и прошивок эти особенности и ограничения могут кардинально отличаться. У меня тоже сначала sing-box работал в виртуальной машине proxmox, и трафик нужных устройств шёл туда посредством указания шлюза для них в настройках роутера. Но в таком варианте ломается QoS на роутере, т.к. трафик от устройств считается трафиком этой машины. А мне это важно и только из-за этого решил перенести sing-box на роутер. У меня не достаточно знаний в работе роутера чтобы заставить на нём корректно идти трафик всех устройств через sing-box, а может это и не возможно, искал решения, но не нашёл. С auto_route не работает, а если добавить всю подсеть роутера в качестве адреса, то всё ломается, приходится вручную кое что править в системе чтобы восстановить. Вот не понял, у вас DHCP сервер на другой машине работает или на роутере? И разве нельзя через него назначить статические айпишники определённым MAC адресам?

Andrewprvrzv commented 3 months ago

тоже Proxmox)) DHCP на роутере, динамику убирать не вариант, потому что бывают сторонние разовые подключения, вопрос как с ними быть тогда? Да и смысла особо не вижу в этом. Немного потестировал, еще одна проблема всплыла, нет доступа из вне к машине, если добавить адрес, оно понятно в принципе почему. Нужно хорошенько подумать как это можно реализовать еще, у китайцев для этих роутеров все работало, но там tun интерфейса не было. Если будут идеи, напишу)

Dr4tez commented 3 months ago

Так и не требуется убирать динамику, она не зависит от того, что вы в настройках укажете статические адреса для некоторых устройств, другие продолжать работать с динамическими и получать их. Это же просто в веб интерфейсе делается, никаких консольных команд или правок файлов. Про доступ из вне не думал, надо подумать. Хотя, что именно вы подразумеваете под доступом из вне? По smb внутри домашней сети доступ к ним есть. А внутрь домашней сети из интернета я хожу только через wireguard сервер, работающий на роутере. Ну и ещё есть резервный канал из интернета в домашнюю сеть по VLESS, посредством 3x-ui, работающего на одной из виртуалок. Таким образом- через vpn/vless+smb у меня есть к этим устройствам доступ и из интернета. А что там и где у китайцев работало для этого роутера, можно подробнее?

Andrewprvrzv commented 3 months ago

Динамике тоже нужен будет доступ к sing-box. Доступ из вне, к вебсерверу и другим сервисам (по доменному имени). У китайцев MerlinClash, больше года использовал, потом ушел с него, не помню уже по каким причинам. Но там свои заморочки с китайской прошивкой и магазином приложений, втсроенным в роутер.

https://mcreadme.gitbook.io/mc/quick

Dr4tez commented 3 months ago

А, понял. А большой ли у вас пул адресов в сети? Может перечислить их все в настройках скрипта, кроме самого роутера? Или, если роутер поддерживает vlan, попробовать их все в отдельную подсетку кинуть и прописать её, чисто проверить. У меня нет поддержки vlan. Я многое методом тыка искал и делал, и с помощью chatgpt, что-то подсказывали на форуме Мерлина, так что не обессудьте. Веб серверов дома не держу, только локальные ресурсы. С китайцами ясно, искать и пробовать не стану.

Dr4tez commented 2 months ago

Не знаю, следите ли вы за проектом, поэтому, на всякий случай, озвучу тут. По факту с версии 1.1 можно добавить всю подсеть роутера без критичных последствий, а с версии 1.2 это доведено до ума- после добавления подсети предлагается ввести ip адреса исключений.

XALIKoff commented 4 weeks ago

По доступу извне, так и не нашли решение? Это единственный минус... Сейчас приходится исключать машину с сервисами и запускать на ней отдельно nekoray.

Dr4tez commented 4 weeks ago

По доступу извне, так и не нашли решение? Это единственный минус... Сейчас приходится исключать машину с сервисами и запускать на ней отдельно nekoray.

Знать бы причину, решение бы нашёл, скорее всего.

XALIKoff commented 4 weeks ago

тоже Proxmox)) DHCP на роутере, динамику убирать не вариант, потому что бывают сторонние разовые подключения, вопрос как с ними быть тогда? Да и смысла особо не вижу в этом. Немного потестировал, еще одна проблема всплыла, нет доступа из вне к машине, если добавить адрес, оно понятно в принципе почему. Нужно хорошенько подумать как это можно реализовать еще, у китайцев для этих роутеров все работало, но там tun интерфейса не было. Если будут идеи, напишу)

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

Dr4tez commented 4 weeks ago

Попробуйте совсем удалить параметр auto_detect_interface из конфига. У меня и без этого всё работает, по идее и должно работать, т.к. у нас все маршруты и правила для трафика прописаны. Плюс это даёт возможность использовать свой dns сервер, расположенный в домашней сети, и, при использовании sing-box в качестве сервера, появляется доступ к локальным ресурсам. А с ним не было, на днях нашёл это решение. auto_detect_interface на роутере неверно определяет интерфейс для direct outbound. Интересно, а вдруг и вашу проблему решит. У меня просто нет в домашней сети сервисов доступных из wan через редирект портов.

XALIKoff commented 4 weeks ago

Попробуйте совсем удалить параметр auto_detect_interface из конфига. У меня и без этого всё работает, по идее и должно работать, т.к. у нас все маршруты и правила для трафика прописаны. Плюс это даёт возможность использовать свой dns сервер, расположенный в домашней сети, и, при использовании sing-box в качестве сервера, появляется доступ к локальным ресурсам. А с ним не было, на днях нашёл это решение. auto_detect_interface на роутере неверно определяет интерфейс для direct outbound. Интересно, а вдруг и вашу проблему решит. У меня просто нет в домашней сети сервисов доступных из wan через редирект портов.

попробовал, не повлияло... в остальном да, без этого параметра работает также на других клиентах.

Andrewprvrzv commented 4 weeks ago

тоже Proxmox)) DHCP на роутере, динамику убирать не вариант, потому что бывают сторонние разовые подключения, вопрос как с ними быть тогда? Да и смысла особо не вижу в этом. Немного потестировал, еще одна проблема всплыла, нет доступа из вне к машине, если добавить адрес, оно понятно в принципе почему. Нужно хорошенько подумать как это можно реализовать еще, у китайцев для этих роутеров все работало, но там tun интерфейса не было. Если будут идеи, напишу)

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

Проблема в том, входящие пакеты долетают до условного сервера в сети, а вот обратно уйти не могут, так как идут через sing-box, а он отправляет не туда их, либо вообще через ваш прокси неизвестно куда. Решение: прописать маршруты, чтобы пакеты, допустим с такого-то локального адреса и таких то портов должны ходить через стандартный wan интерфейс, а не sing-box. Как настроить, зависит от платформы, роутера и прочего. Я реализовал через openwrt в виртуальной машине, используя Policy Based Routing. На Asus по идее тоже можно, PBR в каком-то пакете был реализован, в вики мерлина даже описано как использовать.

Dr4tez commented 4 weeks ago

Наверное логично, что если у нас трафик на устройство приходит через sing-box, то и уходит через него. Надо попробовать прописать маршруты для определенного порта, чтобы если с него пришёл трафик, то и уйти должен через него. Ну или что-то навроде того, надо подумать на досуге. Может придется в самом конфиге это прописывать, т.к. это sing-box решает куда пойдут пакеты попавшие в него. А может в маршрутах и правилах роутера определять куда направить трафик с определенного порта. В общем есть над чем подумать. Я не особо силён в маршрутизации.

Andrewprvrzv commented 4 weeks ago

Логично, что если у нас трафик на устройство приходит через sing-box, то и уходит через него. Надо попробовать прописать маршруты для определенного порта, чтобы если с него пришёл трафик, то и уйти должен через него. Ну или что-то навроде того, надо подумать на досуге. Может придется в самом конфиге это прописывать, т.к. это sing-box решает куда пойдут пакеты попавшие в него. А может в маршрутах и правилах роутера определять куда направить трафик с определенного порта. В общем есть над чем подумать. Я не особо силён в маршрутизации.

Не правило, что пришел на порт такой-то, а именно с порта сервера в сети вашей должны пакеты в WAN уходить. Все входящие пакеты на роутер и так, по умолчанию, через WAN приходить будут до адресата, минуя sing-box, а вот уходить будут через sing-box, если вы эту машину добавили в своем скрипте. Прошивка роутера не даст прописать такие правила, по крайней мере через веб интерфейс, там нужно создавать отдельную таблицу маршрутизации для интерфейсов и там уже прописывать правила, копайте в сторону Policy Based Routing. Я пробовал на мерлине настроить с ней, но там не слишком очевидно это делается, к тому же правила сохраняться не будут, необходимо скрипты писать, чтобы мониторило и поднималось само все это дело. Кроме того sing-box неплохо так процессор нагружает, поэтому сделал себе роутер на openwrt в ВМ. А вообще реализовать можно, как реализуете сообщите)) PS: Возможно можно в конфиге sing-box прописать, например, все пакеты с ip:443 перенаправлять в LAN, но тут не готов сказать куда дальше пакет полетит, возможно обратно в sing-box, надо пробовать. Но сколько не находил решений, все через Policy Based Routing делают

Dr4tez commented 4 weeks ago

Логично, что если у нас трафик на устройство приходит через sing-box, то и уходит через него. Надо попробовать прописать маршруты для определенного порта, чтобы если с него пришёл трафик, то и уйти должен через него. Ну или что-то навроде того, надо подумать на досуге. Может придется в самом конфиге это прописывать, т.к. это sing-box решает куда пойдут пакеты попавшие в него. А может в маршрутах и правилах роутера определять куда направить трафик с определенного порта. В общем есть над чем подумать. Я не особо силён в маршрутизации.

Не правило, что пришел на порт такой-то, а именно с порта сервера в сети вашей должны пакеты в WAN уходить. Все входящие пакеты на роутер и так, по умолчанию, через WAN приходить будут до адресата, минуя sing-box, а вот уходить будут через sing-box, если вы эту машину добавили в своем скрипте. Прошивка роутера не даст прописать такие правила, по крайней мере через веб интерфейс, там нужно создавать отдельную таблицу маршрутизации для интерфейсов и там уже прописывать правила, копайте в сторону Policy Based Routing. Я пробовал на мерлине настроить с ней, но там не слишком очевидно это делается, к тому же правила сохраняться не будут, необходимо скрипты писать, чтобы мониторило и поднималось само все это дело. Кроме того sing-box неплохо так процессор нагружает, поэтому сделал себе роутер на openwrt в ВМ. А вообще реализовать можно, как реализуете сообщите))

А, ну да, в кастомной таблице пакеты к устройству в локальной сети направляются через интерфейс br0, если они исходят от другого устройства в этой сети. Обратные пакеты в таком случае тоже кастомной таблицей направляются через br0. Если же пакеты к целевому устройству идут из WAN, то они попадают в основную таблицу маршрутизации и, в соответствии с её маршрутами, тоже минуют sing-box. Но вот обратные пакеты в этом случае от целевого устройства, если его ip правилами завернуто в кастомную таблицу, маршрутом по умолчанию направляются в tun интерфейс sing-box. Теперь картина ясна. Про вэб интерфейс и речи нет, надо как-то автоматизировать это в скрипте, хотя бы частично, подумаю. Восстановление новых правил и маршрутов ляжет на тот же монитор, что сейчас используется для восстановления маршрутов и правил при различных системных событиях. Не замечал прям высокой нагрузки на проц своего роутера именно от sing-box, процы у современных асусов весьма производительные. Вот оперативы маловато для этих целей, 1 гиг ещё норм, а вот для 512 мбайт желательно уже 32 битное ядро ставить, даже если проц 64 битный, как у RT-AX86S например.

Dr4tez commented 4 weeks ago

Но этим займусь через неделю как минимум. Сейчас большое обновление доделываю. Решил отказаться от второго tun интерфейса, это на треть сократило размер кода и упростило его. Так же два tun интерфейса создавали трудно разрешимые проблемы с подсетями. А функционал второго tun можно парой простых правил в конфиге прописать, если он нужен. Функционал сервера доделываю, чтобы подключаться к домашней сети из WAN, используя sing-box, по прокси протоколам, vless например, а не встроенные vpn серверы роутера. Логику добавления правил маршрутизации переработал полностью, чтобы с несколькими подсетями разных размеров корректно работало с соблюдением приоритетов, в связи с чем и логика скрипта-монитора почти полностью изменена.

Dr4tez commented 4 weeks ago

А может тут дело в RP фильтре? Ну и что, что обратные пакеты пошли через tun интерфейс, может просто изменился их исходный ip адрес на ip tun интерфейса и всё. И вот тут может быть засада, RP фильтр не пропустит ответные пакеты, если они исходят не с того ip, на который пришли входящие пакеты. Надо покопать в этом направлении, я весьма поверхностно знаком с RP фильтрацией вообще и на роутере Асус в частности. Знаю что на роутерах Асус она есть и по умолчанию для всех интерфейсов она строгая. И меняется ли исходный ip пакетов при прохождении через tun интерфейс тоже не уверен. Может изменение уровня фильтрации для какого-нибудь интерфейса поможет в данном случае? Надо экспериментировать.

Dr4tez commented 4 weeks ago

Попробуйте отключить фильтрацию для tun интерфейса sing-box echo 0 > /proc/sys/net/ipv4/conf/sbtun/rp_filter Включается обратно на строгую фильтрацию командой echo 1 > /proc/sys/net/ipv4/conf/sbtun/rp_filter Средняя фильтрация echo 2 > /proc/sys/net/ipv4/conf/sbtun/rp_filter После перезагрузки роутера фильтрация слетит на строгую сама.

Dr4tez commented 4 weeks ago

Проверил на доступе из WAN к вэб-морде роутера, включив его в настройках и добавив роутер в sing-box. Отключение RP фильтра не помогает, отключал сразу для sbtun, br0 и ppp0, бесполезно, нет ответов. При выключении sing-box или при исключении роутера из него, всё нормально становится. Что же такого там sing-box творит с ответными пакетами от веб-морды, что они никуда не доходят.

Dr4tez commented 4 weeks ago

копайте в сторону Policy Based Routing. Я пробовал на мерлине настроить с ней, но там не слишком очевидно это делается

можете рассказать как вы пробовали на мерлине и как реализовали на openwrt? Т.е. какие действия и их порядок.

XALIKoff commented 4 weeks ago

https://github.com/SagerNet/sing-box/issues/333

вот тут человек просит добавить такой функционал, ему тоже мешает... да, получается, нужно по сути создать скрипт, который будет добавлять правила роутинга с конкретных айпи:порт напрямую в wan, минуя sing-box.

если действовать со стороны sing-box - получается нужно понимать какой ip внутри тунеля получила такая-то машина (условно 192.168.1.ХХ внутри тунеля стало 172.19.0.ХХ) и далее писать правило, которое бы подменяло для пакетов с этого айпи адрес отправителя? не уверен что я прав и не уверен что это вообще возможно)

Dr4tez commented 4 weeks ago

Я немного поломал голову, и решил что пока у меня тоже не планируется. Не вижу путей решения, не так просто это на роутере, может и возможно. Да, при желании всё возможно, видимо у меня его не хватает в этом направлении. И знаний очень не хватает. Нужен компетентный спец, а не как я- нахватался вершков и сделал для себя что хотел. Самое простое с моей точки зрения решение- разместить нужные ресурсы на виртуалке со своим ip или отдельной линукс машине в домашней сети и не включать их трафик в sing-box. Китайский мини-пк в этом плане мегаудобен, поднял proxmox и клепай lxc контейнеры или виртуальные машины с нужными сервисами. У меня именно так и сделано, только доступ из WAN к этим ресурсам через редирект портов отсутствует как метод, доступ в домашку теперь только через прокси-сервер в sing-box, раньше был только через встроенный vpn сервер роутера. Когда доведу до ума все свои задумки, тогда и можно будет ещё поизучать тему да поэкспериментировать. Но от помощи в этом направлении не откажусь никогда, может кто компетентный заглянет сюда да решит помочь страждущим.

Andrewprvrzv commented 3 weeks ago

копайте в сторону Policy Based Routing. Я пробовал на мерлине настроить с ней, но там не слишком очевидно это делается

можете рассказать как вы пробовали на мерлине и как реализовали на openwrt? Т.е. какие действия и их порядок.

https://github.com/RMerl/asuswrt-merlin.ng/wiki/Policy-based-Port-routing-(manual-method)

XALIKoff commented 3 weeks ago

копайте в сторону Policy Based Routing. Я пробовал на мерлине настроить с ней, но там не слишком очевидно это делается

можете рассказать как вы пробовали на мерлине и как реализовали на openwrt? Т.е. какие действия и их порядок.

https://github.com/RMerl/asuswrt-merlin.ng/wiki/Policy-based-Port-routing-(manual-method)

почитал, получается алгоритм такой:

  1. создать скрипт nat-start (https://github.com/RMerl/asuswrt-merlin.ng/wiki/User-scripts#nat-start)
  2. добавить в него:
    
    #!/bin/sh

sleep 10 # During the boot process nat-start may run multiple times so this is required

Ensure duplicate rules are not created

for VPN_ID in 0 1 2 3 4 5 do ip rule del prio 999$VPN_ID 2>/dev/null done

Create the RPDB rules

ip rule add from 0/0 fwmark "0x8000/0x8000" table main prio 9990 # WAN fwmark ip rule add from 0/0 fwmark "0x7000/0x7000" table ovpnc4 prio 9991 # VPN 4 fwmark ip rule add from 0/0 fwmark "0x3000/0x3000" table ovpnc5 prio 9992 # VPN 5 fwmark ip rule add from 0/0 fwmark "0x1000/0x1000" table ovpnc1 prio 9993 # VPN 1 fwmark ip rule add from 0/0 fwmark "0x2000/0x2000" table ovpnc2 prio 9994 # VPN 2 fwmark ip rule add from 0/0 fwmark "0x4000/0x4000" table ovpnc3 prio 9995 # VPN 3 fwmark



3. добавить в него нужное правило с помощью:

`iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range АЙПИ_НУЖНОЙ_МАШИНЫ -p tcp -m multiport --dport НОМЕРА_ПОРТОВ_ЧЕРЕЗ_ЗАПЯТУЮ -j MARK --set-mark 0x8000/0x8000`

UPD: попробовал, не взлетело... ошибок нет, но сервис Plex так и не стал доступен извне.
Мне не хватает знаний)