dave14305
Part of the Furniture
No, saveipset doesn’t exist. Is this a recommendation from AI?Is saveipset a safe permanent substitute for save in the hourly cron?
No, saveipset doesn’t exist. Is this a recommendation from AI?Is saveipset a safe permanent substitute for save in the hourly cron?
I was going to say that the firewall should not restart unless an ipset or iptables rule is missing. What specifically does the log say about rule integrity? What does your custom rule look like?I have custom MAC-based RETURN rules in PREROUTING inserted via a YazFi userscript that appear to be flagged as integrity violations.
Failures for #14 and #15 are related to iot ports and rules within Skynet. It's not a rule number, but a check number. Did you configure iot blocking in skynet? What do you get from this command?The table ends at rule 6 — rules #14 and #15 simply don't exist.
iptables -S FORWARD | grep Skynet
Update on the integrity violation for #14 and #15:Failures for #14 and #15 are related to iot ports and rules within Skynet. It's not a rule number, but a check number. Did you configure iot blocking in skynet? What do you get from this command?
Code:iptables -S FORWARD | grep Skynet
Skynet is sadly looking for a string match of the rule, but the output of the output interface in your example is in a different position than Skynet expects:-A FORWARD -i br+ -o eth0 -p tcp -m set --match-set Skynet-IOT src -m tcp -m multiport --dports 80,443,53,123 -j ACCEPT
-A FORWARD -i br+ -o eth0 -p udp -m set --match-set Skynet-IOT src -m udp -m multiport --dports 80,443,53,123 -j ACCEPT
Is there something specific about the logging flags or the way these rules are formatted that would cause checks #14 and #15 to fail even though the rules are present?
-A FORWARD -i br+ -m set --match-set Skynet-IOT src -o $iface -p udp -m udp -m multiport --dports $iotports -j ACCEPT
-A FORWARD -i br+ -m set --match-set Skynet-IOT src -o $iface -p tcp -m tcp -m multiport --dports $iotports -j ACCEPT
Thank you for this awesome FW. Nothing particular on the country blocking, just keeping the WWW not so Wide.Skynet v8 - Router Firewall & Security Enhancements
The largest upgrade in Skynet’s 11-year history
Built exclusively for ASUSWRT-Merlin, Skynet v8 delivers a fully modernised codebase with major performance, reliability, and maintainability improvements - while keeping the familiar interface users already know.
What’s New in v8 (full list of changes available on GitHub)
Firewall, DNS, and IPSet improvements
- Unified IPSet handling through new IPSet_Wrapper()
- Converted core ipset code to wrapper (rollout ongoing)
- Domain lookup timeout control - prevents long stalls
- CIDR attribution accuracy improved in stats
- Country lookup only when enabled, with safer handling of malformed data
Race condition & concurrency fixes
- New lock management using flock
- Runtime/age of locks shown in logs for easier diagnosis
- Safe stale lock cleanup with ownership checks
- Trap-based cleanup on exit to prevent orphaned locks
- Race conditions reduced in parallel execution paths
Stability & network hardening
- Refactored Check_Connection() and DNS lookups
- Reduced IPTables workload (no more process flooding)
- Improved NTP sync validation
Menu system modernisation (in active development)
- Show_Menu() - easier, more consistent menu creation
- Prompt_Input() / Prompt_Typed() - validated user input
- Unified navigation and clearer error handling
- Reduced nesting for simpler, more readable flow
Stats & event logging enhancements
- New Run_Stats() system for cleaner statistics
- Added Show_Associated_Domains()
- Improved block reasons, including CIDR correlation
- Startup banners preserved (last 3) instead of being purged immediately
- Custom log size support:
Code:sh /jffs/scripts/firewall settings logsize 20
Code quality & compatibility
- ShellCheck compliance improvements across the script
- Shorter curl paths and safer download logic
- VSCode formatting / phrasing issues resolved
- "debug run xxx" now supports arguments for easier testing
- Improved internal documentation and function comments
Swap + storage handling
- Simplified swap detection logic
- Detect and repair dnsmasq additional config permissions
- New find_install_dir() helper for locating the install path
------------------------------------------------------------
![]()
![]()
![]()
![]()
------------------------------------------------------------
How To Install
SSH:
Code:/usr/sbin/curl -fsL "https://raw.githubusercontent.com/Adamm00/IPSet_ASUS/master/firewall.sh" -o "/jffs/scripts/firewall" && chmod 755 /jffs/scripts/firewall && sh /jffs/scripts/firewall install
Or install from AMTM:
Code:amtm
Example startup output:
Code:Nov 15 10:26:54 Skynet: [i] Startup Initiated... ( skynetloc=/tmp/mnt/USB/skynet ) Nov 15 10:27:15 Skynet: [#] 33467 IPs (+0) -- 2365 Ranges Banned (+0) || 0 Inbound -- 0 Outbound Connections Blocked! [start] [20s]
------------------------------------------------------------
Support & issue tracking
For reproducible issues, enhancement requests, or deeper technical investigation:
Please use the GitHub Issue Tracker where development is active and changes are tracked.
General questions and discussion are welcome in this thread.
------------------------------------------------------------
Open Source - Free Forever
Skynet is hosted on GitHub.
If you'd like to support ongoing development:
Every contribution helps - from funding test hardware to covering development time.
------------------------------------------------------------
Looking ahead
- Full IPv6 Support
- Continued menu modernisation
- Improved WebUI (Community assistance required)
Thank you Dave, that explains it perfectly. It's a relief to know the IoT rules are actually functioning correctly and this is purely a string-matching bug in the integrity checker since v8.0.0.Skynet is sadly looking for a string match of the rule, but the output of the output interface in your example is in a different position than Skynet expects:
It was easier when Skynet used to check for the rules using iptables -C (for check). It's a bug since 8.0.0.Code:-A FORWARD -i br+ -m set --match-set Skynet-IOT src -o $iface -p udp -m udp -m multiport --dports $iotports -j ACCEPT -A FORWARD -i br+ -m set --match-set Skynet-IOT src -o $iface -p tcp -m tcp -m multiport --dports $iotports -j ACCEPT
I created a pull request to fix it. Hopefully it's the same output on all the various firmware branches.Since the hourly integrity check failure is triggering restart_firewall and dropping my VLANs for ~20 seconds every hour, I need a workaround while waiting for Adamm to patch it. Would running firewall iot disable be the appropriate temporary fix, or is there a better approach you'd recommend?
Thank you for filing the fix so quickly — much appreciated! I'll run firewall update -f to check if it's already available. If the PR hasn't been merged yet, I'll temporarily disable IoT blocking to stop the hourly restarts in the meantime. Will re-enable once the patch is live.I created a pull request to fix it. Hopefully it's the same output on all the various firmware branches.
![]()
fix IOT rule checks for proper param order by dave14305 · Pull Request #194 · Adamm00/IPSet_ASUS
Creates false integrity violations when iotports is populated. Actual output from 3006.102.7_2 iptables: -A FORWARD -i br+ -o eth0 -p tcp -m set --match-set Skynet-IOT src -m tcp -m multiport --dpo...github.com
When I try to disable it temporarily with (9), same error.Lock file busy but metdata invalid (pid=' ') - another Skynet instance is running - Exiting
rm -f /tmp/skynet.lock
We use essential cookies to make this site work, and optional cookies to enhance your experience.