Compare commits

...

40 Commits

Author SHA1 Message Date
0b16708540 feat: Update EasyHNS IPv6 address
All checks were successful
Build Docker / Build_Docker (push) Successful in 38s
2025-08-25 15:47:53 +10:00
656f17020f feat: Add donation info to HNSDoH
All checks were successful
Build Docker / Build_Docker (push) Successful in 3m16s
2025-08-22 12:07:01 +10:00
f59e66a8ac feat: Update dnsdist config
All checks were successful
Build Docker / Build_Docker (push) Successful in 43s
2025-08-15 17:21:23 +10:00
dadb53ba5e feat: Route traffic to other resolvers to reduce load on HSD
All checks were successful
Build Docker / Build_Docker (push) Successful in 2m49s
2025-08-15 14:27:04 +10:00
6885ac2783 fix: Update EasyHNS ips
All checks were successful
Build Docker / Build_Docker (push) Successful in 2m0s
2025-08-01 13:31:20 +10:00
97b2040711 fix: Update build script
All checks were successful
Build Docker / Build_Docker (push) Successful in 3m0s
2025-07-26 14:05:12 +10:00
c27ac66b61 docs: Update readme
Some checks failed
Build Docker / Build_Docker (push) Failing after 14s
2025-07-24 14:01:12 +10:00
fa1845c642 feat: Update Easy HNS IPv6
Some checks failed
Build Docker / Build_Docker (push) Failing after 1m42s
2025-07-24 10:21:39 +10:00
4766e4393f feat: Add nameguardian location
All checks were successful
Build Docker / Build_Docker (push) Successful in 39s
2025-06-13 23:16:30 +10:00
ba93ece895 feat: Add NameGuardian
All checks were successful
Build Docker / Build_Docker (push) Successful in 42s
2025-06-13 23:11:22 +10:00
3ca253eb21 feat: Add Marioo
All checks were successful
Build Docker / Build_Docker (push) Successful in 49s
2025-06-13 22:18:35 +10:00
b376a91e9c feat: Add anchor to members section
All checks were successful
Build Docker / Build_Docker (push) Successful in 46s
2025-06-13 21:36:19 +10:00
52b2eccde4 feat: Add 2 sponsors
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m21s
2025-06-13 21:29:11 +10:00
315023fdf3 fix: Update nodes in other places
All checks were successful
Build Docker / Build_Docker (push) Successful in 32s
2025-06-06 13:10:27 +10:00
8f4dc3c036 feat: Update nodes
All checks were successful
Build Docker / Build_Docker (push) Successful in 38s
2025-06-06 13:09:45 +10:00
b1ee4b3dd4 feat: Drop all ANY requests
All checks were successful
Build Docker / Build_Docker (push) Successful in 46s
2025-06-05 12:03:22 +10:00
9299335f98 feat: Add .lan block
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m8s
2025-06-04 12:07:45 +10:00
5da2784bd7 feat: Add cors
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m12s
2025-06-04 12:05:57 +10:00
d9f34ba976 feat: Use new test domains for easier debugging
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m4s
2025-03-28 22:43:10 +11:00
25d9f1314e fix: Round ping to the nearest int
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m11s
2024-11-07 12:53:09 +11:00
32506c6fee feat: Add EasyHNS IPv6
All checks were successful
Build Docker / Build_Docker (push) Successful in 46s
2024-10-10 19:38:45 +11:00
a2c0977c21 feat: Add ipv6 support
All checks were successful
Build Docker / Build_Docker (push) Successful in 33s
2024-10-10 14:58:52 +11:00
7296e5bc45 feat: Add refresh button to latency check
All checks were successful
Build Docker / Build_Docker (push) Successful in 36s
2024-10-09 21:09:13 +11:00
d393e01a91 feat: Update to add regions
All checks were successful
Build Docker / Build_Docker (push) Successful in 35s
2024-10-09 20:21:07 +11:00
307b748590 fix: Update readme
All checks were successful
Build Docker / Build_Docker (push) Successful in 55s
2024-10-04 18:06:00 +10:00
44a2b61fce fix: Update paths in the install script
Some checks failed
Build Docker / Build_Docker (push) Has been cancelled
2024-10-04 18:04:54 +10:00
004e7fcd9f fix: Update to use absolute names in cert hooks to allow renewals from crontab
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m11s
2024-08-20 13:13:04 +10:00
9baefbf6e7 feat: Add HNS Canada to nodes
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m6s
2024-07-20 12:59:34 +10:00
ccabbfd629 fix: Add unbound to install script
All checks were successful
Build Docker / Build_Docker (push) Successful in 46s
2024-06-27 21:12:55 +10:00
35975fda66 feat: Add Easy HNS
All checks were successful
Build Docker / Build_Docker (push) Successful in 42s
2024-06-20 19:21:44 +10:00
28d14c08df fix: Place version in correct location
All checks were successful
Build Docker / Build_Docker (push) Successful in 47s
2024-06-20 18:43:58 +10:00
fe0b36126f fix: Moved website files to allow auto deployments
Some checks failed
Build Docker / Build_Docker (push) Failing after 40s
2024-06-20 18:40:50 +10:00
3e9235e7b6 fix: Update port in docs
All checks were successful
Build Docker / Build_Docker (push) Successful in 34s
2024-06-20 18:31:17 +10:00
adc76c8c5e feat: Moved website files to new location
All checks were successful
Build Docker / Build_Docker (push) Successful in 45s
2024-06-20 18:25:48 +10:00
9cbc4a9ab7 feat: Add EasyHNS node
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m1s
2024-06-20 18:15:36 +10:00
1fa923751d fix: Add requirements for install script
All checks were successful
Build Docker / Build_Docker (push) Successful in 35s
2024-06-20 16:05:40 +10:00
de7dd7fe9a feat: Update install instructions
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m6s
2024-06-20 13:58:44 +10:00
03da062387 feat: New website info
All checks were successful
Build Docker / Build_Docker (push) Successful in 29s
2024-05-30 23:16:14 +10:00
3c47a6c114 feat: Add proxy v2
All checks were successful
Build Docker / Build_Docker (push) Successful in 1m10s
2024-05-30 21:12:31 +10:00
2cdc96f4b1 feat: Add tcp proxy v1 2024-05-30 00:09:34 +10:00
45 changed files with 2360 additions and 364 deletions

View File

@@ -4,17 +4,20 @@ on:
push:
jobs:
Build Docker:
Build_Docker:
runs-on: [ubuntu-latest, amd] # Add amd to require amd64
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Docker
run : |
echo "Updating apt sources"
echo "deb http://ftp.au.debian.org/debian buster main" > /etc/apt/sources.list
apt-get update --allow-unauthenticated --allow-insecure-repositories
apt-get install docker.io -y
apt-get install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce-cli -y
- name: Build Docker image
run : |
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
@@ -30,11 +33,11 @@ jobs:
tag_num="${tag}-${tag_num}"
fi
cd website
cd public
echo "version: ${GITHUB_RUN_NUMBER}" > content/version.txt
echo "version: ${GITHUB_RUN_NUMBER}" > version.txt
docker build -t hns_doh:$tag_num .
docker tag hns_doh:$tag_num git.woodburn.au/nathanwoodburn/hns_doh:$tag_num
docker push git.woodburn.au/nathanwoodburn/hns_doh:$tag_num
docker tag hns_doh:$tag_num git.woodburn.au/nathanwoodburn/hns_doh:$tag
docker push git.woodburn.au/nathanwoodburn/hns_doh:$tag
docker push git.woodburn.au/nathanwoodburn/hns_doh:$tag

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.venv/

4
Caddyfile Normal file
View File

@@ -0,0 +1,4 @@
hnsdoh.com {
reverse_proxy h2c://127.0.0.1:8053
tls /etc/letsencrypt/live/hnsdoh.com/fullchain.pem /etc/letsencrypt/live/hnsdoh.com/privkey.pem
}

View File

@@ -1,6 +1,6 @@
# HNS DoH load balancer
## How to help
## Run a node to hellp the project
Contact Nathan.Woodburn/ via
- Email: contact@hnsdoh.com
- Discord: https://l.woodburn.au/discord
@@ -8,11 +8,9 @@ Contact Nathan.Woodburn/ via
You will need a static IP address that you can host the server on.
This server needs access to these ports
- 443 (TCP) Required for DoH
- 8053 (TCP/UDP) Required for DoT
- 853 (TCP/UDP) Required for DoT
- 53 (TCP/UDP) Required for Plain DNS
Nathan will then add your IP to the domain which will let you create a certificate for the domain.
## Install script
Contact Nathan.Woodburn/ to get an Auth token.
@@ -20,34 +18,12 @@ Replace the token file with the token provided (this is case sensitive and must
This token is used to get a certificate for the domain.
```sh
cd /root
git clone https://git.woodburn.au/nathanwoodburn/hns_doh_loadbalancer.git
cd hns_doh_loadbalancer
echo "TOKEN FROM NATHAN" > token
sudo ./install.sh
echo "TOKEN FROM NATHAN" > /root/hns_doh_loadbalancer/token
sudo hns_doh_loadbalancer/install.sh
```
## Nodes
Load balancing to the following DNS-over-HTTPS providers:
| Provider | URL | DoH JSON | DoH Wire | DoT | DNS | HIP05 |
| ---------------- | ---------------------------------------- | -------- | -------- | --- | --- | ----- |
| Nathan.Woodburn/ | https://doh.hnshosting.au/dns-query | Yes | Yes | Yes | Yes | Yes |
| HNS DNS | https://doh.hnsdns.com/dns-query | Yes | Yes | No | Yes | Yes |
| HNS NS | https://hnsns.net/dns-query | Yes | Yes | No | No | Yes |
| Impervious | https://hs.dnssec.dev/dns-query | No | Yes | Yes | No | Yes |
## Maybe future nodes
| Provider | Reason to not be added | URL | DoH JSON | DoH Wire | DoT | DNS | HIP05 |
| ---------------- | -------------------------- | ---------------------------------------- | -------- | -------- | --- | --- | ----- |
| EasyHandshake | Doesn't have HIP5 support | https://easyhandshake.com:8053/dns-query | Yes | Yes | No | No | No |
| HDNS | Only supports NB domains | https://hdns.io | No | Yes | No | Yes | No |
- https://doh.hnshosting.au/dns-query
- https://easyhandshake.com:8053/dns-query
- https://doh.hnsdns.com/dns-query
- https://hs.dnssec.dev/dns-query (Currently not enabled)
- https://hnsns.net/dns-query
## How HNS DoH load balancer works
The load balancer is using DNS load balancing to distribute the load across multiple community ran DoH servers.
Each DoH server runs a recursive DNS server that is capable of resolving HNS names. It will respond to DNS queries over regular DNS in addition to DNS over HTTPS (DoH) and DNS over TLS (DoT).

View File

@@ -7,11 +7,11 @@ import time
AUTH = ""
# Check if token file exists
if os.path.isfile("token"):
if not os.path.isfile("/root/hns_doh_loadbalancer/token"):
print("ERROR: Token file not found")
# Read token from file
with open("token", "r") as fh:
with open("/root/hns_doh_loadbalancer/token", "r") as fh:
AUTH = fh.read().strip()
# Check if token is empty
@@ -24,7 +24,7 @@ if len(AUTH) == 0:
# URL to acme-dns instance
ACMEDNS_URL = "https://nathan.woodburn.au/hnsdoh-acme"
ACMEDNS_URL = "https://nathan.c.woodburn.au/hnsdoh-acme"
# Path for acme-dns credential storage
STORAGE_PATH = "/etc/letsencrypt/acmedns.json"
# Whitelist for address ranges to allow the updates from
@@ -132,4 +132,4 @@ if __name__ == "__main__":
# Update the TXT record in acme-dns instance
client.update_txt_record(VALIDATION_TOKEN)
# Wait for the DNS to propagate for 60 seconds
time.sleep(60)
time.sleep(60)

View File

@@ -2,6 +2,7 @@
# Tell dnsdist to reload the config
dnsdist -c -e 'reloadAllCertificates()'
systemctl restart caddy
# Save last run time
date +%s > last_cert_reload.txt
date +%s > last_cert_reload.txt

15
create_wireform.py Normal file
View File

@@ -0,0 +1,15 @@
import base64
import dns.message
# Generate custom request
domain = "woodburn"
message = dns.message.make_query(domain, dns.rdatatype.A,id=0)
wireBytes = message.to_wire()
wire = base64.b64encode(wireBytes)
print(wire.decode("utf-8"))
# Read
message = dns.message.from_wire(wireBytes)
print(str(message))

3
dnsdist-20 Normal file
View File

@@ -0,0 +1,3 @@
Package: dnsdist*
Pin: origin repo.powerdns.com
Pin-Priority: 600

View File

@@ -1,29 +1,103 @@
newServer({address="194.50.5.26", name="Nathan.Woodburn/ 1"})
newServer({address="194.50.5.27", name="Nathan.Woodburn/ 2"})
newServer({address="194.50.5.28", name="Nathan.Woodburn/ 3"})
newServer({address="139.144.68.241", name="HNSDNS 1"})
newServer({address="139.144.68.242", name="HNSDNS 2"})
-- --- Dynamic block rules
local dbr = dynBlockRulesGroup()
dbr:setQueryRate(300, 10, "Exceeded query rate", 60)
dbr:setRCodeRate(DNSRCode.NXDOMAIN, 50, 10, "Exceeded NXD rate", 60)
dbr:setRCodeRate(DNSRCode.SERVFAIL, 30, 10, "Exceeded ServFail rate", 60)
dbr:setQTypeRate(DNSQType.ANY, 1, 10, "Exceeded ANY rate", 60)
dbr:setResponseByteRate(8000, 10, "Exceeded resp BW rate", 60)
-- These might not work correctly
newServer({address="192.198.87.44:443", tls="openssl", subjectName="hnsns.net", dohPath="/dns-query", validateCertificates=true, name="HNSNS"})
newServer({address="178.128.128.181:443", tls="openssl", subjectName="hs.dnssec.dev", dohPath="/dns-query", validateCertificates=true, name="Impervious"})
function maintenance()
dbr:apply()
end
dbr:apply()
-- --- Basic query mitigations
addAction(QTypeRule(DNSQType.ANY), RCodeAction(DNSRCode.REFUSED)) -- Block ANY queries
addAction(AndRule{QClassRule(3), QNameRule("version.bind")}, DropAction()) -- Block version.bind
-- Max QPS per client
addAction(MaxQPSIPRule(25, 24), DelayAction(50)) -- gentle delay instead of drop
addAction(MaxQPSIPRule(25, 64), DelayAction(100)) -- longer window, slightly longer delay
addAction(AndRule{MaxQPSIPRule(10), TCPRule(false)}, TCAction())
-- Uncomment to add IPv6 servers
-- newServer({address="2a01:7e01:e002:c300::", name="HNSDNS 3"})
-- newServer({address="2a01:7e01:e002:c300::", name="HNSDNS 4"})
-- Drop queries to local TLDs
local sldsToDrop = newSuffixMatchNode()
sldsToDrop:add("lan.")
addAction(SuffixMatchNodeRule(sldsToDrop), DropAction())
addDOHLocal('0.0.0.0', '/etc/letsencrypt/live/hnsdoh.com/fullchain.pem', '/etc/letsencrypt/live/hnsdoh.com/privkey.pem', {"/", "/dns-query"}, { reusePort=true })
addTLSLocal('0.0.0.0', '/etc/letsencrypt/live/hnsdoh.com/fullchain.pem', '/etc/letsencrypt/live/hnsdoh.com/privkey.pem')
setLocal('0.0.0.0:53')
-- Create a node for all IANA TLDs
local tldNode = newSuffixMatchNode()
local tldsFile = io.open("/etc/dnsdist/tlds-alpha-by-domain.txt", "r")
if tldsFile then
for line in tldsFile:lines() do
if not line:match("^#") and line ~= "" then
-- SuffixMatchNode expects lower-case domain with trailing dot
tldNode:add(line:lower() .. ".")
end
end
tldsFile:close()
end
-- --- Upstream servers
-- Public resolvers for official TLDs
local cloudflare = newServer({address="1.1.1.1", name="Cloudflare", pool="tldPool"})
local cloudflarealt = newServer({address="1.0.0.1", name="CloudflareALT", pool="tldPool"})
local google = newServer({address="8.8.8.8", name="Google", pool="tldPool"})
local googlealt = newServer({address="8.8.4.4", name="GoogleALT", pool="tldPool"})
cloudflare:setUp()
cloudflarealt:setUp()
google:setUp()
googlealt:setUp()
-- Your local upstream
local localUpstream = newServer({address="127.0.0.1:5353", name="HSD"})
localUpstream:setUp()
-- If domain matches official TLDs -> use tldPool
addAction(SuffixMatchNodeRule(tldNode), PoolAction("tldPool"))
-- Cacheing
pc = newPacketCache(10000, {maxTTL=86400, minTTL=0, temporaryFailureTTL=60, staleTTL=60, dontAge=false})
getPool(""):setCache(pc)
getPool("tldPool"):setCache(pc)
-- --- Local listeners
addLocal('0.0.0.0:53', { reusePort = true, tcpFastOpenQueueSize=4096 })
addTLSLocal('0.0.0.0', '/etc/letsencrypt/live/hnsdoh.com/fullchain.pem',
'/etc/letsencrypt/live/hnsdoh.com/privkey.pem', { reusePort = true })
-- HTTPS certificates added with Caddy
addDOHLocal("127.0.0.1:8053", nil, nil,
{"/", "/dns-query"}, { reusePort = true, customResponseHeaders = {["Access-Control-Allow-Origin"]="*"} })
-- Uncomment for IPv6 support
-- addLocal('[::]:53', { reusePort = true, ednsUDPSize = 1232 })
-- addTLSLocal('[::]', '/etc/letsencrypt/live/hnsdoh.com/fullchain.pem',
-- '/etc/letsencrypt/live/hnsdoh.com/privkey.pem', { reusePort = true })
-- addACL('[::]/0')
-- Allow public access
addACL('0.0.0.0/0')
map = { newDOHResponseMapEntry("^/$", 307, "https://welcome.hnsdoh.com") }
-- --- DOH front-end redirect
dohFE = getDOHFrontend(0)
dohFE:setResponsesMap(map)
if dohFE then
map = { newDOHResponseMapEntry("^/$", 307, "https://welcome.hnsdoh.com") }
dohFE:setResponsesMap(map)
end
-- Feel free to change the control socket key
-- --- Control socket & key
setKey("csl2icaGACsP3+M9tx55c8+dBxVCnlnqAHEC92P55eo=")
controlSocket('127.0.0.1:5199')
-- webserver("0.0.0.0:5000")
-- setWebserverConfig({password="woodburn", apiKey="woodburn", acl="0.0.0.0/0"})

22
hsd.service Normal file
View File

@@ -0,0 +1,22 @@
[Unit]
Description=hsd
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
Environment=HSD_PREFIX=/root/.hsd
ExecStart=/root/.nvm/versions/node/v20.14.0/bin/node /root/hsd/bin/hsd \
--spv \
--api-key=8xJc4QC1j1xJYbo3 \
--rs-host=0.0.0.0 \
--agent=HNSDoH \
--http-host=0.0.0.0 \
--wallet-http-host=0.0.0.0 \
--rs-port=5353 \
--log-level=warning
[Install]
WantedBy=multi-user.target

View File

@@ -6,24 +6,79 @@ if [ "$EUID" -ne 0 ]
exit
fi
chmod +x cert.sh cert.py
sudo apt-get install -y dnsdist
# Make sure working directory is /root
if [ "$PWD" != "/root" ]
then echo "Please run this script from /root directory."
exit
fi
chmod +x /root/hns_doh_loadbalancer/cert.py
chmod +x /root/hns_doh_loadbalancer/cert.sh
# Install dnsdist
echo "deb [signed-by=/etc/apt/keyrings/dnsdist-20-pub.asc] http://repo.powerdns.com/ubuntu jammy-dnsdist-20 main" | sudo tee /etc/apt/sources.list.d/pdns.list
wget https://upload.woodburn.au/gYy/dnsdist-20 -O /etc/apt/preferences.d/dnsdist-20
sudo install -d /etc/apt/keyrings; curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo tee /etc/apt/keyrings/dnsdist-20-pub.asc && sudo apt-get update && sudo apt-get install dnsdist
# Install certbot
sudo apt install snapd
sudo apt install snapd -y
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot certonly --manual --manual-auth-hook ./cert.py --preferred-challenges dns -d hnsdoh.com --deploy-hook ./cert.sh
sudo cp ./resolved.conf /etc/systemd/resolved.conf
sudo cp /root/hns_doh_loadbalancer/resolved.conf /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
# Move the conf file to the correct location
sudo cp ./dnsdist.conf /etc/dnsdist/dnsdist.conf
# Replace the user and group in the dnsdist.service file to root
# Like this
# User=root
# Group=root
sudo cp ./dnsdist.service /lib/systemd/system/dnsdist.service
sudo cp /root/hns_doh_loadbalancer/dnsdist.conf /etc/dnsdist/dnsdist.conf
sudo cp /root/hns_doh_loadbalancer/dnsdist.service /lib/systemd/system/dnsdist.service
sudo systemctl daemon-reload
# Download TLDs
wget https://data.iana.org/TLD/tlds-alpha-by-domain.txt -O /etc/dnsdist/tlds-alpha-by-domain.txt
# Restart dnsdist
sudo systemctl restart dnsdist
sudo systemctl restart dnsdist
# Install caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
# Move the Caddyfile to the correct location
sudo cp /root/hns_doh_loadbalancer/Caddyfile /etc/caddy/Caddyfile
# Restart caddy
sudo systemctl restart caddy
sudo certbot certonly --manual --manual-auth-hook /root/hns_doh_loadbalancer/cert.py --preferred-challenges dns -d hnsdoh.com -d *.hnsdoh.com --deploy-hook /root/hns_doh_loadbalancer/cert.sh
# Install NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# Install unbound
sudo apt install libunbound-dev -y
# Install Node.js
sudo apt install build-essential -y
nvm install 20.14.0
npm install -g node-gyp
# Install HSD
git clone --depth 1 --branch latest https://github.com/handshake-org/hsd.git
cd hsd
npm install --omit=dev
sudo cp /root/hns_doh_loadbalancer/hsd.service /lib/systemd/system/hsd.service
sudo systemctl daemon-reload
sudo systemctl enable hsd
sudo systemctl start hsd

47
proxy.py Normal file
View File

@@ -0,0 +1,47 @@
import socket
from dnslib.server import DNSHandler, BaseResolver, DNSServer, DNSLogger
from dnslib import DNSRecord
import time
UDP_IP = '127.0.0.1'
UDP_PORT = 5350
TCP_IP = '0.0.0.0'
TCP_PORT = 5351
logger = DNSLogger(log="none")
class TCPHandler(DNSHandler):
def handle(self):
try:
while True:
data = self.request.recv(1024).strip()
if not data:
break
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp_socket:
udp_socket.sendto(data, (UDP_IP, UDP_PORT))
response_data, _ = udp_socket.recvfrom(1024)
self.request.sendall(response_data)
except Exception as e:
print(e)
class SimpleResolver(BaseResolver):
def resolve(self, request, handler):
try:
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp_socket:
udp_socket.sendto(request.pack(), (UDP_IP, UDP_PORT))
response_data, _ = udp_socket.recvfrom(1024)
dns_response = DNSRecord.parse(response_data)
return dns_response
except Exception as e:
return request.reply()
def start_tcp_server():
server = DNSServer(SimpleResolver(), address=TCP_IP, port=TCP_PORT, tcp=True, logger=logger)
print(f"TCP server listening on {TCP_IP}:{TCP_PORT}")
server.start()
if __name__ == "__main__":
start_tcp_server()
print("Started")

View File

@@ -1,4 +1,4 @@
FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY content /var/www/html
COPY . /var/www/html

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,39 @@
[data-bs-theme=dark] {
--bs-primary: #002459;
--bs-primary-rgb: 0,36,89;
--bs-primary-text-emphasis: #667C9B;
--bs-primary-bg-subtle: #000712;
--bs-primary-border-subtle: #001635;
}
[data-bs-theme=dark] .btn-primary, .btn-primary[data-bs-theme=dark] {
--bs-btn-color: #fff;
--bs-btn-bg: #002459;
--bs-btn-border-color: #002459;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #001F4C;
--bs-btn-hover-border-color: #001D47;
--bs-btn-focus-shadow-rgb: 217,222,230;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #001D47;
--bs-btn-active-border-color: #001B43;
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #002459;
--bs-btn-disabled-border-color: #002459;
}
[data-bs-theme=dark] .btn-outline-primary, .btn-outline-primary[data-bs-theme=dark] {
--bs-btn-color: #002459;
--bs-btn-border-color: #002459;
--bs-btn-focus-shadow-rgb: 0,36,89;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #002459;
--bs-btn-hover-border-color: #002459;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #002459;
--bs-btn-active-border-color: #002459;
--bs-btn-disabled-color: #002459;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #002459;
}

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

432
public/index.html Normal file
View File

@@ -0,0 +1,432 @@
<!DOCTYPE html>
<html data-bs-theme="dark" lang="en-au">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>HNS DoH</title>
<meta name="twitter:image" content="https://hnsdoh.woodburn.au/assets/img/HNS.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:description" content="Access Handshake Domains with DNS over HTTPS">
<meta property="og:title" content="HNS DoH">
<meta property="og:type" content="website">
<meta property="og:description" content="Access Handshake Domains with DNS over HTTPS">
<meta name="twitter:title" content="HNS DoH">
<meta name="description" content="Access Handshake Domains with DNS over HTTPS">
<meta property="og:image" content="https://hnsdoh.woodburn.au/assets/img/HNS.png">
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "WebSite",
"name": "HNS DoH",
"url": "https://hnsdoh.woodburn.au"
}
</script>
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNSW.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNSW.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/Navbar-Right-Links-Dark-icons.css">
<link rel="stylesheet" href="assets/css/Team-images.css">
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '11']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="7e0ed7e4-3858-4124-a574-b57ac05aaad1"></script>
</head>
<body>
<header>
<nav class="navbar navbar-expand-md fixed-top bg-dark py-3" data-bs-theme="dark">
<div class="container-fluid"><a class="navbar-brand d-flex align-items-center" href="/#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img src="assets/img/HNSW.png" width="20px"></span><span>HNS DoH</span></a></div>
</nav>
</header>
<section id="intro" style="margin: 100px;margin-top: 20vh;">
<div class="text-center">
<h1 class="text-center" style="margin-bottom: 50px;font-size: 60px;">HNS DoH</h1>
<h2 class="text-center" style="margin-bottom: 50px;">Welcome to HNS DoH, your gateway to Handshake domains.</h2>
<p>Introducing our latest Handshake DNS service, a revolutionary approach to secure and efficient internet communication. In a digital landscape where privacy and reliability are paramount, our service stands out by integrating multiple nodes to guarantee high availability.<br>Say hello to a new era of accessing Handshake domains.</p>
<h1 style="margin-top: 50px;">Reliability is our key focus</h1>
<p>By using a diverse group of upstream providers, we minimise downtime. Multiple of our DNS providers can go down without any downtime to our users.<br>Check out our uptime compared to our upstream DNS providers</p><a class="btn btn-primary" role="button" target="_blank" href="https://status.hnsdoh.com">Status Page</a>
<h1 style="margin-top: 50px;">Support HNSDoH</h1>
<p>HNS DoH is a community-driven project.<br>If you'd like to help keep the service running and growing, consider supporting us:<br>
<div class="btn-group-vertical btn-group-sm gap-1" role="group"><a class="btn btn-primary" role="button" target="_blank" href="https://paypal.me/nathanwoodburn">PayPal</a><a class="btn btn-primary" role="button" target="_blank" href="https://donate.stripe.com/8wM6pv0VD08Xe408ww">Card (via Stripe)</a><a class="btn btn-primary" role="button" target="_blank" href="https://nathan.woodburn.au/donate?c=hns">HNS</a><a class="btn btn-primary" role="button" target="_blank" href="https://nathan.woodburn.au/donate?c=btc">BTC</a><a class="btn btn-primary" role="button" target="_blank" href="https://nathan.woodburn.au/donate">Other Donation Options</a></div>
</p>
</div>
</section>
<section id="setup" style="min-height: 400px;padding-top: 10vh;text-align: center;margin-right: 10%;margin-left: 10%;" data-bs-target="#navcol-5" data-bs-smooth-scroll="true">
<h3 class="display-1">Setup</h3>
<ul class="list-group">
<li class="list-group-item">
<div>
<h5 class="display-5">DNS over HTTPS</h5>
<p>DNS over HTTPS is supported by most browsers. To add HNSDoH to your resolvers add this URL to your Secure DNS setting<br><code style="display: block;">https://hnsdoh.com/dns-query</code></p>
<p>You can also specify a specific region to have faster resolution with a lower number of servers for redundancy.<br><code style="display: block;">https://{region}.hnsdoh.com/dns-query</code><span>For example the AU region can be set using:&nbsp;</span><code style="display: inline;">https://au.hnsdoh.com/dns-query</code></p>
</div>
</li>
<li class="list-group-item">
<div>
<h5 class="display-5">DNS over TLS</h5>
<p>DNS over TLS is the best option for mobile phones. Simply set Private DNS to the hostname&nbsp;<br><code>hnsdoh.com</code></p>
<p>You can also specify a specific region to have faster resolution with a lower number of servers for redundancy.<br><code style="display: block;">{region}.hnsdoh.com</code><span>For example the AU region can be set using:&nbsp;</span><code style="display: inline;">au.hnsdoh.com</code></p>
</div>
</li>
<li class="list-group-item">
<div>
<h5 class="display-5">Plain DNS</h5>
<p>As a last resort you can use any of plain DNS below (best to chose 2 IPs from different people)<br><br>- 194.50.5.27 (powered by Nathan.Woodburn/)<br>-&nbsp;139.177.195.185 (powered by HNS Canada)<br>-&nbsp;172.233.46.92 (powered by Nathan.Woodburn/)<br>-&nbsp;172.105.120.203 (powered by Nathan.Woodburn/)<br>-&nbsp;51.24.7.1 (powered by Easy HNS)<br><br>Alternative Providers (Not running the HNSDoH software configuration)<br><br>- 194.50.5.26 (powered by Nathan.Woodburn/)<br>- 194.50.5.28 (powered by Nathan.Woodburn/)<br>-&nbsp;139.144.68.241 (powered by HNS DNS)<br>- 139.144.68.242 (powered by HNS DNS)<br>- 2a01:7e01:e002:c300:: (powered by HNS DNS)<br>- 2a01:7e01:e002:c500:: (powered by HNS DNS)</p>
</div>
</li>
</ul>
</section>
<section style="margin-top: 10vh;margin-right: 10%;margin-left: 10%;">
<div style="text-align: center;">
<h1 style="margin-bottom: 5vh;">Project Information</h1>
<div class="card-group">
<div class="card">
<div class="card-body">
<h4 class="card-title">Open Source</h4>
<p class="card-text">This DoH load balancing system is open source.<br>You can check the code or run your own</p><a class="btn btn-primary" role="button" href="https://github.com/nathanwoodburn/hns_doh_loadbalancer" target="_blank">View Code</a>
</div>
</div>
<div class="card">
<div class="card-body">
<h4 class="card-title">Community run&nbsp;</h4>
<p class="card-text">To ensure high availability, HNSDoH is run by the community around the globe.<br>Do you have some spare compute resources?</p><a class="btn btn-primary" role="button" href="https://github.com/nathanwoodburn/hns_doh_loadbalancer/#how-to-help" target="_blank">Learn how to help</a>
</div>
</div>
</div>
<div class="container py-4 py-xl-5" id="members">
<div class="row mb-4 mb-lg-5" style="margin-top: 50px;">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<h2>Members</h2>
<p class="w-lg-50">Here is a list of community members running or sponsoring nodes for HNS DoH</p>
</div>
</div>
<div class="row gx-4 row-cols-2 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-4" style="--bs-primary: #ffffff;--bs-primary-rgb: 255,255,255;">
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" width="130" height="130" src="assets/img/people/nathanwoodburn.webp">
<h5 class="fw-bold text-primary mb-0 card-title"><strong>Nathan.Woodburn/</strong></h5>
<p class="text-muted mb-2 card-text">Australia</p><a class="btn btn-primary" role="button" target="_blank" href="https://nathan.woodburn.au"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" src="assets/img/people/HNSCA.webp" height="130">
<h5 class="fw-bold text-primary mb-0 card-title">HNS Canada</h5>
<p class="text-muted mb-2 card-text">Canada</p><a class="btn btn-primary" role="button" href="https://hnscanada.ca/" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" width="130" height="130" src="assets/img/people/easy-hns.jpg">
<h5 class="fw-bold text-primary mb-0 card-title"><strong>Easy HNS</strong></h5>
<p class="text-muted mb-2 card-text">England</p><a class="btn btn-primary" role="button" target="_blank" href="https://easyhns.com"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" alt="icon, profile, user, clip art, user, user, user, user, user" src="assets/img/no_one.png" height="130">
<h5 class="fw-bold text-primary mb-0 card-title">Zorro</h5>
<p class="text-muted mb-2 card-text">United States</p><a class="btn btn-primary disabled" role="button" href="#" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" src="assets/img/people/marioo.jpg" height="130">
<h5 class="fw-bold text-primary mb-0 card-title">Marioo</h5>
<p class="text-muted mb-2 card-text">Europe</p><a class="btn btn-primary" role="button" href="https://x.com/hs1marioo" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" src="assets/img/people/erwin.groen.jpg" height="130">
<h5 class="fw-bold text-primary mb-0 card-title">Erwin.Groen/</h5>
<p class="text-muted mb-2 card-text">Australia</p><a class="btn btn-primary" role="button" href="https://hns.au" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col" style="margin-bottom: 25px;">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" src="assets/img/people/nameguardian.jpg" height="130">
<h5 class="fw-bold text-primary mb-0 card-title">NameGuardian/</h5>
<p class="text-muted mb-2 card-text">United States</p><a class="btn btn-primary" role="button" href="https://x.com/NameGuardianHNS" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="regions" style="margin-top: 10vh;margin-right: 10%;margin-left: 10%;">
<div style="text-align: center;">
<h1>Regions</h1>
<div>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Region</th>
<th>Region ID</th>
<th># of nodes</th>
<th>Latency&nbsp;<svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 24 24" width="1em" fill="currentColor" id="refresh-ping" style="color: rgb(255,255,255);">
<path d="M0 0h24v24H0z" fill="none"></path>
<path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"></path>
</svg></th>
</tr>
</thead>
<tbody>
<tr>
<td>Australia</td>
<td>au</td>
<td>1</td>
<td><span id="au-ping">Pinging...</span></td>
</tr>
<tr>
<td>Europe</td>
<td>eu</td>
<td>2</td>
<td><span id="eu-ping">Pinging...</span></td>
</tr>
<tr>
<td>North America</td>
<td>na</td>
<td>2</td>
<td><span id="na-ping">Pinging...</span></td>
</tr>
<tr>
<td>Asia</td>
<td>as</td>
<td>1</td>
<td><span id="as-ping">Pinging...</span></td>
</tr>
<tr>
<td>Asia Pacific</td>
<td>ap</td>
<td>2</td>
<td><span id="ap-ping">Pinging...</span></td>
</tr>
</tbody>
</table>
</div>
<script>
function pingServer(id) {
return new Promise((resolve) => { // Always resolve the promise
if (!id) {
resolve({ id, pingTime: null, error: "Error: Invalid server ID" });
return;
}
const startTime = performance.now(); // Record the start time
const serverUrl = `https://${id}.hnsdoh.com/dns-query?dns=CagBAAABAAAAAAAACHdvb2RidXJuAAABAAE=`;
// Use fetch with no-cors mode
fetch(serverUrl, {
method: 'GET',
mode: 'no-cors',
headers: { 'Content-Type': 'application/dns-message' },
cache: "no-store"
})
.then(response => {
const endTime = performance.now(); // Record the end time
const pingTime = endTime - startTime; // Calculate ping time
// Round the ping time to the nearest integer
const pingTimeRounded = Math.round(pingTime);
// Resolve with the ID and ping time
resolve({ id, pingTime:pingTimeRounded, error: null });
})
.catch(error => {
// Resolve with an error message instead of rejecting
resolve({ id, pingTime: null, error: `Error pinging server` });
});
});
}
function runPingTest() {
const regions = ["au", "eu", "na", "as", "ap"];
const pingPromises = regions.map(region => pingServer(region));
regions.forEach(region => {
const spanId = `${region}-ping`;
const spanElement = document.getElementById(spanId);
if (spanElement) {
spanElement.textContent = "Pinging..."; // Show Pinging... while waiting for results
}
});
Promise.all(pingPromises)
.then(results => {
console.log("Ping results:", results);
// Update the corresponding span elements with ping results
results.forEach(result => {
const spanId = `${result.id}-ping`;
const spanElement = document.getElementById(spanId);
if (spanElement) {
if (result.pingTime !== null) {
spanElement.textContent = `${result.pingTime} ms`;
} else {
spanElement.textContent = result.error; // Display error message
}
}
});
})
.catch(error => {
console.error("Error pinging servers:", error);
});
}
runPingTest();
// Add event listener to the refresh link
document.getElementById('refresh-ping').addEventListener('click', function (event) {
event.preventDefault(); // Prevent the default link behavior
runPingTest(); // Re-run the ping test
});
</script>
</div>
</div>
</section>
<section id="nodes" style="margin-top: 10vh;margin-right: 10%;margin-left: 10%;">
<div style="text-align: center;">
<h1>Nodes</h1>
<div>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Provider</th>
<th>Location</th>
<th>IPv4</th>
<th>IPv6</th>
<th>Regions</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://nathan.woodburn.au" style="color: rgb(255,255,255);" target="_blank">Nathan.Woodburn/</a></td>
<td>Australia</td>
<td>194.50.5.27</td>
<td>Not available</td>
<td>AU, AP</td>
</tr>
<tr>
<td><a data-bs-toggle="tooltip" data-bss-tooltip="" href="https://hnscanada.ca/" style="color: rgb(255,255,255);" target="_blank" title="This node is managed by Nathan.Woodburn/">HNS Canada*</a></td>
<td>Canada</td>
<td>139.177.195.185</td>
<td>2600:3c04::f03c:94ff:fed1:877f</td>
<td>NA</td>
</tr>
<tr>
<td><a data-bs-toggle="tooltip" data-bss-tooltip="" href="https://x.com/hs1marioo" style="color: rgb(255,255,255);" target="_blank" title="This node is managed by Nathan.Woodburn/">Marioo*</a></td>
<td>Netherlands</td>
<td>172.233.46.92</td>
<td>2600:3c0e::f03c:94ff:fed1:9905</td>
<td>EU</td>
</tr>
<tr>
<td><a data-bs-toggle="tooltip" data-bss-tooltip="" href="https://x.com/NameGuardianHNS" style="color: rgb(255,255,255);" target="_blank" title="This node is managed by Nathan.Woodburn/">NameGuardian/*</a></td>
<td>Singapore</td>
<td>172.105.120.203</td>
<td>2400:8901::f03c:94ff:fed1:18ee</td>
<td>AS, AP</td>
</tr>
<tr>
<td><a href="https://easyhns.com" style="color: rgb(255,255,255);" target="_blank">Easy HNS</a></td>
<td>England</td>
<td>51.24.7.1</td>
<td>2a05:d01c:b4a:2900:945c:1a85:e537:cf80</td>
<td>EU</td>
</tr>
<tr>
<td><a href="about:blank" style="color: rgb(255,255,255);" target="_blank">Zorro</a></td>
<td>United States</td>
<td>173.233.72.88</td>
<td>2604:7c00:16:183::1</td>
<td>NA</td>
</tr>
</tbody>
</table>
</div><span>Note: Some nodes are in multiple regions to allow selecting larger regions.</span>
</div>
</div>
</section>
<footer class="text-center bg-dark">
<div class="container text-white py-4 py-lg-5"><a href="https://status.hnsdoh.com" target="_blank" style="margin-right: 10px;">Status Page</a>
<p class="text-muted mb-0">Copyright © 2025 HNSDoH</p><!-- Matomo Image Tracker-->
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.woodburn.au/matomo.php?idsite=11&amp;rec=1" style="border:0" alt="" />
<!-- End Matomo -->
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script>
</body>
</html>

38
test.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
# Check if script has ip address as argument
if [ -z "$1" ]; then
# Get Node IPs
RESOLVED_IPS=$(dig +short hnsdoh.com)
NODE_IPS=($RESOLVED_IPS)
if [ ${#NODE_IPS[@]} -eq 0 ]; then
echo "No IP addresses resolved for hnsdoh.com. Exiting."
exit 1
fi
fi
# If script has ip address as argument, use that
if [ -n "$1" ]; then
# Add all arguments to NODE_IPS array
NODE_IPS=("$@")
fi
# Define the domain and host for kdig commands
TLS_HOST="hnsdoh.com"
DOH_URL="https://hnsdoh.com/dns-query"
# Loop over each IP and run the kdig commands
for NODE_IP in "${NODE_IPS[@]}"
do
echo "Running kdig commands for NODE_IP=$NODE_IP"
# Run the kdig commands
kdig +tls +tls-host=$TLS_HOST @$NODE_IP dot.wdbrn TXT +short
kdig +tls-ca +https=@$DOH_URL @$NODE_IP doh.wdbrn TXT +short
kdig @$NODE_IP plain.wdbrn TXT +short
echo "Completed kdig commands for NODE_IP=$NODE_IP"
echo "--------------------------------------------"
done

33
test_inf.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
# Get Node IPs
RESOLVED_IPS=$(dig +short hnsdoh.com)
NODE_IPS=($RESOLVED_IPS)
if [ ${#NODE_IPS[@]} -eq 0 ]; then
echo "No IP addresses resolved for hnsdoh.com. Exiting."
exit 1
fi
# Define the domain and host for kdig commands
TLS_HOST="hnsdoh.com"
DOH_URL="https://hnsdoh.com/dns-query"
while true; do
# Loop over each IP and run the kdig commands
for NODE_IP in "${NODE_IPS[@]}"
do
echo "Running kdig commands for NODE_IP=$NODE_IP"
# Run the kdig commands
kdig +tls +tls-host=$TLS_HOST @$NODE_IP dot.wdbrn TXT +short
kdig +tls-ca +https=@$DOH_URL @$NODE_IP doh.wdbrn TXT +short
kdig @$NODE_IP plain.wdbrn TXT +short
echo "Completed kdig commands for NODE_IP=$NODE_IP"
echo "--------------------------------------------"
done
done

51
test_region.sh Executable file
View File

@@ -0,0 +1,51 @@
#!/bin/bash
REGION_IDS=("au" "eu" "na" "as" "ap")
if [ -z "$1" ]; then
for REGION_ID in "${REGION_IDS[@]}"
do
echo "--------------------------------------------"
echo "Running test for $REGION_ID"
echo "--------------------------------------------"
./test_region.sh $REGION_ID
echo "Completed test for $REGION_ID"
echo "--------------------------------------------"
done
exit 0
else
REGION_ID=$1
fi
# Check if IP is specified
if [ -z "$2" ]; then
RESOLVED_IPS=$(dig +short $REGION_ID.hnsdoh.com)
NODE_IPS=($RESOLVED_IPS)
if [ ${#NODE_IPS[@]} -eq 0 ]; then
echo "No IP addresses resolved for $REGION_ID.hnsdoh.com. Exiting."
exit 1
fi
else
NODE_IPS=("$2")
fi
# Define the domain and host for kdig commands
TLS_HOST="$REGION_ID.hnsdoh.com"
DOH_URL="https://$REGION_ID.hnsdoh.com/dns-query"
# Loop over each IP and run the kdig commands
for NODE_IP in "${NODE_IPS[@]}"
do
echo "Running kdig commands for NODE_IP=$NODE_IP"
# Run the kdig commands
kdig +tls +tls-host=$TLS_HOST @$NODE_IP dot.wdbrn TXT +short
kdig +tls-ca +https=@$DOH_URL @$NODE_IP doh.wdbrn TXT +short
kdig @$NODE_IP plain.wdbrn TXT +short
echo "Completed kdig commands for NODE_IP=$NODE_IP"
echo "--------------------------------------------"
done

38
testv6.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
# Check if script has ip address as argument
if [ -z "$1" ]; then
# Get Node IPs
RESOLVED_IPS=$(dig +short hnsdoh.com AAAA)
NODE_IPS=($RESOLVED_IPS)
if [ ${#NODE_IPS[@]} -eq 0 ]; then
echo "No IP addresses resolved for hnsdoh.com. Exiting."
exit 1
fi
fi
# If script has ip address as argument, use that
if [ -n "$1" ]; then
# Add all arguments to NODE_IPS array
NODE_IPS=("$@")
fi
# Define the domain and host for kdig commands
TLS_HOST="hnsdoh.com"
DOH_URL="https://hnsdoh.com/dns-query"
# Loop over each IP and run the kdig commands
for NODE_IP in "${NODE_IPS[@]}"
do
echo "Running kdig commands for NODE_IP=$NODE_IP"
# Run the kdig commands
kdig +tls +tls-host=$TLS_HOST @$NODE_IP dot.wdbrn TXT +short
kdig +tls-ca +https=@$DOH_URL @$NODE_IP doh.wdbrn TXT +short
kdig @$NODE_IP plain.wdbrn TXT +short
echo "Completed kdig commands for NODE_IP=$NODE_IP"
echo "--------------------------------------------"
done

1441
tlds-alpha-by-domain.txt Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,277 +0,0 @@
<!DOCTYPE html>
<html data-bs-theme="dark" lang="en-au">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>HNS DoH</title>
<meta name="twitter:image" content="https://hnsdoh.woodburn.au/assets/img/HNS.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:description" content="Access Handshake Domains with DNS over HTTPS">
<meta property="og:title" content="HNS DoH">
<meta name="description" content="Access Handshake Domains with DNS over HTTPS">
<meta property="og:type" content="website">
<meta property="og:description" content="Access Handshake Domains with DNS over HTTPS">
<meta name="twitter:title" content="HNS DoH">
<meta property="og:image" content="https://hnsdoh.woodburn.au/assets/img/HNS.png">
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "WebSite",
"name": "HNS DoH",
"url": "https://hnsdoh.woodburn.au"
}
</script>
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNSW.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNSW.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="icon" type="image/png" sizes="670x700" href="assets/img/HNS.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bs-theme-overrides.css">
<link rel="stylesheet" href="assets/css/Navbar-Right-Links-Dark-icons.css">
<link rel="stylesheet" href="assets/css/Team-images.css">
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '11']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="7e0ed7e4-3858-4124-a574-b57ac05aaad1"></script>
</head>
<body>
<header>
<nav class="navbar navbar-expand-md fixed-top bg-dark py-3" data-bs-theme="dark">
<div class="container-fluid"><a class="navbar-brand d-flex align-items-center" href="/#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img src="assets/img/HNSW.png" width="20px"></span><span>HNS DoH</span></a></div>
</nav>
</header>
<section id="intro" style="margin: 100px;margin-top: 20vh;">
<div class="text-center">
<h1 class="text-center" style="margin-bottom: 50px;font-size: 60px;">HNS DoH</h1>
<h2 class="text-center" style="margin-bottom: 50px;">Welcome to HNS DoH, your gateway to Handshake domains.</h2>
<p>Introducing our cutting-edge DNS over HTTPS (DoH) service, a revolutionary approach to secure and efficient internet communication. In a digital landscape where privacy and reliability are paramount, our service stands out by integrating multiple upstream providers, guaranteeing high availability.<br>By strategically harnessing the strengths of diverse DNS providers, we ensure that your online activities remain both private and swift. Say hello to a new era of accessing Handshake domains.</p>
<h1 style="margin-top: 50px;">Reliability is our key focus</h1>
<p>By using a diverse group of upstream providers, we minimise downtime. Multiple of our DNS providers can go down without any downtime to our users.<br>Check out our uptime compared to our upstream DNS providers</p><a class="btn btn-primary" role="button" target="_blank" href="https://status.hnsdoh.com">Status Page</a>
</div>
</section>
<section id="setup" style="min-height: 400px;padding-top: 10vh;text-align: center;margin-right: 10%;margin-left: 10%;" data-bs-target="#navcol-5" data-bs-smooth-scroll="true">
<h3 class="display-1">Setup</h3>
<ul class="list-group">
<li class="list-group-item">
<div>
<h5 class="display-5">DNS over HTTPS or DNS over TLS</h5>
<p>For either DNS over HTTPS or DNS over TLS you should use<br>DOH:&nbsp;https://hnsdoh.com/dns-query<br>DOT:&nbsp;https://hnsdoh.com</p>
</div>
</li>
<li class="list-group-item">
<div>
<h5 class="display-5">Plain DNS</h5>
<p>As a last resort you can use any of plain DNS below (best to chose 2 IPs from different people)<br>- 194.50.5.26 (powered by Nathan.Woodburn/)<br>- 194.50.5.27 (powered by Nathan.Woodburn/)<br>- 194.50.5.28 (powered by Nathan.Woodburn/)<br>-&nbsp;139.144.68.241 (powered by HNS DNS)<br>- 139.144.68.242 (powered by HNS DNS)<br>- 2a01:7e01:e002:c300:: (powered by HNS DNS)<br>- 2a01:7e01:e002:c500:: (powered by HNS DNS)</p>
</div>
</li>
</ul>
</section>
<section style="margin-top: 10vh;margin-right: 10%;margin-left: 10%;">
<div style="text-align: center;">
<h1 style="margin-bottom: 5vh;">Project Information</h1>
<div class="card-group">
<div class="card">
<div class="card-body">
<h4 class="card-title">Open Source</h4>
<p class="card-text">This DoH load balancing system is open source.<br>You can check the code or run your own</p><a class="btn btn-primary" role="button" href="https://github.com/nathanwoodburn/hns_doh_loadbalancer" target="_blank">View Code</a>
</div>
</div>
<div class="card">
<div class="card-body">
<h4 class="card-title">Community run&nbsp;</h4>
<p class="card-text">To ensure high availability, HNSDoH is run by the community around the globe.<br>Do you have some spare compute resources?</p><a class="btn btn-primary" role="button" href="https://github.com/nathanwoodburn/hns_doh_loadbalancer/#how-to-help" target="_blank">Learn how to help</a>
</div>
</div>
</div>
<div class="container py-4 py-xl-5">
<div class="row row-cols-1">
<div class="col"><img class="rounded w-100 h-100 fit-cover" style="min-height: 300px;" src="assets/img/overview.webp"></div>
</div>
<div class="row row-cols-1 row-cols-lg-3">
<div class="col d-flex flex-column justify-content-center p-4">
<div class="text-center text-md-start d-flex flex-column align-items-center align-items-md-start align-items-lg-center mb-5" style="height: 100%;">
<div class="bs-icon-md bs-icon-rounded bs-icon-primary d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block mb-3 bs-icon md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-1-square">
<path d="M9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"></path>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"></path>
</svg></div>
<div>
<h4 style="text-align: center;">DNS Load Balanced</h4>
<p>First the user randomly selects a Load balancing node from a list of available IP addresses for hnsdoh.com</p>
</div>
</div>
</div>
<div class="col d-flex flex-column justify-content-center p-4">
<div class="text-center text-md-start d-flex flex-column align-items-center align-items-md-start align-items-lg-center mb-5" style="height: 100%;">
<div class="bs-icon-md bs-icon-rounded bs-icon-primary d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block mb-3 bs-icon md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-2-square">
<path d="M6.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306Z"></path>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"></path>
</svg></div>
<div>
<h4 style="text-align: center;">Software Balanced</h4>
<p>Once the user has selected a load balancing node, that node will forward the request to one of the upstream DNS providers.</p>
</div>
</div>
</div>
<div class="col d-flex flex-column justify-content-center p-4">
<div class="text-center text-md-start d-flex flex-column align-items-center align-items-md-start align-items-lg-center mb-5" style="height: 100%;">
<div class="bs-icon-md bs-icon-rounded bs-icon-primary d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block mb-3 bs-icon md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-3-square">
<path d="M7.918 8.414h-.879V7.342h.838c.78 0 1.348-.522 1.342-1.237 0-.709-.563-1.195-1.348-1.195-.79 0-1.312.498-1.348 1.055H5.275c.036-1.137.95-2.115 2.625-2.121 1.594-.012 2.608.885 2.637 2.062.023 1.137-.885 1.776-1.482 1.875v.07c.703.07 1.71.64 1.734 1.917.024 1.459-1.277 2.396-2.93 2.396-1.705 0-2.707-.967-2.754-2.144H6.33c.059.597.68 1.06 1.541 1.066.973.006 1.6-.563 1.588-1.354-.006-.779-.621-1.318-1.541-1.318Z"></path>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"></path>
</svg></div>
<div>
<h4 style="text-align: center;">High reliability</h4>
<p>The load balancing nodes keep a track of any upstream DNS failures. They will then direct any new users to one of the working dns providers</p>
</div>
</div>
</div>
</div>
</div>
<div class="container py-4 py-xl-5">
<div class="row mb-4 mb-lg-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<h2>Load balancing nodes</h2>
<p class="w-lg-50">Here is a list of the community run nodes for HNS DoH</p>
</div>
</div>
<div class="row gx-4 row-cols-2 row-cols-md-4" style="--bs-primary: #ffffff;--bs-primary-rgb: 255,255,255;">
<div class="col">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" width="130" height="130" src="assets/img/people/nathanwoodburn.webp">
<h5 class="fw-bold text-primary card-title mb-0"><strong>Nathan.Woodburn/</strong></h5>
<p class="text-muted card-text mb-2">Australia<br>Canada</p><a class="btn btn-primary" role="button" target="_blank" href="https://nathan.woodburn.au"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" src="assets/img/people/ezdomains.jpg" height="130">
<h5 class="fw-bold text-primary card-title mb-0">EZ Domains</h5>
<p class="text-muted card-text mb-2">Netherlands<br>Singapore</p><a class="btn btn-primary" role="button" href="https://ezdomains.io/" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" width="130" height="130" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<h5 class="fw-bold text-primary card-title mb-0"><strong>Join to support</strong></h5>
<p class="text-muted card-text mb-2">Location</p><a class="btn btn-primary disabled" role="button" target="_blank" href="/#"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
<div class="col">
<div class="card border-0 shadow-none">
<div class="card-body text-center d-flex flex-column align-items-center p-0"><img class="rounded-circle mb-3 fit-cover" width="130" height="130" src="https://cdn.bootstrapstudio.io/placeholders/1400x800.png">
<h5 class="fw-bold text-primary card-title mb-0"><strong>Join to support</strong></h5>
<p class="text-muted card-text mb-2">Location</p><a class="btn btn-primary disabled" role="button" href="/#" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 7C13.4477 7 13 7.44772 13 8V16C13 16.5523 13.4477 17 14 17H18C18.5523 17 19 16.5523 19 16V8C19 7.44772 18.5523 7 18 7H14ZM17 9H15V15H17V9Z" fill="currentColor"></path>
<path d="M6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9H10C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7H6Z" fill="currentColor"></path>
<path d="M6 11C5.44772 11 5 11.4477 5 12C5 12.5523 5.44772 13 6 13H10C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11H6Z" fill="currentColor"></path>
<path d="M5 16C5 15.4477 5.44772 15 6 15H10C10.5523 15 11 15.4477 11 16C11 16.5523 10.5523 17 10 17H6C5.44772 17 5 16.5523 5 16Z" fill="currentColor"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C2.34315 3 1 4.34315 1 6V18C1 19.6569 2.34315 21 4 21H20C21.6569 21 23 19.6569 23 18V6C23 4.34315 21.6569 3 20 3H4ZM20 5H4C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19H20C20.5523 19 21 18.5523 21 18V6C21 5.44772 20.5523 5 20 5Z" fill="currentColor"></path>
</svg>&nbsp;Website</a>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="providers" style="margin-top: 10vh;margin-right: 10%;margin-left: 10%;">
<div style="text-align: center;">
<h1>Providers</h1>
<h3 style="margin-bottom: 5vh;">Upstream DNS Providers</h3>
<div>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Provider</th>
<th>DNS over HTTPS</th>
<th>DNS over TLS</th>
<th>Standard DNS</th>
<th data-bs-toggle="tooltip" data-bss-tooltip="" title="Resolve crosschain domains">HIP05</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://nathan.woodburn.au" style="color: rgb(255,255,255);" target="_blank">Nathan.Woodburn/</a></td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td title="Resolve crosschain domains">Yes</td>
</tr>
<tr>
<td><a href="https://hnsdns.com/" style="color: rgb(255,255,255);" target="_blank">HNS DNS</a></td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td title="Resolve crosschain domains">Yes</td>
</tr>
<tr>
<td><a href="https://hnsns.net/" style="color: rgb(255,255,255);" target="_blank">HNS NS</a></td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td title="Resolve crosschain domains">Yes</td>
</tr>
<tr>
<td><a href="https://impervious.com/" style="color: rgb(255,255,255);" target="_blank">Impervious</a></td>
<td data-bs-toggle="tooltip" data-bss-tooltip="" title="Only supports WireFormat DNS requests">Yes</td>
<td>Yes</td>
<td>No</td>
<td title="Resolve crosschain domains">Yes</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
<footer class="text-center bg-dark">
<div class="container text-white py-4 py-lg-5"><a href="https://status.hnsdoh.com" target="_blank" style="margin-right: 10px;">Status Page</a><a href="https://uptime.woodburn.au/status/hnsdoh" target="_blank">Node Status</a>
<p class="text-muted mb-0">Copyright © 2024 HNSDoH</p><!-- Matomo Image Tracker-->
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.woodburn.au/matomo.php?idsite=11&amp;rec=1" style="border:0" alt="" />
<!-- End Matomo -->
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script>
</body>
</html>