Compare commits
40 Commits
d89dd3e0ca
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
0b16708540
|
|||
|
656f17020f
|
|||
|
f59e66a8ac
|
|||
|
dadb53ba5e
|
|||
|
6885ac2783
|
|||
|
97b2040711
|
|||
|
c27ac66b61
|
|||
|
fa1845c642
|
|||
|
4766e4393f
|
|||
|
ba93ece895
|
|||
|
3ca253eb21
|
|||
|
b376a91e9c
|
|||
|
52b2eccde4
|
|||
|
315023fdf3
|
|||
|
8f4dc3c036
|
|||
|
b1ee4b3dd4
|
|||
|
9299335f98
|
|||
|
5da2784bd7
|
|||
|
d9f34ba976
|
|||
|
25d9f1314e
|
|||
|
32506c6fee
|
|||
|
a2c0977c21
|
|||
|
7296e5bc45
|
|||
|
d393e01a91
|
|||
|
307b748590
|
|||
|
44a2b61fce
|
|||
|
004e7fcd9f
|
|||
|
9baefbf6e7
|
|||
|
ccabbfd629
|
|||
|
35975fda66
|
|||
|
28d14c08df
|
|||
|
fe0b36126f
|
|||
|
3e9235e7b6
|
|||
|
adc76c8c5e
|
|||
|
9cbc4a9ab7
|
|||
|
1fa923751d
|
|||
|
de7dd7fe9a
|
|||
|
03da062387
|
|||
|
3c47a6c114
|
|||
|
2cdc96f4b1
|
@@ -4,17 +4,20 @@ on:
|
|||||||
push:
|
push:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Build Docker:
|
Build_Docker:
|
||||||
runs-on: [ubuntu-latest, amd] # Add amd to require amd64
|
runs-on: [ubuntu-latest, amd] # Add amd to require amd64
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Install Docker
|
- name: Install Docker
|
||||||
run : |
|
run : |
|
||||||
echo "Updating apt sources"
|
apt-get install ca-certificates curl gnupg
|
||||||
echo "deb http://ftp.au.debian.org/debian buster main" > /etc/apt/sources.list
|
install -m 0755 -d /etc/apt/keyrings
|
||||||
apt-get update --allow-unauthenticated --allow-insecure-repositories
|
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||||
apt-get install docker.io -y
|
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
|
- name: Build Docker image
|
||||||
run : |
|
run : |
|
||||||
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
|
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
|
||||||
@@ -30,11 +33,11 @@ jobs:
|
|||||||
tag_num="${tag}-${tag_num}"
|
tag_num="${tag}-${tag_num}"
|
||||||
fi
|
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 build -t hns_doh:$tag_num .
|
||||||
docker tag hns_doh:$tag_num git.woodburn.au/nathanwoodburn/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 push git.woodburn.au/nathanwoodburn/hns_doh:$tag_num
|
||||||
docker tag hns_doh:$tag_num git.woodburn.au/nathanwoodburn/hns_doh:$tag
|
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
@@ -0,0 +1 @@
|
|||||||
|
.venv/
|
||||||
4
Caddyfile
Normal 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
|
||||||
|
}
|
||||||
40
README.md
@@ -1,6 +1,6 @@
|
|||||||
# HNS DoH load balancer
|
# HNS DoH load balancer
|
||||||
|
|
||||||
## How to help
|
## Run a node to hellp the project
|
||||||
Contact Nathan.Woodburn/ via
|
Contact Nathan.Woodburn/ via
|
||||||
- Email: contact@hnsdoh.com
|
- Email: contact@hnsdoh.com
|
||||||
- Discord: https://l.woodburn.au/discord
|
- 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.
|
You will need a static IP address that you can host the server on.
|
||||||
This server needs access to these ports
|
This server needs access to these ports
|
||||||
- 443 (TCP) Required for DoH
|
- 443 (TCP) Required for DoH
|
||||||
- 8053 (TCP/UDP) Required for DoT
|
- 853 (TCP/UDP) Required for DoT
|
||||||
- 53 (TCP/UDP) Required for Plain DNS
|
- 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
|
## Install script
|
||||||
Contact Nathan.Woodburn/ to get an Auth token.
|
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.
|
This token is used to get a certificate for the domain.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
cd /root
|
||||||
git clone https://git.woodburn.au/nathanwoodburn/hns_doh_loadbalancer.git
|
git clone https://git.woodburn.au/nathanwoodburn/hns_doh_loadbalancer.git
|
||||||
cd hns_doh_loadbalancer
|
echo "TOKEN FROM NATHAN" > /root/hns_doh_loadbalancer/token
|
||||||
echo "TOKEN FROM NATHAN" > token
|
sudo hns_doh_loadbalancer/install.sh
|
||||||
sudo ./install.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 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).
|
||||||
## 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
|
|
||||||
8
cert.py
@@ -7,11 +7,11 @@ import time
|
|||||||
|
|
||||||
AUTH = ""
|
AUTH = ""
|
||||||
# Check if token file exists
|
# 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")
|
print("ERROR: Token file not found")
|
||||||
|
|
||||||
# Read token from file
|
# Read token from file
|
||||||
with open("token", "r") as fh:
|
with open("/root/hns_doh_loadbalancer/token", "r") as fh:
|
||||||
AUTH = fh.read().strip()
|
AUTH = fh.read().strip()
|
||||||
|
|
||||||
# Check if token is empty
|
# Check if token is empty
|
||||||
@@ -24,7 +24,7 @@ if len(AUTH) == 0:
|
|||||||
|
|
||||||
|
|
||||||
# URL to acme-dns instance
|
# 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
|
# Path for acme-dns credential storage
|
||||||
STORAGE_PATH = "/etc/letsencrypt/acmedns.json"
|
STORAGE_PATH = "/etc/letsencrypt/acmedns.json"
|
||||||
# Whitelist for address ranges to allow the updates from
|
# Whitelist for address ranges to allow the updates from
|
||||||
@@ -132,4 +132,4 @@ if __name__ == "__main__":
|
|||||||
# Update the TXT record in acme-dns instance
|
# Update the TXT record in acme-dns instance
|
||||||
client.update_txt_record(VALIDATION_TOKEN)
|
client.update_txt_record(VALIDATION_TOKEN)
|
||||||
# Wait for the DNS to propagate for 60 seconds
|
# Wait for the DNS to propagate for 60 seconds
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
|
|||||||
3
cert.sh
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
# Tell dnsdist to reload the config
|
# Tell dnsdist to reload the config
|
||||||
dnsdist -c -e 'reloadAllCertificates()'
|
dnsdist -c -e 'reloadAllCertificates()'
|
||||||
|
systemctl restart caddy
|
||||||
|
|
||||||
# Save last run time
|
# Save last run time
|
||||||
date +%s > last_cert_reload.txt
|
date +%s > last_cert_reload.txt
|
||||||
|
|||||||
15
create_wireform.py
Normal 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
@@ -0,0 +1,3 @@
|
|||||||
|
Package: dnsdist*
|
||||||
|
Pin: origin repo.powerdns.com
|
||||||
|
Pin-Priority: 600
|
||||||
110
dnsdist.conf
@@ -1,29 +1,103 @@
|
|||||||
newServer({address="194.50.5.26", name="Nathan.Woodburn/ 1"})
|
-- --- Dynamic block rules
|
||||||
newServer({address="194.50.5.27", name="Nathan.Woodburn/ 2"})
|
local dbr = dynBlockRulesGroup()
|
||||||
newServer({address="194.50.5.28", name="Nathan.Woodburn/ 3"})
|
dbr:setQueryRate(300, 10, "Exceeded query rate", 60)
|
||||||
newServer({address="139.144.68.241", name="HNSDNS 1"})
|
dbr:setRCodeRate(DNSRCode.NXDOMAIN, 50, 10, "Exceeded NXD rate", 60)
|
||||||
newServer({address="139.144.68.242", name="HNSDNS 2"})
|
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
|
function maintenance()
|
||||||
newServer({address="192.198.87.44:443", tls="openssl", subjectName="hnsns.net", dohPath="/dns-query", validateCertificates=true, name="HNSNS"})
|
dbr:apply()
|
||||||
newServer({address="178.128.128.181:443", tls="openssl", subjectName="hs.dnssec.dev", dohPath="/dns-query", validateCertificates=true, name="Impervious"})
|
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
|
-- Drop queries to local TLDs
|
||||||
-- newServer({address="2a01:7e01:e002:c300::", name="HNSDNS 3"})
|
local sldsToDrop = newSuffixMatchNode()
|
||||||
-- newServer({address="2a01:7e01:e002:c300::", name="HNSDNS 4"})
|
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')
|
addACL('0.0.0.0/0')
|
||||||
|
|
||||||
|
-- --- DOH front-end redirect
|
||||||
map = { newDOHResponseMapEntry("^/$", 307, "https://welcome.hnsdoh.com") }
|
|
||||||
dohFE = getDOHFrontend(0)
|
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=")
|
setKey("csl2icaGACsP3+M9tx55c8+dBxVCnlnqAHEC92P55eo=")
|
||||||
controlSocket('127.0.0.1:5199')
|
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
@@ -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
|
||||||
79
install.sh
@@ -6,24 +6,79 @@ if [ "$EUID" -ne 0 ]
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chmod +x cert.sh cert.py
|
# Make sure working directory is /root
|
||||||
sudo apt-get install -y dnsdist
|
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
|
# Install certbot
|
||||||
sudo apt install snapd
|
sudo apt install snapd -y
|
||||||
sudo snap install --classic certbot
|
sudo snap install --classic certbot
|
||||||
sudo ln -s /snap/bin/certbot /usr/bin/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 /root/hns_doh_loadbalancer/resolved.conf /etc/systemd/resolved.conf
|
||||||
sudo cp ./resolved.conf /etc/systemd/resolved.conf
|
|
||||||
sudo systemctl restart systemd-resolved
|
sudo systemctl restart systemd-resolved
|
||||||
|
|
||||||
# Move the conf file to the correct location
|
# Move the conf file to the correct location
|
||||||
sudo cp ./dnsdist.conf /etc/dnsdist/dnsdist.conf
|
sudo cp /root/hns_doh_loadbalancer/dnsdist.conf /etc/dnsdist/dnsdist.conf
|
||||||
# Replace the user and group in the dnsdist.service file to root
|
sudo cp /root/hns_doh_loadbalancer/dnsdist.service /lib/systemd/system/dnsdist.service
|
||||||
# Like this
|
|
||||||
# User=root
|
|
||||||
# Group=root
|
|
||||||
sudo cp ./dnsdist.service /lib/systemd/system/dnsdist.service
|
|
||||||
sudo systemctl daemon-reload
|
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
|
# 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
@@ -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")
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM nginx
|
FROM nginx
|
||||||
RUN rm /etc/nginx/conf.d/default.conf
|
RUN rm /etc/nginx/conf.d/default.conf
|
||||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
COPY content /var/www/html
|
COPY . /var/www/html
|
||||||
5
public/assets/bootstrap/css/bootstrap.min.css
vendored
Normal file
6
public/assets/bootstrap/js/bootstrap.min.js
vendored
Normal file
39
public/assets/css/bss-overrides.css
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 38 KiB |
BIN
public/assets/img/no_one.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
BIN
public/assets/img/people/D8O8BRa_.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/assets/img/people/HNSCA.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/assets/img/people/easy-hns.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
public/assets/img/people/erwin.groen.jpg
Normal file
|
After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
BIN
public/assets/img/people/marioo.jpg
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/assets/img/people/nameguardian.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
432
public/index.html
Normal 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: </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 <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: </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>- 139.177.195.185 (powered by HNS Canada)<br>- 172.233.46.92 (powered by Nathan.Woodburn/)<br>- 172.105.120.203 (powered by Nathan.Woodburn/)<br>- 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>- 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 </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> 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> 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> 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> 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> 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> 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> 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 <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&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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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: https://hnsdoh.com/dns-query<br>DOT: 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>- 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 </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> 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> 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> 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> 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&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>
|
|
||||||