<feed xmlns='http://www.w3.org/2005/Atom'>
<title>packages/net/shunt/src, branch master</title>
<subtitle>Mirror of packages feed</subtitle>
<id>https://git-03.infra.openwrt.org/feed/packages/atom?h=master</id>
<link rel='self' href='https://git-03.infra.openwrt.org/feed/packages/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/'/>
<updated>2026-10-11T18:43:56Z</updated>
<entry>
<title>shunt: update to 0.1.12</title>
<updated>2026-10-11T18:43:56Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-11T18:43:31Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=8384d21802fc5686002f56962b8a4919d4626054'/>
<id>urn:sha1:8384d21802fc5686002f56962b8a4919d4626054</id>
<content type='text'>
- fallback 'block' now rejects instead of dropping, so clients fail
  at once rather than on a timeout
- tproxy: a proxied flow whose listener is gone is rejected the same
  way, whatever the fallback
- route: the policy table's fallback default is a prohibit route
  instead of a blackhole
- update the README

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: ignore unspecified netifd nexthop</title>
<updated>2026-10-06T19:49:15Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-06T19:48:35Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=24d2074662472662eb3a540b535b0cab8f7d7460'/>
<id>urn:sha1:24d2074662472662eb3a540b535b0cab8f7d7460</id>
<content type='text'>
netifd always emits a nexthop for its routes, the unspecified address
for a gateway-less one, e.g. wg0 with route_allowed_ips. Taken as
gateway, IPv4 treats 0.0.0.0 as none, but the kernel rejects "via ::"
with EINVAL, so the IPv6 policy route was never installed and marked
traffic fell through to main, where the interface metrics decided
(IPv6 leak via WAN).

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.1.11</title>
<updated>2026-10-05T18:35:54Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-05T18:35:54Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=fa452167642442bd96f29fc7d21b01aee4c0e9e1'/>
<id>urn:sha1:fa452167642442bd96f29fc7d21b01aee4c0e9e1</id>
<content type='text'>
* add the per-policy action 'tproxy': hands the selected tcp/udp traffic
  to a transparent proxy on the router (option tproxy_port), delivered to
  127.0.0.1/::1 via a 'local default dev lo' policy table
* restore rules for tproxy flows carry the tproxy statement on every
  packet - a mark alone loses udp flows to the proxy's reply socket
* a proxied flow whose listener is gone is always dropped: its conntrack
  entry was never NATed and would leave with the client's own address;
  fallback 'main'/'block' decides about new flows only
* no tproxy rules in output (the kernel rejects the statement there), no
  keep_local rule for tproxy (main would forward socket-assigned packets)
* tproxy policies are skipped as an issue without kmod-nft-tproxy instead
  of failing the whole nft batch
* shunt check and the rpcd status report tproxy policies
* readme update

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update 0.1.10</title>
<updated>2026-09-18T14:06:46Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-18T14:06:24Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=6990c0a844c5bdb6afc57f07b3e0bc01d3c56dac'/>
<id>urn:sha1:6990c0a844c5bdb6afc57f07b3e0bc01d3c56dac</id>
<content type='text'>
* snooped elements expire with the TTL of the DNS answer,
  clamped to 60..entry_ttl; entry_ttl is now the ceiling, polled elements still use it
* write cache tracks the expiry it last wrote per element and rewrites
  when the new expiry moves by at least half of the answer's lifetime, in either direction
* a flow's route is decided on its first packet and kept on the conntrack entry:
  route statements set ct mark, one restore rule per policy marks later packets
  of the original direction, settled flows skip the lookups
* LuCI: change the entry_ttl option text
* update the README

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.1.8</title>
<updated>2026-09-16T17:29:17Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-16T17:28:58Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=93a34793be4416febf6dd835ad3aa97c26b27dd7'/>
<id>urn:sha1:93a34793be4416febf6dd835ad3aa97c26b27dd7</id>
<content type='text'>
- new per-policy `domain_file` list: domain patterns from a file, one
  per line, for community-maintained lists too large for UCI. Entries
  are learned by snoop only, never polled
- a bare name lives under /tmp/shunt (tmpfs, no flash wear), an
  absolute path is taken as given; a missing file is an issue, not a
  fatal error, the policy stays rendered with empty sets
- new `shunt refresh` (ubus method `refresh`): re-reads the files and
  swaps the matcher in place, no restart, learned addresses stay
- matcher: regex fast path, 4x faster on 100k patterns
- routes and rules are written over rtnetlink via ucode-mod-rtnl
  instead of one `ip` process per command; route.uc renders the
  netlink operations, the new src/rt.uc applies them and reads the
  verdict from rtnl.error()
- `rp_filter_manage` writes /proc/sys directly, `nft` is the last
  remaining child process
- `+ip` dropped from DEPENDS
- README update

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.1.6</title>
<updated>2026-09-07T19:50:46Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-07T19:50:46Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=b76e77d4889d81e004c265de09e0ddef6fa8180b'/>
<id>urn:sha1:b76e77d4889d81e004c265de09e0ddef6fa8180b</id>
<content type='text'>
- *Per-policy `action`, `route` (default) or `bypass` - the equivalent of pbr's `ignore`,
  an exception carved out of every policy below it.
- `keep_local`, default on - a marked packet to one of your own subnets
  stays on `main` instead of taking the policy's default route.
- The ruleset is re-applied when the table is deleted - e.g. with `/etc/init.d/firewall stop`
- README update

Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: add new package</title>
<updated>2026-08-25T19:24:47Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-08-23T17:05:33Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=928797a9914e8db8dfd615c5d2f29017d320926c'/>
<id>urn:sha1:928797a9914e8db8dfd615c5d2f29017d320926c</id>
<content type='text'>
shunt is a policy-based routing daemon for OpenWrt. Policies select
traffic by client address or MAC, destination address, domain, port and
protocol, and route it into any netifd interface or device via fwmark
and per-policy routing tables in nftables/fw4.

Domains are covered by a passive DNS observer (AF_PACKET + BPF) that
works with any resolver - dnsmasq, unbound, AGH, a remote DoH client -
because it reads answers on the LAN bridges instead of integrating with
a specific DNS backend. An optional poller pre-warms configured names.
Learned addresses are written in adaptive batches to stay usable beside
packages that keep very large nft sets (e.g. banIP).

Written in ucode, no dependencies beyond ucode modules, nft and ip.
Companion LuCI app is submitted separately to openwrt/luci.

Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
</feed>
