2283 Commits

Author SHA1 Message Date
Markson Hon 1ee48148dd Merge pull request #2086 from miaomiaoyaoqimiaomaoxian/fix/system-proxy-mutual-exclusion
fix(v2ray): keep system proxy and tun mutually exclusive
2026-10-16 07:46:23 +08:00
miao db38d18595 fix(v2ray): keep system proxy and tun mutually exclusive
deleteTransparentProxyRules returned before touching the system proxy
whenever no snapshot had been persisted. GetCleanCommands already
handles both cases -- it restores the saved original when a snapshot
exists and falls back to disabling ProxyEnable when none does -- so the
guard only suppressed the fallback that makes the two modes exclusive.

The leftover registry value pointed at 52345, which only the
system_proxy mode ever listens on. Switching back to tun therefore left
proxy-using applications connected to a dead port: their sockets stayed
in SYN_SENT until the process was restarted.

The regression test drives deleteTransparentProxyRules with no snapshot
and asserts the proxy is disabled. Against the previous code it fails
with "the system proxy was never touched"; it passes with this change.
2026-10-15 11:41:17 +08:00
Markson Hon cbc5359c08 Merge pull request #2074 from v2rayA/dependabot/npm_and_yarn/gui/serialize-javascript-7.1.2
chore(deps): bump serialize-javascript from 7.1.1 to 7.1.2 in /gui
2026-10-10 11:56:05 +08:00
Markson Hon 7609aed42c Merge pull request #2080 from ArianPashae/fix/drop-legacy-outbound-tables
fix(db): drop obsolete legacy outbound tables to prevent foreign key constraint failed (787) on node deletion
v2.5.10
2026-10-09 19:56:54 +08:00
Markson Hon 2187b7e899 Merge pull request #2082 from ILIKEFUTANARI/feat/dns-modes
feat: separate DNS service from interception
2026-10-09 19:34:35 +08:00
ILIKEFUTANARI 6d6c1c117f feat: separate DNS service and interception modes 2026-10-09 17:43:48 +08:00
ILIKEFUTANARI e010d19a5d feat: add DNS interception opt-out 2026-10-09 17:43:48 +08:00
Arian Pashae 48bcc0932d fix(db): drop obsolete legacy outbound tables to prevent foreign key errors on node deletion 2026-10-08 22:09:02 +03:30
dependabot[bot] fa3b8061ec chore(deps): bump serialize-javascript from 7.1.1 to 7.1.2 in /gui
Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) from 7.1.1 to 7.1.2.
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v7.1.1...v7.1.2)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-version: 7.1.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-04 17:41:03 +00:00
Markson Hon 0e3a2ddbee Merge pull request #2073 from big-head-pigeon/fix/transparent-inbound-port-sharing
fix: transparent inbound follows PortSharing so redirected/forwarded (docker) traffic reaches it
v2.5.9
2026-10-04 17:20:11 +08:00
Markson Hon 1817643571 Merge pull request #2072 from wywywywycloud/feat/routinga-url-import
Add RoutingA import and scheduled updates from URL
2026-10-04 17:12:15 +08:00
big-head-pigeon 5a1b0c4213 fix(kernel/v2ray): transparent inbound follows PortSharing like socks/http/dns-in
Since v2.4 the dokodemo transparent inbound binds 127.0.0.1 only, so
traffic intercepted by the PREROUTING transparent rules and REDIRECTed
to the interface address (e.g. docker bridge containers) can never
reach it: all bridge-container TCP breaks while transparent proxy is
enabled, a regression from 2.2.x where the inbound listened on 0.0.0.0.

Let the inbound follow the existing 'Allow connections from LAN'
(PortSharing) setting, which the socks/http inbounds
(template_inbound.go) and dns-in (template_outbound.go) already follow.
Default behavior is unchanged (loopback-only with PortSharing off);
with PortSharing on, redirected/forwarded traffic works again.
2026-10-04 15:06:25 +08:00
Markson Hon a8334a2e71 Merge pull request #2069 from wywywywycloud/fix/openwrt-nftables-dns
fix(openwrt): install native nftables DNS redirects
2026-10-02 08:28:33 +08:00
Mikhail Levin 5ec0451a66 fix(openwrt): limit fatal DNS redirect setup to Linux proxy modes 2026-10-01 13:05:11 +03:00
Markson Hon 94693ebbe1 Merge pull request #2067 from himeer/feature/xhttp-range-json-shapes
Kernel: write xhttp ranges in the xray-core's form, import them from 3x-ui links
2026-10-01 11:34:57 +08:00
Vladimir E. Tkachuk 0f366344ea fix(gui): reject XHTTP range values below the core's bounds 2026-10-01 12:38:14 +10:00
Vladimir E. Tkachuk 86f57fb05d fix(kernel): drop XHTTP ranges the core would panic on 2026-10-01 12:37:48 +10:00
Mikhail Levin 324351f78d Add RoutingA rule import and scheduled updates from URL 2026-10-01 03:54:50 +03:00
Mikhail Levin 392b1c7942 fix(openwrt): make nft DNS redirect idempotent and preserve legacy startup 2026-10-01 01:01:05 +03:00
Vladimir E. Tkachuk 78f8e8138c fix(gui): expose the XHTTP padding fields in the codec and form 2026-09-30 15:29:32 +10:00
Vladimir E. Tkachuk 1710a70741 fix(kernel): model the core's XHTTP padding fields 2026-09-30 15:29:03 +10:00
Mikhail Levin 75ac824b43 fix(openwrt): install native nftables DNS redirects 2026-09-29 21:10:54 +03:00
Markson Hon f86763d00b Merge pull request #2056 from wywywywycloud/fix/dashboard-latency-marked-sockets
fix: retain interception during dashboard TCP probes
v2.5.8
2026-09-29 20:03:19 +08:00
Markson GuGa Beyond 5506fe1c86 test: fix the Windows socket-option readback
getsockopt(IP_UNICAST_IF) hands the interface index back in host order while
setsockopt wants it in network byte order, so the second swap in
boundProbeInterface compared 0x01000000 against 1 and the IPv4 cases of
TestBoundDirectDialerSocketOptions failed on Windows.
2026-09-29 19:39:10 +08:00
Markson GuGa Beyond df5b4ef2dc fix: send the QUIC probe through the probe dialer
Revision of the dashboard probe: the UDP fallback used an unmarked, unbound
socket, so its datagram entered the transparent interception the probe is
meant to stay out of and the round trip measured the local stack. Take the
dialer PingWithDialer was given, as the TCP dial already does.
2026-09-29 19:39:03 +08:00
Markson GuGa Beyond 152227a84b Merge branch 'main' into fix/dashboard-latency-marked-sockets 2026-09-29 19:38:56 +08:00
Markson Hon 63b59b033c Merge pull request #2068 from MarksonHon/main
fix: juicity and tuic dial, and a QUIC-only node gets a latency
2026-09-29 19:19:03 +08:00
Markson Hon f51860f625 Merge pull request #2061 from wywywywycloud/feat/routing-russia-template
Add Russian RoutingA preset with local and RU domains routed directly
2026-09-29 19:08:53 +08:00
Markson Hon b05206e61b Merge pull request #2063 from wywywywycloud/fix/dialog-action-font
Use one font for dialog action buttons and links
2026-09-29 19:02:07 +08:00
Markson GuGa Beyond a2f7952a4f fix: juicity and tuic dial, and a QUIC-only node gets a latency
Every core the service starts has outbound traffic counters on, and with them on
xray wraps the underlay connection of a native QUIC outbound in a
*stat.CounterConnection. That wrapper embeds net.Conn alone, so ReadFrom and
WriteTo are hidden and hint/proxy/juicity and hint/proxy/tuic failed their
net.PacketConn assertion before a single QUIC packet left: the node imported, and
then every connection through it died on the spot. Unwrap the stats connection
before the assertion.

A QUIC server listens on UDP only, so the TCP dial the ping made to its port said
nothing and every juicity, tuic and hysteria2 node read TIMEOUT. Keep the TCP
attempt, and when it fails ask the same port over UDP with a QUIC long header
carrying a reserved greased version: a QUIC server answers that with a Version
Negotiation packet (RFC 9000 section 6), and the round trip of that answer is the
latency. A node that answers neither probe is still TIMEOUT; the troubleshooting
pages in the six locales describe that.
2026-09-29 18:54:02 +08:00
Vladimir E. Tkachuk 7027788e6a fix(kernel): let an explicit false win over the 3x-ui blob 2026-09-29 20:42:19 +10:00
wywywywycloud e492c21b9b fix: russia preset as full rule set, drop copyright header
Move default: proxy back to the first line so RoutingA.vue treats russia as a replacement, not a snippet. Fix presets.spec.ts to match geosite:category-ru. Remove copyright header per review.
2026-09-29 11:30:38 +03:00
wywywywycloud 7f267f5d0b Update routing rules for Russian domains and services
Added rules for youtube, telegram, google - etc - services taht might still operate on .ru and on ru-geoip / geosites.

Signed-off-by: Mishalski <100153948+wywywywycloud@users.noreply.github.com>
2026-09-29 11:30:38 +03:00
wywywywycloud 8156923f55 fix: route Russian and private IPs directly in Russia preset 2026-09-29 11:30:37 +03:00
wywywywycloud a31079899e Update gui/src/dialogs/settings/routingA/russia.ts
Co-authored-by: Zakk <zakk@gentoozh.org>
Signed-off-by: Mishalski <100153948+wywywywycloud@users.noreply.github.com>
2026-09-29 11:30:37 +03:00
wywywywycloud 9c9c9f6563 feat: add Russia RoutingA rules template 2026-09-29 11:30:37 +03:00
Vladimir E. Tkachuk ccea5d1392 feat(kernel): import XHTTP tuning from 3x-ui style vless links 2026-09-29 15:52:33 +10:00
Vladimir E. Tkachuk 6162730f64 fix(kernel): write xhttp range fields in the xray-core shorthand form
xray-core's splithttp range fields (xPaddingBytes, the xmux limits, the
server-checker intervals) parse a plain integer or an "a-b" string, and
reject the object form XHTTPRangeConfig used to serialize to. Any node
with an xhttp range set produced a config the core refused to load with
"Invalid integer range, expected either string of form 1-2 or plain
integer".

XHTTPRangeConfig now carries a MarshalJSON that emits the shorthand (a
plain integer when From equals To, an "a-b" string otherwise) and an
UnmarshalJSON that accepts both forms the core accepts, so generated
configs round-trip. parseRangeString mirrors the core's ParseRangeString
down to its negative endpoints such as "-114-514". Stored settings are
unaffected: the GUI keeps the endpoints as separate query parameters and
nothing parses the generated config back into these structs.
2026-09-28 21:24:10 +10:00
Mikhail Levin 9c73c1a581 Match dialog action font across buttons and links 2026-09-27 17:36:08 +03:00
Mikhail Levin cef8fbc939 fix: bind dashboard probes to TUN egress on macOS and Windows 2026-09-25 21:34:00 +03:00
Mikhail Levin fd7a587dc2 fix: keep interception during dashboard TCP probes 2026-09-25 16:12:43 +03:00
Markson Hon bdbc305e97 Merge pull request #2052 from Zakkaus/iptables-ipset
fix(iptables): match the transparent-proxy whitelist with ipset
2026-09-24 15:13:50 +08:00
Markson Hon 2524f6cc8a Merge pull request #2051 from Zakkaus/ss-cipher
fix: refuse Shadowsocks links whose cipher the core does not accept
2026-09-24 15:12:31 +08:00
Zakk 8b818ffc41 fix(iptables): match the transparent-proxy whitelist with ipset
The iptables path wrote each whitelisted CIDR with its own iptables
process. With the mainland China group (about 15,000 CIDRs) a core start
spent minutes on this, and every packet of a direct connection walked
the list linearly.

Load each family into one hash:net set with a single `ipset restore` and
match it with one rule at the old position. Without ipset, write the
rules with one `iptables-restore --noflush` per family; without that,
keep the per-rule commands. Cleanup destroys the sets.
2026-09-24 01:23:08 +10:00
Zakk 0de4b2c4a4 fix: refuse Shadowsocks links whose cipher the core does not accept
A Shadowsocks link with a stream cipher (rc4-md5, aes-128-cfb, aes-256-cfb,
chacha20-ietf) or with none/plain imported without complaint and failed at
core start with "unknown cipher method", so the user saw a broken core rather
than a refused node. xray-core dropped the stream ciphers in 2021 and never
took none or plain in the shadowsocks outbound; these are also the ciphers
ShadowsocksR providers hand out.

ParseSSURL now refuses them with LINK_UNSUPPORTED_CIPHER, which NewFromLink
passes through instead of calling the link malformed; subscriptions skip such
nodes with a warning as they skip other unparseable ones, and the Clash
importer goes through the same parser. The node form drops none and plain and
offers xchacha20-ietf-poly1305, which the core does accept. The six locales
carry the message, and the quick-start pages say which ciphers work.
2026-09-23 21:01:56 +10:00
Markson Hon ed5fb72b03 Merge pull request #2049 from Zakkaus/templates
docs: a contributing guide, a pull request template and issue forms
2026-09-23 13:11:59 +08:00
Zakk 154f016fdd docs: a contributing guide, an agents file, a pull request template and issue forms
The repository had six markdown issue templates, no pull request template and
no guide, so a report rarely said which version it was and a pull request
rarely said what its author had run.

The issue templates become four GitHub forms, English and Chinese kept apart,
asking for the version and why it is not the latest, the system and install
method, the transparent proxy mode, the steps, the logs and the person who
answers for the report. Usage questions go to Discussions through config.yml,
and blank issues are off. The pull request template, also in two languages,
asks for the change in the author's own words, what was executed and observed,
and a checklist of what the review expects; two of its boxes are true only of
someone who checked the list without reading it, or of an agent submitting
without human review, and checking either one closes the pull request.

CONTRIBUTING.md says where the code lives, what to run before opening a pull
request, that all six locales change together and that no AI attribution goes
into the history. AGENTS.md tells an assistant the same in its own terms, with
the traps that cost a review round: the web files the service embeds, the
locale and documentation directories that are named differently, the escaped
@ in a locale string, the Material colour and type tokens, and what in core/
belongs to v2rayA rather than to xray-core.
2026-09-22 21:54:12 +10:00
Markson Hon a5e2e11dae Merge pull request #2048 from Zakkaus/header-group 2026-09-22 19:00:58 +08:00
Zakk 8bf10435b8 fix(gui): the header's buttons stay put across views; the group button lives on the dashboard card
The page was 1400 px wide on the dashboard, proxies and subscriptions and
1040 px centred elsewhere, so the title and the header's buttons jumped
sideways on every change of view. The page is one width now and only the
body of a reading view is capped at 1040 px, left-aligned under the title.
The app bar's and the page header's group button go: the dashboard's group
card carries the picker with the member editing beside it, the header copy
had no such actions (from the chat).
2026-09-22 20:54:41 +10:00
Markson Hon 7671a8a795 Merge pull request #2047 from Zakkaus/status-rfc3339
fix(service): a subscription's update time carries its zone
v2.5.7
2026-09-22 17:55:06 +08:00