As you have probably noticed by the title, and the likely jarring background color, this page’s background is controlled by the users.
Not through an obvious interface either, it is controlled by encoding hexadecimal RGB colors into an IPv6 address.
I have a server listening for HTTP requests to port 80 on the IPv6 subnet 2602:fd50:f30:bbbb::/80
, where the last 3 hextets encode the RGB color.
For instance a HTTP request to 2602:fd50:f30:bbbb::ff:0:0
would make the background of this page full red.
The page is updated every second to match the new background color.
hammy /data : curl http://\[2602:fd50:f30:bbbb::ca:ca:ca\]:80
Setting to color #cacaca
If the current background is a horrible color, do us all a favour and run curl http://\[2602:fd50:f30:bbbb::cc:fb:fb\]:80
changing the last 3 hex numbers to be something else good-looking.
Alternatively just go to the following link, http://[2602:fd50:f30:bbbb:0:cc:fb:fb]/.
If it says you can not connect it is because you likely do not have IPv6 support, check that at https://ipv6-test.com/.
This was actually pretty simple to pull off. I setup an ip6tables rule to route everything to the 2602:fd50:f30:bbbb::/80
subnet to a local port, because listening on the entire /80 would be insane.
ip6tables -t nat -A PREROUTING -d 2602:fd50:f30:bbbb::/80 -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 6969
Then on that port I have an express app running, this app recieves the request, checks /proc/net/nf_conntrack
to get the IP that this request was originally for and parses out the color from the IP.
The conntrack searching is done by matching the source IP and the source port, I wanted to use the socket’s SO_ORIGINAL_DST
option, but could not figure out a way to access it from NodeJS.
That new color is then written to disk, with this page making a HTTP request for that file every second and updating the background color accordingly.