<feed xmlns='http://www.w3.org/2005/Atom'>
<title>vyos-1x.git/src/conf_mode/firewall.py, branch nos-task-id</title>
<subtitle>VyOS command definitions, scripts, and utilities (mirror of https://github.com/vyos/vyos-1x.git)
</subtitle>
<id>https://git.amelek.net/vyos/vyos-1x.git/atom?h=nos-task-id</id>
<link rel='self' href='https://git.amelek.net/vyos/vyos-1x.git/atom?h=nos-task-id'/>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/'/>
<updated>2026-07-23T14:28:21+00:00</updated>
<entry>
<title>Merge pull request #5327 from BradKollmyer/T9076-remote-group-interval</title>
<updated>2026-07-23T14:28:21+00:00</updated>
<author>
<name>Daniil Baturin</name>
<email>daniil@vyos.io</email>
</author>
<published>2026-07-23T14:28:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=3668d1eec819d545ec29bd56a98e22ce4775156e'/>
<id>urn:sha1:3668d1eec819d545ec29bd56a98e22ce4775156e</id>
<content type='text'>
firewall: T9076: add per-remote-group update interval</content>
</entry>
<entry>
<title>utils: T9008: migrate remaining cmd() callers to cmdl() and remove cmd()</title>
<updated>2026-07-17T16:10:08+00:00</updated>
<author>
<name>Christian Breunig</name>
<email>christian@breunig.cc</email>
</author>
<published>2026-07-09T20:21:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=e0684c0c343835c7674a94424d847592511915b0'/>
<id>urn:sha1:e0684c0c343835c7674a94424d847592511915b0</id>
<content type='text'>
Complete the safer-subprocess migration started by the cmdl()/ifconfig
refactoring and convert every remaining vyos.utils.process.cmd() call site to
the list-based cmdl().

Drop the vyos.utils.process.cmd() implementation as it is no longer in use.
</content>
</entry>
<entry>
<title>firewall: T9076: add per-remote-group update interval</title>
<updated>2026-07-10T23:31:18+00:00</updated>
<author>
<name>Brad Kollmyer</name>
<email>bradk@vitalsoft.com</email>
</author>
<published>2026-07-10T21:54:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=91850ce83561cdd24f21a0dfa67d0754b0ff5e80'/>
<id>urn:sha1:91850ce83561cdd24f21a0dfa67d0754b0ff5e80</id>
<content type='text'>
Add 'set firewall group remote-group &lt;name&gt; interval &lt;value&gt;' to
control how often each remote group list is re-downloaded,
independent of the global resolver-interval that also drives
domain-group/FQDN resolution.

The value accepts plain seconds or time-unit suffixes s/m/h/d/w
(e.g. 4h), range 60 seconds to 4 weeks, enforced at commit time
after conversion. When unset, the group keeps following
'firewall global-options resolver-interval', so existing
configurations are unaffected.

vyos-domain-resolver now tracks a last-update timestamp per
remote group and sleeps until the next due update instead of a
fixed resolver-interval tick, honoring per-group intervals both
shorter and longer than the global one. A group is only stamped
as updated after a successful download; failed downloads fall
back to the cached list and are retried at the resolver cadence
rather than after the full group interval.

human_to_seconds() now treats a plain number as seconds instead
of returning 0.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>firewall: T8761: re-introduce VRF interface names in generated firewall config</title>
<updated>2026-07-01T19:51:21+00:00</updated>
<author>
<name>David Vølker</name>
<email>david@voelker.dk</email>
</author>
<published>2026-06-01T06:09:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=0d3ac22b95cef90e7c54ef823c00bb59b935c158'/>
<id>urn:sha1:0d3ac22b95cef90e7c54ef823c00bb59b935c158</id>
<content type='text'>
This change re-implements the intended behaviour from T4180 aswell as from
T4506, it ensures that both the vrf-member interface aswell as the vrf itself
is added as an oifname -&gt; meaning that traffic traversing and originating from
withing VyOS is matches outbound.

Changes done by c-po:
* re-sort dependency list to keep diff low
* vyos.configdict.is_vrf_changed() should return early and not carry
  over the to-be return value
* keep common coding style (dict by . separation) in nftables-zone.j2

Co-authored-by: Christian Breunig &lt;christian@breunig.cc&gt;
</content>
</entry>
<entry>
<title>geoip: T5746: Add GeoIP ASN support</title>
<updated>2026-06-04T14:18:29+00:00</updated>
<author>
<name>sarthurdev</name>
<email>965089+sarthurdev@users.noreply.github.com</email>
</author>
<published>2025-11-28T14:43:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=dffcc04dc143202b412a96ba60867d8509c57e1c'/>
<id>urn:sha1:dffcc04dc143202b412a96ba60867d8509c57e1c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>geoip: T8590: fix initialization failure and set clobbering on boot and commit</title>
<updated>2026-05-19T21:33:48+00:00</updated>
<author>
<name>xTITUSMAXIMUSX</name>
<email>chad@chadhigh.com</email>
</author>
<published>2026-05-01T01:43:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=a263b2b62e72b208fd330f9055aefca29640ff2b'/>
<id>urn:sha1:a263b2b62e72b208fd330f9055aefca29640ff2b</id>
<content type='text'>
Three related bugs prevented GeoIP nftables sets from being populated
correctly at boot and when incrementally modifying firewall or policy
route rules.

1. geoip_updated() always returned False

   The previous implementation called node_changed() and then searched
   the result with dict_search_recursive(changes, 'geoip').  This could
   never match: node_changed() is annotated `-&gt; list` and returns a flat
   list of the immediate top-level child names whose subtree changed
   (e.g. ['ipv4'] for the firewall path, or route names for policy
   route).  The 'geoip' key sits several levels deeper than those names,
   so dict_search_recursive — which only walks dicts and lists for a
   matching dict key — never yielded a hit, and geoip_updated() always
   returned False.  As a consequence, geoip_update() was never triggered
   by an incremental add or change of a GeoIP rule; the only path that
   ever populated /run/nftables-geoip.conf was the explicit \"update
   geoip\" command or the fallback when geoip_refresh() failed.

   Fix: bypass node_changed() and call get_config_diff() /
   get_child_nodes_diff() directly with expand_nodes=Diff.ADD|Diff.DELETE
   and recursive=True.  In that mode, the 'add' and 'delete' values in
   the returned dict are full nested subtrees of the config diff, so
   dict_search_recursive correctly finds 'geoip' wherever it appears in
   the change set.

2. GeoIP block executed unconditionally, breaking the boot sequence

   geoip_sets() always returns {'name': [], 'ipv6_name': []}.  A
   non-empty dict is truthy in Python regardless of whether its values
   are empty lists, so the guards \"if geoip_sets:\" and
   \"if 'name' in geoip_sets:\" were always True.

   On boot, when policy_route.py is invoked as a dependent of
   firewall.py (triggered by group_resync), it entered the GeoIP block
   even with no policy route GeoIP rules configured.  Because
   /run/nftables-geoip.conf did not yet exist, geoip_refresh() returned
   False and geoip_update(policy=policy) was called with an empty
   policy.  This created /run/nftables-geoip.conf containing only empty
   table stubs.  When firewall.py subsequently called geoip_refresh(),
   the file existed and nft loaded it successfully — so the
   geoip_update(firewall) call was never reached and the firewall GeoIP
   sets stayed empty for the entire uptime of the router.

   Fix: check the actual list contents instead of the container dict:
   if geoip_sets['name'] or geoip_sets['ipv6_name'].

3. geoip_update() clobbered the other caller's sets

   geoip_update() renders /run/nftables-geoip.conf from both
   firewall_sets and policy_sets in a single pass.  When called with
   only one argument (as firewall.py and policy_route.py each do), the
   other argument defaulted to None and that half of the file was
   rendered empty, erasing whatever the other script had written.  The
   geoip-update helper used by \"update geoip\" and the weekly cron was
   unaffected because it always passes both arguments, which masked
   this bug in normal manual operation.

   Fix: when either argument is absent, read the missing config from
   the live Config session before building the set tables, so every
   invocation writes the complete combined firewall + policy file.
</content>
</entry>
<entry>
<title>firewall: T8446: Prevent chain with offload rule on local zone</title>
<updated>2026-03-31T21:09:09+00:00</updated>
<author>
<name>sarthurdev</name>
<email>965089+sarthurdev@users.noreply.github.com</email>
</author>
<published>2026-03-31T20:47:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=5d51856e5d350ba8d855c047cbc942fcf48b575c'/>
<id>urn:sha1:5d51856e5d350ba8d855c047cbc942fcf48b575c</id>
<content type='text'>
* Add warning when defining `offload-target` without setting action to `offload`
</content>
</entry>
<entry>
<title>geoip: T8049: Add MaxMind database support</title>
<updated>2026-01-21T10:52:29+00:00</updated>
<author>
<name>sarthurdev</name>
<email>965089+sarthurdev@users.noreply.github.com</email>
</author>
<published>2025-11-06T10:14:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=8a329ef98eb120cc91aac6f7da6cd61dbc1ab950'/>
<id>urn:sha1:8a329ef98eb120cc91aac6f7da6cd61dbc1ab950</id>
<content type='text'>
</content>
</entry>
<entry>
<title>geoip: T7926: Refactor geoip handling</title>
<updated>2026-01-21T10:52:29+00:00</updated>
<author>
<name>sarthurdev</name>
<email>965089+sarthurdev@users.noreply.github.com</email>
</author>
<published>2025-10-02T15:47:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=7f6f94370ec04ce48e7a19880a74ba0c25f7bfb5'/>
<id>urn:sha1:7f6f94370ec04ce48e7a19880a74ba0c25f7bfb5</id>
<content type='text'>
* Move core logic to separate vyos.geoip module
* Use a sqlite database for storing and querying address ranges by country
* Remove downloaded geoip ranges once loaded into sqlite db
* No longer rebuild geoip sets on each commit unless necessary
* Allows for extensibility using other geoip data vendors
</content>
</entry>
<entry>
<title>Merge pull request #4672 from apschultz/zone_default_firewall_ruleset</title>
<updated>2025-11-24T19:48:07+00:00</updated>
<author>
<name>Simon</name>
<email>965089+sarthurdev@users.noreply.github.com</email>
</author>
<published>2025-11-24T19:48:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/vyos-1x.git/commit/?id=fdda826b48688e253c30d3578ca5edd45b034ab0'/>
<id>urn:sha1:fdda826b48688e253c30d3578ca5edd45b034ab0</id>
<content type='text'>
firewall: T7739: Default ruleset for firewall zones</content>
</entry>
</feed>
