The image has no IPv6 at all — not disabled in userspace, absent from the kernel. That is
worth an explicit decision rather than continued inheritance, because the reason it is off
turns out to be "stock had it off" and nothing more.
Current state
board/mister/de10nano/linux.config:106 # CONFIG_IPV6 is not set (DE10, and RT — see below)
board/mister/common/linux-mister.fragment:195 # CONFIG_IPV6 is not set (DE25)
work/stock-linux.config # CONFIG_IPV6 is not set (stock)
output-rt/build/linux-7.2.4/.config # CONFIG_IPV6 is not set (RT, resolved)
The DE25 fragment states the rationale in full: "IPv6 is OFF, matching the DE10 and
stock." And the DE10's line carries no comment at all. So the chain is parity-with-stock
inherited twice, not a decision anybody made on the merits. CONFIG_IPV6 is
tristate … default y in net/ipv6/Kconfig, so both we and stock are actively turning it
off.
Consequence: no link-local addresses, no SLAAC, no DHCPv6, no ::1. Every daemon is v4-only
— not because it is configured that way, but because the kernel offers nothing else.
Only two files need the kernel change, because package/linux-rt/linux-rt.mk:59 reuses
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE, so the DE10's config covers the RT build too.
Already IPv6-ready — this is less work than it looks
- busybox:
CONFIG_FEATURE_IPV6=y in the resolved config, so the applets are v6-capable.
- dhcpcd:
etc/dhcpcd.conf:48 already carries slaac private. The SLAAC configuration
is sitting there waiting for a kernel that can use it.
- sshd:
etc/ssh/sshd_config:14-16 leaves AddressFamily, ListenAddress 0.0.0.0 and
ListenAddress :: all commented out, i.e. defaults, i.e. both families.
- ip6tables is already built and installed —
output/target/sbin/ip6tables,
-restore, -save, -apply, plus the -legacy variants. The userland firewall tooling
exists; only the kernel tables are missing.
- Python, OpenSSL, libcurl, Samba and ntpd are all v6-capable as built.
What would have to change
Kernel
CONFIG_IPV6=y in board/mister/de10nano/linux.config and
board/mister/common/linux-mister.fragment. =y, not =m — net/ipv6/Kconfig:6
warns "IPv6 as module will cause a CRASH if you try to unload it".
- Netfilter v6 mirroring the legacy v4 set already present (
CONFIG_IP_NF_IPTABLES=y,
CONFIG_IP_NF_FILTER=y, CONFIG_NETFILTER_XTABLES_LEGACY=y):
CONFIG_IP6_NF_IPTABLES, CONFIG_IP6_NF_IPTABLES_LEGACY, CONFIG_IP6_NF_FILTER,
CONFIG_IP6_NF_TARGET_REJECT, CONFIG_NF_LOG_IPV6. Conntrack is already y and is
family-agnostic.
- A pre-existing gap this would inherit: the RT kernel has
CONFIG_NETFILTER=y,
CONFIG_NETFILTER_XTABLES=y and CONFIG_IP_NF_IPTABLES=y but no CONFIG_IP_NF_FILTER
in its resolved config at all — there is no v4 filter table on RT today, so iptables
loads and has nowhere to put a rule. Adding IPv6 on top of that makes an existing hole
wider. This needs fixing first or alongside.
- Size cost is unmeasured. A
make linux-rebuild before and after would settle it. It
matters more here than usual: linux.img ships gzipped and the sdcard installer runs
under a mem=511M cap.
Userland
etc/hosts currently holds only 127.0.0.1 localhost and 127.0.1.1 MiSTer. Needs
::1 localhost ip6-localhost ip6-loopback and the conventional ff02::1 / ff02::2
entries.
etc/proftpd.conf:14 is an explicit UseIPv6 off. Flipping it is one line; whether we
should is the security question below.
- busybox:
CONFIG_FEATURE_IFUPDOWN_IPV6 is off, so iface … inet6 stanzas in
/etc/network/interfaces would be silently misparsed if anyone adds one.
CONFIG_PING6 and CONFIG_TRACEROUTE6 are also off — ping -6 works via
FEATURE_IPV6, but there is no ping6/traceroute6 binary, which is what most
troubleshooting instructions on the forum will tell a user to run.
/etc/network/interfaces: the wlan stanzas are inet manual with dhcpcd doing the
addressing, so they may need no change at all — worth verifying rather than assuming,
given the guard/poll logic already living in those stanzas.
- sysctl policy to decide and document:
accept_ra, use_tempaddr (privacy addressing),
and a supported disable_ipv6 opt-out for users who want it off.
Security — this is the gate, not a footnote
Today the board is shielded from the internet substantially by accident: IPv4 NAT.
SLAAC hands out a globally routable address the moment any router on the segment advertises
a prefix. ADR 0031 already records what is listening behind that accident — root:1 over both
SSH and FTP, anonymous writable FTP, Samba, and SECCOMP off. Turning IPv6 on without a
firewall converts "unreachable because NAT" into "reachable from the internet", and users
will not know it happened.
So enabling IPv6 requires one of:
- a default-deny
ip6tables INPUT ruleset plus an init script to load it (and the RT
filter-table fix above, or it is unenforceable on the RT kernel); or
- IPv6 compiled in but administratively off (
net.ipv6.conf.all.disable_ipv6=1) with a
documented opt-in, which gets us the capability without changing anyone's exposure.
Either way this belongs in ADR 0031 before it ships. Option 2 is the cheap, honest first
step; option 1 is the real feature.
Things that degrade, that we do not control
- The OSD stops showing an address on a v6-only network.
Main_MiSTer/menu.cpp:680-681
filters on ifa->ifa_addr->sa_family == AF_INET for both eth0 and wlan*, so an
interface holding only IPv6 addresses displays nothing. Upstream's code — per our policy
that is a report to hand over, not a drive-by PR. Dual-stack hides it entirely, which is
another argument for dual-stack over v6-only.
mister.lan discovery. We ship no mDNS responder, so the name works because the
router registers the DHCPv4 hostname. Dual-stack keeps that; v6-only would lose it.
Docs and CI
scripts/ci-tests.sh contains no IPv6 assertions of any kind.
docs/wifi-parity.md, docs/ssh-ftp-parity.md, docs/netfs-parity.md and
docs/kernel-config-deltas.md all describe a v4-only world and would need updating.
- No ADR or doc anywhere currently explains why IPv6 is off — this issue is the first
place that question has been written down.
Recommendation
Dual-stack, never v6-only — it keeps mister.lan, keeps the OSD address display
working, and makes the whole change additive.
Land it in two steps. First the kernel symbols plus /etc/hosts, the busybox applets
and the ip6tables tables, shipped with disable_ipv6=1 by default: that makes the image
capable without changing anyone's exposure, and it is reviewable on its own. Then the
firewall ruleset and the default flip as a second change, dispositioned in ADR 0031.
Two questions for @mcfbytes before any of this starts:
- Is diverging from stock acceptable here? Stock is v4-only, and this project's default
posture is parity. An IPv6-capable image is a deliberate divergence — a defensible one,
since IPv6-only and v6-preferred home networks are no longer exotic, but it should be a
stated choice rather than a side effect.
- On by default, or opt-in? This is really "do we ship a firewall", and it is the same
question ADR 0031 is already holding open for IPv4.
Work items
The image has no IPv6 at all — not disabled in userspace, absent from the kernel. That is
worth an explicit decision rather than continued inheritance, because the reason it is off
turns out to be "stock had it off" and nothing more.
Current state
The DE25 fragment states the rationale in full: "IPv6 is OFF, matching the DE10 and
stock." And the DE10's line carries no comment at all. So the chain is parity-with-stock
inherited twice, not a decision anybody made on the merits.
CONFIG_IPV6istristate … default yinnet/ipv6/Kconfig, so both we and stock are actively turning itoff.
Consequence: no link-local addresses, no SLAAC, no DHCPv6, no
::1. Every daemon is v4-only— not because it is configured that way, but because the kernel offers nothing else.
Only two files need the kernel change, because
package/linux-rt/linux-rt.mk:59reusesBR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE, so the DE10's config covers the RT build too.Already IPv6-ready — this is less work than it looks
CONFIG_FEATURE_IPV6=yin the resolved config, so the applets are v6-capable.etc/dhcpcd.conf:48already carriesslaac private. The SLAAC configurationis sitting there waiting for a kernel that can use it.
etc/ssh/sshd_config:14-16leavesAddressFamily,ListenAddress 0.0.0.0andListenAddress ::all commented out, i.e. defaults, i.e. both families.output/target/sbin/ip6tables,-restore,-save,-apply, plus the-legacyvariants. The userland firewall toolingexists; only the kernel tables are missing.
What would have to change
Kernel
CONFIG_IPV6=yinboard/mister/de10nano/linux.configandboard/mister/common/linux-mister.fragment.=y, not=m—net/ipv6/Kconfig:6warns "IPv6 as module will cause a CRASH if you try to unload it".
CONFIG_IP_NF_IPTABLES=y,CONFIG_IP_NF_FILTER=y,CONFIG_NETFILTER_XTABLES_LEGACY=y):CONFIG_IP6_NF_IPTABLES,CONFIG_IP6_NF_IPTABLES_LEGACY,CONFIG_IP6_NF_FILTER,CONFIG_IP6_NF_TARGET_REJECT,CONFIG_NF_LOG_IPV6. Conntrack is alreadyyand isfamily-agnostic.
CONFIG_NETFILTER=y,CONFIG_NETFILTER_XTABLES=yandCONFIG_IP_NF_IPTABLES=ybut noCONFIG_IP_NF_FILTERin its resolved config at all — there is no v4 filter table on RT today, so
iptablesloads and has nowhere to put a rule. Adding IPv6 on top of that makes an existing hole
wider. This needs fixing first or alongside.
make linux-rebuildbefore and after would settle it. Itmatters more here than usual:
linux.imgships gzipped and the sdcard installer runsunder a
mem=511Mcap.Userland
etc/hostscurrently holds only127.0.0.1 localhostand127.0.1.1 MiSTer. Needs::1 localhost ip6-localhost ip6-loopbackand the conventionalff02::1/ff02::2entries.
etc/proftpd.conf:14is an explicitUseIPv6 off. Flipping it is one line; whether weshould is the security question below.
CONFIG_FEATURE_IFUPDOWN_IPV6is off, soiface … inet6stanzas in/etc/network/interfaceswould be silently misparsed if anyone adds one.CONFIG_PING6andCONFIG_TRACEROUTE6are also off —ping -6works viaFEATURE_IPV6, but there is noping6/traceroute6binary, which is what mosttroubleshooting instructions on the forum will tell a user to run.
/etc/network/interfaces: the wlan stanzas areinet manualwith dhcpcd doing theaddressing, so they may need no change at all — worth verifying rather than assuming,
given the guard/poll logic already living in those stanzas.
accept_ra,use_tempaddr(privacy addressing),and a supported
disable_ipv6opt-out for users who want it off.Security — this is the gate, not a footnote
Today the board is shielded from the internet substantially by accident: IPv4 NAT.
SLAAC hands out a globally routable address the moment any router on the segment advertises
a prefix. ADR 0031 already records what is listening behind that accident — root:1 over both
SSH and FTP, anonymous writable FTP, Samba, and SECCOMP off. Turning IPv6 on without a
firewall converts "unreachable because NAT" into "reachable from the internet", and users
will not know it happened.
So enabling IPv6 requires one of:
ip6tablesINPUT ruleset plus an init script to load it (and the RTfilter-table fix above, or it is unenforceable on the RT kernel); or
net.ipv6.conf.all.disable_ipv6=1) with adocumented opt-in, which gets us the capability without changing anyone's exposure.
Either way this belongs in ADR 0031 before it ships. Option 2 is the cheap, honest first
step; option 1 is the real feature.
Things that degrade, that we do not control
Main_MiSTer/menu.cpp:680-681filters on
ifa->ifa_addr->sa_family == AF_INETfor botheth0andwlan*, so aninterface holding only IPv6 addresses displays nothing. Upstream's code — per our policy
that is a report to hand over, not a drive-by PR. Dual-stack hides it entirely, which is
another argument for dual-stack over v6-only.
mister.landiscovery. We ship no mDNS responder, so the name works because therouter registers the DHCPv4 hostname. Dual-stack keeps that; v6-only would lose it.
Docs and CI
scripts/ci-tests.shcontains no IPv6 assertions of any kind.docs/wifi-parity.md,docs/ssh-ftp-parity.md,docs/netfs-parity.mdanddocs/kernel-config-deltas.mdall describe a v4-only world and would need updating.place that question has been written down.
Recommendation
Dual-stack, never v6-only — it keeps
mister.lan, keeps the OSD address displayworking, and makes the whole change additive.
Land it in two steps. First the kernel symbols plus
/etc/hosts, the busybox appletsand the ip6tables tables, shipped with
disable_ipv6=1by default: that makes the imagecapable without changing anyone's exposure, and it is reviewable on its own. Then the
firewall ruleset and the default flip as a second change, dispositioned in ADR 0031.
Two questions for @mcfbytes before any of this starts:
posture is parity. An IPv6-capable image is a deliberate divergence — a defensible one,
since IPv6-only and v6-preferred home networks are no longer exotic, but it should be a
stated choice rather than a side effect.
question ADR 0031 is already holding open for IPv4.
Work items
linux.imgsize delta fromCONFIG_IPV6=yon all three kernels(DE10, RT, DE25).
CONFIG_IP_NF_FILTERon the RT kernel — pre-existing, independent ofthis issue, and blocking any firewall story.
.configs./etc/hosts, busyboxPING6/TRACEROUTE6/FEATURE_IFUPDOWN_IPV6, proftpdUseIPv6, sysctl policy.ip6tablesdefault ruleset + init script, if question 2 says "on by default".AF_INETfilter inmenu.cppupstream (needs @mcfbytes' go-ahead).