├── CNAME ├── .gitignore ├── _config.yml ├── packages └── controller │ ├── .gitignore │ ├── tsconfig.json │ ├── .eslintrc.cjs │ ├── src │ ├── converter │ │ ├── index.ts │ │ └── index.test.ts │ ├── index.ts │ ├── fetcher │ │ ├── index.ts │ │ └── features │ │ │ └── useCache.ts │ └── subscriptions.ts │ ├── package.json │ └── controller.Dockerfile ├── updates ├── images │ └── 202310-arch.drawio.png ├── index.md ├── 202302-outage.ko.md ├── 202310-arch-update.ko.md ├── 202310-arch-update.md ├── 202307-outage.ko.md ├── 202302-outage.md ├── 202304-arch-update.ko.md ├── 202307-outage.md ├── 202212-outages-and-slowdowns.ko.md ├── 202304-arch-update.md ├── 202212-outages-and-slowdowns.md ├── 202208-secondary-dns.ko.md └── 202208-secondary-dns.md ├── .editorconfig ├── dns.code-workspace ├── package.json ├── tsconfig.json ├── blocklist.txt ├── config ├── xstl-tls.mobileconfig └── xstl-https.mobileconfig ├── README.ko.md └── README.md /CNAME: -------------------------------------------------------------------------------- 1 | get.dns.seia.io -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-modernist -------------------------------------------------------------------------------- /packages/controller/.gitignore: -------------------------------------------------------------------------------- 1 | /data/ 2 | /out/ 3 | /.tsimp/ 4 | -------------------------------------------------------------------------------- /updates/images/202310-arch.drawio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seia-soto/dns/HEAD/updates/images/202310-arch.drawio.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | 7 | [*.{json,ts}] 8 | charset = utf-8 9 | indent_style = tab 10 | -------------------------------------------------------------------------------- /dns.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | }, 6 | { 7 | "path": "packages/controller" 8 | } 9 | ], 10 | "settings": {} 11 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "workspaces": [ 3 | "packages/controller" 4 | ], 5 | "devDependencies": { 6 | "@types/node": "^20.11.25", 7 | "tsimp": "^2.0.11", 8 | "typescript": "^5.4.2" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "moduleResolution": "node10", 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "skipLibCheck": true, 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /updates/index.md: -------------------------------------------------------------------------------- 1 | # Updates 2 | 3 | - [202208: Introducing secondary DNS](./202208-secondary-dns.md) 4 | - [202212: Outages and slowdowns](./202212-outages-and-slowdowns.md) 5 | - [202302: Outage](./202302-outage.md) 6 | - [202304: Arch update](./202304-arch-update.md) 7 | - [202307: Outage](./202307-outage.md) 8 | - [202310: Arch Update](./202310-arch-update.md) 9 | -------------------------------------------------------------------------------- /packages/controller/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "typeRoots": [ 5 | "./node_modules/@types", 6 | "../../node_modules/@types" 7 | ], 8 | "paths": { 9 | "got": [ 10 | "./node_modules/got/dist/source" 11 | ] 12 | }, 13 | 14 | "outDir": "./out" 15 | }, 16 | "tsimp": { 17 | "compilerOptions": { 18 | "paths": { 19 | "got": [ 20 | "./node_modules/got" 21 | ] 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /updates/202302-outage.ko.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [English](./202302-outage.md) 4 | 5 | --- 6 | 7 | # 2023년 2월, 서비스 끊김 현상 8 | 9 | Xstl 암호화 DNS의 관리자입니다. 10 | 한국 시간 5시 48분부터 시작된 약 4분 간의 서비스 끊김에 대해 사과드립니다. 11 | 12 | ## 사유 13 | 14 | 저희 팀은 서비스가 끊길 수 있는 가능성을 서버 내 컨테이너들을 유지보수하는 동안 LVM 드라이버 오류로 파악했으나 아쉽게도 하드웨어에서 오류가 발생하는 까닭에 중단 시간을 피할 수는 없었습니다. 15 | 16 | ## 일정 및 변경 사항 17 | 18 | 저희는 서비스 구조를 위해 저장소 장치를 다시 연결하는 동안 모든 노드를 재시작하여 현재는 모두 괜찮은 상태입니다. 19 | 모든 작업은 중단 시간을 가능한 줄이기 위해 즉시 진행되었습니다. 20 | -------------------------------------------------------------------------------- /updates/202310-arch-update.ko.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [English](./202310-arch-update.md) 4 | 5 | --- 6 | 7 | # 2023년 10월, 아키텍쳐 업데이트 8 | 9 | DNS 운영팀에서 알려드립니다. 10 | Xstl 암호화 DNS의 보조 DNS 안정성 개선을 위해 전체적인 아키텍쳐 변경과 몇 가지 개선 사항이 있었습니다. 11 | 12 | 1. DoP (Plain DNS) 지원 추가 13 | 2. DoH (DNS over HTTPS) 지원 추가 14 | 3. 보조 DNS 안정성 개선 15 | 16 | ![Architecture Diagram](./images/202310-arch.drawio.png) 17 | 18 | 새로운 프로토콜 사용을 원하시는 분께서는 메인 페이지에서 새로운 프로파일을 적용하시거나 시스템의 보안 DNS를 `https://dns.seia.io/dns-query`로 설정해주시기 바랍니다. 19 | 20 | 감사합니다. 21 | -------------------------------------------------------------------------------- /updates/202310-arch-update.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [한국어](./202310-arch-update.ko.md) 4 | 5 | --- 6 | 7 | # Oct 2023, Arch update 8 | 9 | This is DNS operation team. 10 | There were several improvements and architecture rebuilding to improve the stability of the secondary DNS of Xstl encrypted DNS. 11 | 12 | 1. DoP (Plain DNS) support 13 | 2. DoH (DNS over HTTPS) support 14 | 3. Secondary DNS stability improvement 15 | 16 | ![Architecture Diagram](./images/202310-arch.drawio.png) 17 | 18 | Please, apply new profiles in the main page or set privacy DNS in system to `https://dns.seia.io/dns-query` to use new protocols. 19 | 20 | Thank you. 21 | -------------------------------------------------------------------------------- /packages/controller/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | extends: 'xo', 7 | overrides: [ 8 | { 9 | env: { 10 | node: true, 11 | }, 12 | files: [ 13 | '.eslintrc.{js,cjs}', 14 | ], 15 | parserOptions: { 16 | sourceType: 'script', 17 | }, 18 | }, 19 | { 20 | extends: [ 21 | 'xo-typescript', 22 | ], 23 | files: [ 24 | '*.ts', 25 | '*.tsx', 26 | ], 27 | rules: { 28 | 'no-await-in-loop': 0, 29 | }, 30 | }, 31 | ], 32 | parserOptions: { 33 | ecmaVersion: 'latest', 34 | sourceType: 'module', 35 | }, 36 | rules: { 37 | }, 38 | }; 39 | -------------------------------------------------------------------------------- /updates/202307-outage.ko.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [English](./202307-outage.md) 4 | 5 | --- 6 | 7 | # 2023년 7월, 서비스 끊김 현상 8 | 9 | Xstl 암호화 DNS의 관리자입니다. 10 | 한국 시간 7시 14일부터 시작된 약 1일 간의 서비스 끊김에 대해 사과드립니다. 11 | 12 | ## 사유 13 | 14 | 저희 팀은 서비스 유지보수 중 LVM 드라이버의 오류로 인해 다수의 IO 오류가 발생함을 파악했습니다. 15 | 파악과 동시에 어느정도의 서비스 재구축이 필요한지 조사를 시작했으며 서비스 노드의 재설치가 필수적임을 파악했습니다. 16 | 17 | 스토리지에서 약 6TB 가량의 데이터 블럭이 손실되었으며 LVM 볼륨에 문제를 일으킨 것으로 확인했습니다. 18 | 19 | ## 일정 및 변경 사항 20 | 21 | 모든 중요 데이터는 마이그레이션 가능한 것으로 알려져 사실 관계의 파악 이후 즉시 마이그레이션을 시도했습니다. 22 | 마이그레이션 작업은 14일 저녁부터 15일 아침까지 라이브 스냅샷으로 보관 중이던 데이터를 이전 그리고 새로운 서비스 설정을 포함하여 진행되었습니다. 23 | 24 | 모든 작업은 중단 시간을 가능한 줄이기 위해 즉시 진행되었습니다. 25 | -------------------------------------------------------------------------------- /updates/202302-outage.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [한국어](./202302-outage.ko.md) 4 | 5 | --- 6 | 7 | # Feb 2023, Outage 8 | 9 | This is the maintainer of Xstl encrypted DNS. 10 | Sorry for the inconvenience due to service outage about 4 minutes occured at KST 5:48. 11 | 12 | ## Reason 13 | 14 | Our team noticed the potential service outage via LVM driver error while maintaining containers in the server, but we couldn't avoid the downtime as the error was from the hardware unfortunately. 15 | 16 | ## Schedules and changes 17 | 18 | We restarted all nodes while reconnecting the storage device to rescue and it's all fine now. 19 | All works has been made immediately to reduce downtime as possible. 20 | -------------------------------------------------------------------------------- /packages/controller/src/converter/index.ts: -------------------------------------------------------------------------------- 1 | export const convert = (lines: string) => { 2 | const pattern = /^(?:(?:@@)?\|\||\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s*)?([\w.-]+\.[a-zA-Z]+)(?:\^|\s*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\s*$/gm; 3 | const allowed = new Set(); 4 | const blocked = new Set(); 5 | 6 | // eslint-disable-next-line @typescript-eslint/ban-types 7 | let match: RegExpExecArray | null = null; 8 | 9 | while ((match = pattern.exec(lines)) !== null) { 10 | if (match[0].startsWith('@@')) { 11 | allowed.add(match[1]); 12 | blocked.delete(match[1]); 13 | } else if (!allowed.has(match[1])) { 14 | blocked.add(match[1]); 15 | } 16 | } 17 | 18 | return { 19 | allowed, 20 | blocked, 21 | }; 22 | }; 23 | -------------------------------------------------------------------------------- /updates/202304-arch-update.ko.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [English](./202304-arch-update.md) 4 | 5 | --- 6 | 7 | # 2023년 2월, 아키텍쳐 업데이트 8 | 9 | DNS 운영팀에서 안내드립니다. 10 | 먼저 Xstl 암호화 DNS를 약 1년간 기기들에 적용하고 사용해주셔서 감사합니다. 11 | 12 | 저희는 구조 단순화를 위해 처리 구조를 Docker에서 Systemd (시스템 데몬) 기반으로 변경하였습니다. 13 | 여러분이 이 업데이트로 인해 추가로 해야 할 일은 없습니다. 14 | 15 | 또 이 업데이트는 이미 수중에 적용되었습니다. 16 | 17 | ## 성장 보고서 18 | 19 | 또한 저희 시스템의 성장에 대해 소개할 수 있어 기쁩니다. 20 | 사용률 보고서는 민감한 개인정보를 네트워크 수준에서 제거한 뒤 수집되었습니다: 저희는 내부 브릿지를 통해 실제 IP 주소를 가립니다. 21 | 22 | - 쿼리: 24.8만/일일 평균 23 | - 시스템 부하: 0.42/10분 평균 24 | 25 | 이는 서비스를 시작한 이후 약 10배의 성장입니다. 26 | 27 | ## DoH (DNS-over-HTTPS) 지원 검토 28 | 29 | 또 저희는 Windows 시스템에서 개인정보 보호를 향상하기 위해 DoH 지원을 검토 중에 있습니다. 30 | DoT가 DoH보다 가볍기 때문에 저희는 DoT를 지원할 때보다 훨씬 더 많은 준비를 할 예정입니다. 31 | 32 | 언제 지원할지는 말할 수 없지만 현재 준비 중에 있습니다. 33 | 34 | 다시 한 번 사용해주셔서 감사합니다. 35 | -------------------------------------------------------------------------------- /packages/controller/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "controller", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "out/index.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "node --import tsimp/import src/index.ts", 9 | "build": "tsc", 10 | "test": "ava" 11 | }, 12 | "keywords": [], 13 | "author": "HoJeong Go ", 14 | "license": "ISC", 15 | "dependencies": { 16 | "@cliqz/adblocker": "^1.26.16", 17 | "got": "^14.2.1" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^20.11.25", 21 | "@typescript-eslint/eslint-plugin": "^7.1.1", 22 | "@typescript-eslint/parser": "^7.1.1", 23 | "ava": "^6.1.2", 24 | "eslint": "^8.57.0", 25 | "eslint-config-xo": "^0.44.0", 26 | "eslint-config-xo-typescript": "^4.0.0", 27 | "typescript": "^5.4.2" 28 | }, 29 | "ava": { 30 | "extensions": { 31 | "ts": "module" 32 | }, 33 | "nodeArguments": [ 34 | "--import=tsimp" 35 | ] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /updates/202307-outage.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [한국어](./202307-outage.ko.md) 4 | 5 | --- 6 | 7 | # Jul 2023, Outage 8 | 9 | This is the maintainer of Xstl encrypted DNS. 10 | Sorry for the inconvenience due to service outage about a day occured at KST Jul 14. 11 | 12 | ## Reason 13 | 14 | Our team noticed the number of LVM driver errors and they occured the number of IO errors. 15 | After the confirmation, we started investigation to know how many reconstruction would be required and confirmed that the reinstallation of service node is unavoidable. 16 | 17 | 6TB of data blocks were lost in the storage and it caused problem in LVM volumn. 18 | 19 | ## Schedules and changes 20 | 21 | We tried to migrate right after the factor relation check as all critical data were known to be migratable. 22 | Migration has been done from Jul 14 dinner time to Jul 15 morning by moving stored live snapshot data and reinitialization of new service. 23 | 24 | All works has been made immediately to reduce downtime as possible. 25 | -------------------------------------------------------------------------------- /updates/202212-outages-and-slowdowns.ko.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [English](./202212-outages-and-slowdowns.md) 4 | 5 | --- 6 | 7 | # 2022년 12월, 서비스 끊김 및 느려짐 현상 8 | 9 | 안녕하세요? 서비스 시작 이후 첫 번째로 서비스 품질 문제로 인한 소식을 남기게 되어 죄송합니다. 10 | Xstl DNS에서는 지난 2022년 8월 업데이트 이후에 보조 DNS를 통한 무중단 서버 업그레이드를 제시하였습니다. 11 | 그러나 서버 이전 이후 Xstl DNS가 상주하는 환경에도 변화가 생겨 서비스가 느려지는 현상이 다수 발생하였습니다. 12 | 그리고 현재 업스트림 측의 문제로 인해 정상적인 서비스 제공이 불가능한 상황이 되어 현재 모든 요청이 보조 DNS로 우회되고 있습니다. 13 | 저는 DNS가 인터넷을 구동하는데 있어 핵심적인 서비스임을 이해하고 있습니다. 14 | 그래서 더 빠른 인터넷 환경 제공을 위해 현재 최대한 빨리 국내망을 통한 서비스를 복구시킬 수 있도록 노력하고 있습니다. 15 | 16 | ## 2022년 11월, 느려짐 현상 17 | 18 | ### 사유 19 | 20 | 2022년 11월에는 무중단 서버 이전이 있었습니다. 21 | 특별히 문제가 되는 부분은 없었으나 DNS 서버의 구동 환경이 SSD에서 HDD로 이전됨에 따라 요청 처리 시간에 문제가 발생했습니다. 22 | 이로 인해서 특히 모바일 환경에서 애플리케이션의 정상적인 사용이 불가능한 사례가 발견되었고 데스크톱 및 PC 환경에서도 속도 저하가 확인되었습니다. 23 | 24 | ### 일정 및 변경 사항 25 | 26 | 현재는 다시 SSD로 환경을 변경하여 문제를 해결하였습니다. 27 | 28 | ## 2022년 12월 끊김 현상 29 | 30 | 네트워크가 서로서로를 보도록 잘못 설정되어 있었습니다. 31 | 32 | ### 일정 및 변경 사항 33 | 34 | 윗단 문제를 해결했고 주 서버로 요청을 업그레이드하는 중입니다. 35 | -------------------------------------------------------------------------------- /updates/202304-arch-update.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [한국어](./202304-arch-update.ko.md) 4 | 5 | --- 6 | 7 | # Feb 2023, Arch update 8 | 9 | This is DNS operation team. 10 | First, thank you for using the Xstl encrypted DNS on your devices for about a year. 11 | 12 | We've updated the processing arch based on Systemd (System Daemon) instead of Docker to simplify the layers. 13 | There's nothing for you to do with this. 14 | 15 | Also, this update is already applied under the water. 16 | 17 | ## Growth report 18 | 19 | We're happy to introduce a growth of our system too. 20 | The usage reports are collected via syslog with network level privacy sensitive redaction: We place an internal bridge before the actual server to hide IP address. 21 | 22 | - Hits: 248k/daily average 23 | - Sysload: 0.42/10m average 24 | 25 | It's about 10x growth compared to the time we started the service. 26 | 27 | ## Examining the DoH (DNS-over-HTTPS) support 28 | 29 | Also, we're examining the DoH support to improve privacy on Windows systems. 30 | Since DoT is lighter than DoH, we'll prepare a lot more before supporting other protocols rather than DoT. 31 | 32 | We're not going to fix the support date, but we're here to notify that we're planning. 33 | 34 | Thank you all again for using the service. 35 | -------------------------------------------------------------------------------- /packages/controller/controller.Dockerfile: -------------------------------------------------------------------------------- 1 | arg ALPINE_VERSION=3.19 2 | 3 | from node:21-alpine${ALPINE_VERSION} as builder 4 | 5 | workdir /build-stage/ 6 | copy package*.json ./ 7 | copy tsconfig.json ./ 8 | run npm ci 9 | 10 | workdir /build-stage/packages/controller/ 11 | copy packages/controller/package.json ./ 12 | copy packages/controller/tsconfig.json ./ 13 | copy packages/controller/src/ ./ 14 | run npm ci 15 | run npm run build 16 | 17 | from alpine:${ALPINE_VERSION} 18 | 19 | workdir /usr/src/app/ 20 | run apk add --no-cache libstdc++ dumb-init \ 21 | && addgroup -g 1000 node && adduser -u 1000 -G node -s /bin/sh -D node \ 22 | && chown node:node ./ 23 | copy --from=builder /usr/local/bin/node /usr/local/bin/ 24 | copy --from=builder /usr/local/bin/docker-entrypoint.sh /usr/local/bin/ 25 | 26 | entrypoint ["docker-entrypoint.sh"] 27 | user node 28 | 29 | copy --from=builder /build-stage/node_modules/ ./node_modules/ 30 | copy --from=builder /build-stage/package*.json ./ 31 | 32 | workdir /usr/src/app/packages/controller/ 33 | copy --from=builder /build-stage/packages/controller/node_modules/ ./node_modules/ 34 | copy --from=builder /build-stage/packages/controller/out/ ./out/ 35 | copy --from=builder /build-stage/packages/controller/package.json ./ 36 | 37 | cmd ["dumb-init", "node", "out/index.js"] 38 | -------------------------------------------------------------------------------- /updates/202212-outages-and-slowdowns.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [한국어](./202212-outages-and-slowdowns.ko.md) 4 | 5 | --- 6 | 7 | # Dec 2022, Outages and slowdowns 8 | 9 | Hello? I am sorry to post about service outages and slowdowns after the launch. 10 | Xstl DNS showed seamless server upgrade after August 2022 update. 11 | However, the environment Xstl DNS lives changed and reported many of service slowdowns after the upgrade. 12 | And now, providing the service is not able and we're redirecting all requests to the secondary DNS due to upstream problem. 13 | I understand that the DNS is really core of the internet operation. 14 | Therefore, I am trying to bring the service via Korean-link up as fast as possible to provide faster internet environment. 15 | 16 | ## Nov 2022, Slowdown 17 | 18 | ### Reason 19 | 20 | There was seamless server migration in November 2022. 21 | There is nothing specially notable, but the processing time became problematic as the operation environment of DNS moved from SSD to HDD. 22 | Because of it, the case that the normal use of mobile applications wasn't able found, and slowdonw found also on PC environment. 23 | 24 | ### Schedules and changes 25 | 26 | We migrated to SSD environment to solve the problem currently. 27 | 28 | ## Dec 2022, Outage 29 | 30 | ### Reason 31 | 32 | The network was configured fasly to face each other. 33 | 34 | ### Schedules and changes 35 | 36 | We fixed the upstream issue and preparing to upgrade connections via primary server. 37 | -------------------------------------------------------------------------------- /blocklist.txt: -------------------------------------------------------------------------------- 1 | # Curated list from Filter-KR from HoJeong Go(@seia-soto on GitHub) 2 | 3 | # ad 4 | ad.planbplus.co.kr 5 | 6 | # tracking 7 | analytics-script.ad-shield.io 0.0.0.0 8 | 31830fbc-adbf-11ed-afa1-0242ac120002.site 9 | 15823f12-289e-4189-9e51-e2de1bf1a105.online 10 | script.ifdo.co.kr 11 | wlog.ifdo.co.kr 12 | cdn.cresendo.net 13 | clickstream.cresendo.net 14 | fin.rainbownine.net 15 | loginside.co.kr 16 | cr.acecounter.com 17 | googleads.g.doubleclick.net 18 | publickeyservice.aws.privacysandboxservices.com 19 | sdk.iad-05.braze.com 20 | data-logdelivery.wconcept.co.kr 21 | collector-statistics.nhn-commerce.com 22 | las.danawa.com 23 | fair-1285.com 24 | wb-tt.com 25 | wn-xg.com 26 | gst.groobee.io 27 | www.mediacategory.com 28 | pxl.retaku.net 29 | cdn.smlog.co.kr 30 | a1.smlog.co.kr 31 | a2.smlog.co.kr 32 | a3.smlog.co.kr 33 | a4.smlog.co.kr 34 | a5.smlog.co.kr 35 | a6.smlog.co.kr 36 | a7.smlog.co.kr 37 | a8.smlog.co.kr 38 | a9.smlog.co.kr 39 | a10.smlog.co.kr 40 | a11.smlog.co.kr 41 | a12.smlog.co.kr 42 | a13.smlog.co.kr 43 | a14.smlog.co.kr 44 | a15.smlog.co.kr 45 | a16.smlog.co.kr 46 | a17.smlog.co.kr 47 | a18.smlog.co.kr 48 | a19.smlog.co.kr 49 | a20.smlog.co.kr 50 | a21.smlog.co.kr 51 | a22.smlog.co.kr 52 | a23.smlog.co.kr 53 | a24.smlog.co.kr 54 | a25.smlog.co.kr 55 | jslog.coupang.com 56 | ljc.coupang.com 57 | jnn-pa.googleapis.com 58 | dadispapi.gmarket.co.kr 59 | ca-api.cafe24data.com 60 | t.arcade.show 61 | 62 | # malicious 63 | ovz1.j19544519.pr46m.vps.myjino.ru 64 | cpchjdflfeejpegfmghbamllgdpikgaa.vr3.space 65 | -------------------------------------------------------------------------------- /packages/controller/src/converter/index.test.ts: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import {convert} from './index.js'; 3 | 4 | const empty = new Set(); 5 | 6 | test('hosts conversion', t => { 7 | t.deepEqual( 8 | convert('domain.tld'), 9 | { 10 | allowed: empty, 11 | blocked: new Set(['domain.tld']), 12 | }, 13 | 'converts simple form of domain', 14 | ); 15 | 16 | t.deepEqual( 17 | convert('0.0.0.0 domain.tld'), 18 | { 19 | allowed: empty, 20 | blocked: new Set(['domain.tld']), 21 | }, 22 | 'converts hosts format', 23 | ); 24 | 25 | t.deepEqual( 26 | convert('domain.tld 0.0.0.0'), 27 | { 28 | allowed: empty, 29 | blocked: new Set(['domain.tld']), 30 | }, 31 | 'converts reversed hosts format', 32 | ); 33 | }); 34 | 35 | test('filters conversion', t => { 36 | t.deepEqual( 37 | convert('||domain.tld'), 38 | { 39 | allowed: empty, 40 | blocked: new Set(['domain.tld']), 41 | }, 42 | 'converts simple form of filter', 43 | ); 44 | 45 | t.deepEqual( 46 | convert('||domain.tld^'), 47 | { 48 | allowed: empty, 49 | blocked: new Set(['domain.tld']), 50 | }, 51 | 'converts network filter with right anchor', 52 | ); 53 | 54 | t.deepEqual( 55 | convert('||domain.tld$3p'), 56 | { 57 | allowed: empty, 58 | blocked: empty, 59 | }, 60 | 'converts network filter with an option', 61 | ); 62 | 63 | t.deepEqual( 64 | convert(`||domain.tld 65 | !#if a 66 | @@||domain.tld 67 | !#endif`), 68 | { 69 | allowed: new Set(['domain.tld']), 70 | blocked: empty, 71 | }, 72 | 'disables network filter regardless of a condition', 73 | ); 74 | }); 75 | -------------------------------------------------------------------------------- /packages/controller/src/index.ts: -------------------------------------------------------------------------------- 1 | import {writeFile} from 'fs/promises'; 2 | import {convert} from './converter/index.js'; 3 | import {useFilterList} from './fetcher/index.js'; 4 | import {subscriptions} from './subscriptions.js'; 5 | 6 | const main = async () => { 7 | console.time('*main'); 8 | 9 | const allowed = new Set(); 10 | const blocked = new Set(); 11 | 12 | for (const subscription of subscriptions) { 13 | console.time(subscription.name); 14 | console.time(subscription.name + ':acquire'); 15 | 16 | const filterList = await useFilterList(subscription); 17 | 18 | console.timeEnd(subscription.name + ':acquire'); 19 | console.time(subscription.name + ':parse'); 20 | 21 | const result = convert(filterList.content); 22 | 23 | console.log(`> found ${result.blocked.size} domain entries from ${subscription.name}`); 24 | 25 | console.timeEnd(subscription.name + ':parse'); 26 | console.time(subscription.name + ':merge'); 27 | 28 | for (const one of result.allowed) { 29 | allowed.add(one); 30 | } 31 | 32 | for (const one of result.blocked) { 33 | if (!allowed.has(one)) { 34 | blocked.add(one); 35 | } 36 | } 37 | 38 | console.timeEnd(subscription.name + ':merge'); 39 | console.timeEnd(subscription.name); 40 | } 41 | 42 | allowed.clear(); 43 | 44 | console.log(`> found total ${blocked.size} domain entries from ${subscriptions.length} filters and host files`); 45 | console.time('*build'); 46 | 47 | const hosts = Array.from(blocked) 48 | .map(line => '127.0.0.1 ' + line) 49 | .join('\n'); 50 | 51 | console.timeEnd('*build'); 52 | 53 | await writeFile('./data/hosts.txt', hosts, 'utf8'); 54 | 55 | console.timeEnd('*main'); 56 | }; 57 | 58 | void main(); 59 | -------------------------------------------------------------------------------- /config/xstl-tls.mobileconfig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PayloadContent 6 | 7 | 8 | DNSSettings 9 | 10 | DNSProtocol 11 | TLS 12 | ServerAddresses 13 | 14 | 116.121.57.111 15 | 140.238.14.191 16 | 17 | ServerName 18 | dns.seia.io 19 | 20 | PayloadDescription 21 | Configures device to use Xstl eDNS over TLS 22 | PayloadDisplayName 23 | Xstl eDNS over TLS 24 | PayloadIdentifier 25 | com.apple.dnsSettings.managed.46C2E964-2B5E-4995-9A04-E860A82C4B31 26 | PayloadType 27 | com.apple.dnsSettings.managed 28 | PayloadUUID 29 | FC9FC243-4143-47B3-8C51-97DAA4BD8741 30 | PayloadVersion 31 | 1 32 | ProhibitDisablement 33 | 34 | 35 | 36 | PayloadDescription 37 | Adds the Xstl eDNS to Big Sur and iOS 14 based systems 38 | PayloadDisplayName 39 | Xstl eDNS over TLS (rev20231012) 40 | PayloadIdentifier 41 | io.seia.dns.tls 42 | PayloadRemovalDisallowed 43 | 44 | PayloadType 45 | Configuration 46 | PayloadUUID 47 | A0A6B743-6529-462E-BF48-DA7CD54B6BD6 48 | PayloadVersion 49 | 1 50 | 51 | -------------------------------------------------------------------------------- /config/xstl-https.mobileconfig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PayloadContent 6 | 7 | 8 | DNSSettings 9 | 10 | DNSProtocol 11 | HTTPS 12 | ServerAddresses 13 | 14 | 116.121.57.111 15 | 140.238.14.191 16 | 17 | ServerURL 18 | https://dns.seia.io/dns-query 19 | 20 | PayloadDescription 21 | Configures device to use Xstl eDNS over HTTPS 22 | PayloadDisplayName 23 | Xstl eDNS over HTTPS 24 | PayloadIdentifier 25 | com.apple.dnsSettings.managed.D5089A3E-F134-4691-AC66-3818E6706374 26 | PayloadType 27 | com.apple.dnsSettings.managed 28 | PayloadUUID 29 | 8F5FAA25-5FCA-4F38-80C2-42E45410A286 30 | PayloadVersion 31 | 1 32 | ProhibitDisablement 33 | 34 | 35 | 36 | PayloadDescription 37 | Adds the Xstl eDNS over HTTPS to Big Sur and iOS 14 based systems 38 | PayloadDisplayName 39 | Xstl eDNS over HTTPS (rev20231012) 40 | PayloadIdentifier 41 | io.seia.dns.https 42 | PayloadRemovalDisallowed 43 | 44 | PayloadType 45 | Configuration 46 | PayloadUUID 47 | FDDB005F-D954-4DEA-A189-DADDEB4ECB6B 48 | PayloadVersion 49 | 1 50 | 51 | -------------------------------------------------------------------------------- /updates/202208-secondary-dns.ko.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [English](./202208-secondary-dns.md) 4 | 5 | --- 6 | 7 | # 보조 DNS를 소개합니다 8 | 9 | 안녕하세요? 서비스 시작 이후 약 한 달 만에 좋은 소식으로 찾아볼 수 있어 감사하다는 말씀을 올립니다. 10 | 다름이 아니라 Xstl DNS에서는 2022년 9월 중 Oracle Cloud Platform에서 호스트 중인 인스턴스를 통해 보조 DNS를 지원할 계획이라는 소식을 전달하게 되었습니다. 11 | 그에 따라 기존의 치명적 단점이었던 안정성이 전문화된 클라우드 운영 아래에서 한 단계 더 개선되어 기존보다 더 좋은 서비스를 제공할 수 있게 된 점 뿌듯하게 생각합니다. 12 | 13 | ## 사유 14 | 15 | Xstl DNS는 2022년 7월 28일부터 약 1달 간 서비스 중단없이 개인 서버에서 운영되며 현 시점인 2022년 8월 24일까지 약 380만 개의 요청을 처리하게 되었습니다. 16 | 먼저 생각 이상으로 많은 분들이 사용해주셔서 감사하다는 말씀드립니다. 17 | 그러나 개인 서버에서 운영되는 특성 상 호스트가 오랜 기간 재시작없이 유지되어야 한다는 점은 그간 보장해드릴 수가 없었습니다. 18 | 무엇보다도 개인 서버가 점검 상태에 들어가게 된다면 컴퓨터의 전원이 내려가 서비스 제공에 차질이 생긴다는 점이 가장 크게 와닿았습니다. 19 | 20 | 클라우드와 달리 현재는 컴퓨터의 전원 상태나 서비스의 상태를 확인할 수 있는 체계가 마련되어 있지 않다보니 이는 더더욱 심각한 문제로 느껴졌습니다. 21 | 그리고 금월 말, 개인 서버의 써멀 컴파운드 재도포 및 드라이브 교체 등의 전반적인 유지보수 작업으로 인해 서비스에 차질이 생기는 일이 없도록 대안을 마련해야 했습니다. 22 | 대안 중 가장 강력하게 떠오른 것은 주 DNS가 다운되어도 지속적으로 동일 기능을 제공할 수 있는 보조 DNS의 운영이었습니다. 23 | 또 클라이언트 측에서는 자연스럽게 주 DNS와 보조 DNS가 서로 대안이 되어 줄테니 당장 사용자 입장에서 추가로 취해야 할 동작도 없었습니다. 24 | 25 | ## 일정 및 변경 사항 26 | 27 | 현재는 보조 DNS가 정식으로 배포되지 않은 상태로 같은 LE 인증서를 사용하여 임시로 OCP에서 서버를 구동하고 있습니다. 28 | 처음 DNS 프로파일을 배포할 때 IP 주소가 아니라 DNS 주소를 통해 배포했기 때문에 가능한 일입니다. 29 | 또 인증서와 차단 목록의 자동 갱신은 그대로 이루어지고 있으니 서비스 품질에 관해서는 걱정하지 않으셔도 됩니다. 30 | 지연 시간에 대해서도 약 1시간 정도 측정하였으나 기존의 값인 최저 14ms, 최대 110ms(캐시 없이)에서 유의미한 변동이 확인되지 않았습니다. 31 | 32 | 당장 사용자 분들이 변경해주셔야 하는 사항은 없습니다. 33 | `tls://dns.seia.io` 주소는 앞으로도 계속 사용될 예정입니다. 34 | 35 | 다만 운영의 개인 사정으로 인해 보조 DNS 서버는 9월 달 중 실제 사용자에게 영향을 최소화하면서 배포할 예정에 있습니다. 36 | 그리고 배포가 완료되면 보조 DNS의 주소를 포함한 `mobileconfig` 파일이 새로 제공될 예정입니다. 37 | 새로운 파일은 `https://get.dns.seia.io`의 메인 페이지(README.md)에 OCP 서버가 추가됨과 동시에 제공될 예정입니다. 38 | 기존 사용자 분들께서는 프로파일을 새로 설치해야 하는 번거로움을 수반하지 않으시도록 앞으로도 가능하면 DNS 연결 주소를 동적으로 변경할 예정에 있습니다. 39 | 하지만 안정성 및 연결 문제 최소화를 위해서 새 프로파일이 공개된 것을 보시게 된다면 재설치를 권장드립니다. 40 | 41 | 중대 변경 사항이 또 발생한다면 현재와 같이 웹 사이트를 통해서 안내드리도록 하겠습니다. 42 | 좋은 소식으로 찾아뵙길 기대합니다. 43 | 감사합니다. 44 | -------------------------------------------------------------------------------- /updates/202208-secondary-dns.md: -------------------------------------------------------------------------------- 1 | # [Xstl encrypted DNS](/) 2 | 3 | [한국어](./202208-secondary-dns.ko.md) 4 | 5 | --- 6 | 7 | # Introducing secondary DNS 8 | 9 | Hello! It's very thankful to announce good news to you after about a month of service operation. 10 | Not that fancy news but I am here to announce that Xstl DNS will support the secondary DNS via the instance running on Oracle CloudPlatform on September, 2022. 11 | So I am happy to announce, stability, the critical disadvantage, is now improved under expertised cloud operation for better service. 12 | 13 | ## Reasons 14 | 15 | Xstl DNS has ran on personal server about a month without service downtime, from 2022. 7. 28 to 2022. 8. 24, processing about 3.8M requests. 16 | First of all, I am appreciated as there are more users than I expected. 17 | However, I couldn't ensure you a permanent uptime without rebooting as the host was running on personal server. 18 | Most importantly, it would be really terrible if the host computer is down as the server goes under maintenence. 19 | 20 | Also, the lack of system to check the status of power or service led me to feel this as more critical problem. 21 | And the last week of this month, due to the reapplication of thermal compound and replacing disks, I was required to create an alternative to serve the service without downtime. 22 | As a result, the secondary DNS was the most powerful solution as an alternative in this situation. 23 | Also, There was nothing to do from client-side as the client would fallback in both primary and secondary DNS. 24 | 25 | ## Schedules and changes 26 | 27 | Currently, the DNS server is running on OCP temporarily using same LE certificate while the secondary DNS isn't deployed officially. 28 | It's possible as I initially deployed DNS via DNS address not the IP address. 29 | Also, you don't need to worry about the quality of service as the automatic renewal process of certificate and blocklist is working well. 30 | I checked the latency about an hour, but did not found any meaningful changes from previous values, min 14ms to max 110ms(without cache). 31 | 32 | As user, there is nothing to do right now. 33 | `tls://dns.seia.io` address will be used continuously. 34 | 35 | But the secondary DNS will be deployed during September, 2022 reducing the side-effect to the end-user due to personal problem. 36 | Also, after the completion of the deployment, new `mobileconfig` file will be served including secondary DNS address. 37 | New file will be served at the same time when the main page(README.md) of `https://get.dns.seia.io` adds OCP server. 38 | For existing users, if possible, I am planning to change DNS connection address dynamically to prevent hassle works. 39 | However, it's recommended to reinstall the new profile as you see the new version released to minimize the connection and stability issues. 40 | 41 | I'll tell you via website when there is another breaking changes happen. 42 | I hope you see again with good news later. 43 | Thank you. 44 | -------------------------------------------------------------------------------- /packages/controller/src/fetcher/index.ts: -------------------------------------------------------------------------------- 1 | import got, { 2 | type OptionsInit, type Response, type BeforeRequestHook, type Options, type AfterResponseHook, 3 | } from 'got'; 4 | 5 | const fetcher = got.extend({ 6 | headers: { 7 | 'user-agent': 'seia-soto/dns v0', 8 | }, 9 | }); 10 | 11 | /** 12 | * A plugin definition for a filter list 13 | * This function returns true if fast exit is required 14 | */ 15 | export type FilterListHookOnInitialised = (context: FilterListContext) => boolean | Promise; 16 | 17 | export type FilterListHookOnBeforeFetch = (context: FilterListContext, options: Options) => void | Promise; 18 | 19 | export type FilterListHookOnAfterFetch = (context: FilterListContext, response: Response, retryWithMergedOptions: (options: OptionsInit) => never) => Response | Promise; 20 | 21 | export type FilterListHookOnError = (context: FilterListContext, error: unknown) => void | string | Promise; 22 | 23 | export type FilterListHook = Partial<{ 24 | handleInitialised: FilterListHookOnInitialised; 25 | handleBeforeFetch: FilterListHookOnBeforeFetch; 26 | handleAfterFetch: FilterListHookOnAfterFetch; 27 | handleError: FilterListHookOnError; 28 | }>; 29 | 30 | export type FilterList = { 31 | name: string; 32 | url: string; 33 | hooks?: FilterListHook[]; 34 | }; 35 | 36 | export type FilterListContext = { 37 | metadata: FilterList; 38 | 39 | content: string; 40 | 41 | __cache?: { 42 | path: string; 43 | etag?: string; 44 | changedAt?: number; 45 | }; 46 | }; 47 | 48 | export const useFilterList = async (list: FilterList) => { 49 | const context: FilterListContext = { 50 | metadata: list, 51 | content: '', 52 | }; 53 | 54 | // On initialised 55 | if (list.hooks) { 56 | for (const hook of list.hooks) { 57 | if (await hook.handleInitialised?.(context)) { 58 | return context; 59 | } 60 | } 61 | } 62 | 63 | // On before request 64 | const beforeRequest: BeforeRequestHook[] = []; 65 | 66 | if (list.hooks) { 67 | for (const hook of list.hooks) { 68 | if (hook.handleBeforeFetch) { 69 | beforeRequest.push(hook.handleBeforeFetch.bind(null, context)); 70 | } 71 | } 72 | } 73 | 74 | // On after response 75 | const afterResponse: AfterResponseHook[] = []; 76 | 77 | if (list.hooks) { 78 | for (const hook of list.hooks) { 79 | if (hook.handleAfterFetch) { 80 | afterResponse.push(hook.handleAfterFetch.bind(null, context)); 81 | } 82 | } 83 | } 84 | 85 | const repsonse = await fetcher(list.url, { 86 | hooks: { 87 | beforeRequest, 88 | afterResponse, 89 | }, 90 | }) 91 | .catch(async error => { 92 | console.error(context.metadata.name, error); 93 | 94 | if (list.hooks) { 95 | for (const hook of list.hooks) { 96 | if (hook.handleError) { 97 | const alt = await hook.handleError(context, error); 98 | 99 | if (alt) { 100 | return {body: alt}; 101 | } 102 | } 103 | } 104 | } 105 | 106 | return { 107 | body: '', 108 | }; 109 | }); 110 | 111 | context.content = repsonse.body; 112 | 113 | return context; 114 | }; 115 | -------------------------------------------------------------------------------- /packages/controller/src/fetcher/features/useCache.ts: -------------------------------------------------------------------------------- 1 | import {createReadStream, createWriteStream, existsSync} from 'fs'; 2 | import {mkdir, stat} from 'fs/promises'; 3 | import path from 'path'; 4 | import { 5 | type FilterListHookOnBeforeFetch, type FilterListHook, type FilterListHookOnInitialised, type FilterListHookOnAfterFetch, type FilterListHookOnError, 6 | } from '../index.js'; 7 | 8 | const handleInitialised: FilterListHookOnInitialised = async context => { 9 | // Check the cached file 10 | const cacheDirPath = './data/cache'; 11 | const cachePath = path.join(cacheDirPath, context.metadata.name); 12 | 13 | context.__cache = { 14 | path: cachePath, 15 | }; 16 | 17 | // Create a directory 18 | if ( 19 | !existsSync(cacheDirPath) 20 | || !(await stat(cacheDirPath)).isDirectory() 21 | ) { 22 | await mkdir(cacheDirPath, {recursive: true}); 23 | } 24 | 25 | // Create a file 26 | if (!existsSync(cachePath)) { 27 | // Request is required, don't break the process 28 | return false; 29 | } 30 | 31 | const cacheInfo = await stat(cachePath); 32 | 33 | if (!cacheInfo.isFile()) { 34 | return false; 35 | } 36 | 37 | context.__cache.changedAt = cacheInfo.ctimeMs; 38 | 39 | // Read the length of etag header 40 | let chunks: Uint8Array[] = []; 41 | 42 | for await (const chunk of createReadStream(cachePath, {start: 0, end: 4})) { 43 | chunks.push(chunk as Uint8Array); 44 | } 45 | 46 | const length = Buffer.concat(chunks).readUint32LE(); 47 | 48 | // Read the eTag header of this file 49 | chunks = []; 50 | 51 | for await (const chunk of createReadStream(cachePath, {start: 4, end: 4 + length})) { 52 | chunks.push(chunk as Uint8Array); 53 | } 54 | 55 | let etag = ''; 56 | 57 | for (let bytes = Buffer.concat(chunks), i = 0, l = length; i < l; i++) { 58 | etag += String.fromCharCode(bytes.readUintLE(i, 1)); 59 | } 60 | 61 | context.__cache.etag = etag; 62 | 63 | return false; 64 | }; 65 | 66 | const handleBeforeFetch: FilterListHookOnBeforeFetch = async (context, options) => { 67 | if (!context.__cache!.etag) { 68 | return; 69 | } 70 | 71 | options.headers['if-none-match'] = context.__cache!.etag; 72 | }; 73 | 74 | const handleAfterFetch: FilterListHookOnAfterFetch = async (context, response, retryWithMergedOptions) => { 75 | if (response.statusCode === 200 && response.headers.etag) { 76 | const outbound = createWriteStream(context.__cache!.path); 77 | 78 | const header = Buffer.alloc(4 + response.headers.etag.length); 79 | 80 | header.writeUint32LE(response.headers.etag.length); 81 | 82 | for (let i = 0; i < response.headers.etag.length; i++) { 83 | header.writeUintLE(response.headers.etag.charCodeAt(i), 4 + i, 1); 84 | } 85 | 86 | outbound.write(header); 87 | outbound.write(response.body); 88 | outbound.end(); 89 | 90 | return response; 91 | } 92 | 93 | if (response.statusCode !== 304) { 94 | return response; 95 | } 96 | 97 | console.log(`> reusing the cache for ${context.metadata.name} (response.status === 304)`); 98 | 99 | // Construct new response based on the cache 100 | const chunks: Uint8Array[] = []; 101 | 102 | for await (const chunk of createReadStream(context.__cache!.path, {start: 4 + context.__cache!.etag!.length})) { 103 | chunks.push(chunk as Uint8Array); 104 | } 105 | 106 | response.rawBody = Buffer.concat(chunks); 107 | response.body = response.rawBody.toString('utf8'); 108 | 109 | return response; 110 | }; 111 | 112 | const handleError: FilterListHookOnError = async (context, error) => { 113 | if (!context.__cache?.changedAt) { 114 | return; 115 | } 116 | 117 | const start = context.__cache.etag 118 | ? context.__cache.etag.length + 4 119 | : 4; 120 | 121 | const chunks: Uint8Array[] = []; 122 | 123 | for await (const chunk of createReadStream(context.__cache.path, {start})) { 124 | chunks.push(chunk as Uint8Array); 125 | } 126 | 127 | return Buffer.concat(chunks).toString('utf8'); 128 | }; 129 | 130 | export const useCache: Partial = { 131 | handleInitialised, 132 | handleBeforeFetch, 133 | handleAfterFetch, 134 | handleError, 135 | }; 136 | -------------------------------------------------------------------------------- /README.ko.md: -------------------------------------------------------------------------------- 1 | # Xstl encrypted DNS 2 | 3 | [English](/README.md) 4 | 5 | Xstl DNS는 평소 사용에 최소한의 오버헤드로 개인정보 보호 수준을 향상할 수 있는 공개 DNS 서비스입니다. [(업데이트 내역)](/updates/index.md) 6 | 7 | | Type | Address | Upstream | Host | 8 | |---------------------|-----------------------------|--------------------------------------|------------------------------------| 9 | | Do53, DoT, DoH (h3) | tls://dns.seia.io | CloudFlare DNS | SK Broadband, South Korea | 10 | | Do53, DoT, DoH (h3) | tls://secondary.dns.seia.io | CloudFlare DNS | Oracle Cloud Platform, South Korea | 11 | 12 | **특징** 13 | 14 | - 광고나 트래커를 제공하는 호스트를 차단합니다. 15 | - 업스트림 DNS로 CloudFlare를 사용 중입니다. 16 | - 개인정보 보호에 우선하여 기록 정책 상 아무 개인 정보를 포함하지 않습니다. 17 | 18 | **설치** 19 | 20 | > Apple 기기에서 2023년 10월 전에 배포된 프로파일을 사용하고 계시다면 기존 프로파일을 제거 후 재설치해야 합니다. 21 | 22 | - Apple 기기 (iOS 14 이상) 23 | - DoT: [https://get.dns.seia.io/config/xstl-tls.mobileconfig](https://get.dns.seia.io/config/xstl-tls.mobileconfig) 24 | - DoH: [https://get.dns.seia.io/config/xstl-https.mobileconfig](https://get.dns.seia.io/config/xstl-https.mobileconfig) 25 | - DoP (전역 설정을 위한 평문 DNS): `sudo networksetup -setdnsservers Wi-Fi 116.121.57.111 140.238.14.191`와 `sudo networksetup -setdnsservers Wi-Fi empty`로 전환 26 | - Android 기기 27 | - 네트워크 설정에서 보안 DNS를 `dns.seia.io`로 설정하세요. 28 | - 다른 기기 (혹은 보안 연결없는 DNS) 29 | - 주 DNS 값을 `116.121.57.111`로 설정하세요. 30 | - 보조 DNS 값을 `140.238.14.191`로 설정하세요. 31 | 32 | 모든 서버는 `tls://dns.seia.io`로 연결할 수 있습니다. 33 | 34 | ## Notes 35 | 36 | DNS를 기기에 적용하기 전 반드시 아래 사항을 읽어주십시오. 37 | 38 | ### Encrypted DNS 39 | 40 | 암호화 DNS는 평문으로 전달되던 기존 DNS 패킷 대신 TLS 터널 혹은 그에 준하는 프로토콜로 패킷을 감싸 인터넷 서비스 제공자에게서 DNS 쿼리를 숨깁니다. 41 | 흔히 암호화 DNS를 제공하는 방식에는 2가지가 있습니다. 42 | 43 | > DoT(TLS 상 DNS, 853 포트)와 DoH(Https 상 DNS, 443 포트)이며 모두 올바른 인증서 위에 수립된 연결에서만 작동합니다. 44 | 45 | 현재 Xstl DNS는 오버헤드를 최소화하기 위해 DoT 프로토콜만 사용하고 있습니다. 46 | 47 | ### DNS and Internet 48 | 49 | 일시적으로 인터넷이 끊어질 수 있는 사유로 DNS가 해당 될 수 있습니다. 50 | DNS 서버는 웹 브라우저에 입력하는 웹 사이트 주소와 실제 IP 주소를 연결해주는 전화번호부와 같은 역할을 합니다. 51 | 그래서 DNS 서버의 작동이 중지하면 정상적인 인터넷 사용이 불가능해집니다. 52 | 53 | Xstl DNS는 안정적인 서비스를 제공하기 위해 최선을 다하고 있습니다. 54 | 하지만 여건적으로 Google이나 CloudFlare에 비해 낮은 안정성을 가집니다. 55 | 인터넷 연결이 조금이라도 끊겨 큰 손해를 볼 수 있는 기기에서는 적용을 피해주십시오. 56 | 57 | ### Why 58 | 59 | 이미 AdGuard나 서드파티 광고 차단기에서 제공하거나 그에 준하는 서비스를 사용하시는 경우 Xstl DNS는 좋은 대안이 될 수 있습니다. 60 | 61 | - AdGuard와 같은 DNS 필터링 애플리케이션이 기기 배터리나 성능에 주는 부담이 크시다 생각되시는 경우 62 | - 시스템 전역으로 기초적인 광고 차단을 적용시키고 싶으신 경우 63 | - AdGuard DNS나 여타 DNS 서비스가 한국에서 인터넷 반응 속도를 저하시킨다고 느끼시거나 속도 제한 등이 걱정되시는 경우 64 | 65 | 그 외에 저희 DNS는 로그를 남길 때 사용자의 IP를 수집하고 있지 않습니다. 66 | 모든 인스턴스는 가상 브릿지 인터페이스 뒤에서 실행되며 브릿지에서 DNS 서버로 그 어떤 사용자 정보도 전달하고 있지 않습니다. 67 | 68 | **참고** 69 | 70 | - 1750 바이트이거나 이상의 요청은 처리되지 않습니다. 71 | 72 | ### Tracking Reduction 73 | 74 | 현재 DNS 서비스에 개인정보 보호 대책은 TR 형태로 적용되고 있습니다. 75 | 76 | - [Rohan Kumar님이 작성한 두 가지 종류의 개인정보 보호 (영문)](https://seirdy.one/posts/2022/06/25/two-types-of-privacy/) 77 | 78 | **참고** 79 | 80 | - 전체 필터는 1시간에 한 번 업데이트됩니다. 81 | 82 | #### Blocklist 83 | 84 | 서비스에 등록된 차단 목록에 관해서는 [blocklist.txt](/blocklist.txt)를 확인해주십시오. 85 | 86 | ```bash 87 | # priority 88 | "https://get.dns.seia.io/blocklist.txt" 89 | "https://raw.githubusercontent.com/yous/YousList/master/hosts.txt" 90 | 91 | # suspicious 92 | "https://raw.githubusercontent.com/PolishFiltersTeam/KADhosts/master/KADhosts.txt" 93 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts" 94 | "https://v.firebog.net/hosts/static/w3kbl.txt" 95 | "https://raw.githubusercontent.com/matomo-org/referrer-spam-blacklist/master/spammers.txt" 96 | "https://someonewhocares.org/hosts/zero/hosts" 97 | "https://raw.githubusercontent.com/VeleSila/yhosts/master/hosts" 98 | "https://winhelp2002.mvps.org/hosts.txt" 99 | "https://v.firebog.net/hosts/neohostsbasic.txt" 100 | "https://raw.githubusercontent.com/RooneyMcNibNug/pihole-stuff/master/SNAFU.txt" 101 | "https://paulgb.github.io/BarbBlock/blacklists/hosts-file.txt" 102 | 103 | # advertising 104 | "https://adaway.org/hosts.txt" 105 | "https://v.firebog.net/hosts/AdguardDNS.txt" 106 | "https://v.firebog.net/hosts/Admiral.txt" 107 | "https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt" 108 | "https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt" 109 | "https://v.firebog.net/hosts/Easylist.txt" 110 | "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext" 111 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts" 112 | "https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts" 113 | "https://raw.githubusercontent.com/jdlingyu/ad-wars/master/hosts" 114 | 115 | # tracking 116 | "https://v.firebog.net/hosts/Easyprivacy.txt" 117 | "https://v.firebog.net/hosts/Prigent-Ads.txt" 118 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.2o7Net/hosts" 119 | "https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt" 120 | "https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt" 121 | "https://hostfiles.frogeye.fr/multiparty-trackers-hosts.txt" 122 | "https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt" 123 | "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/android-tracking.txt" 124 | "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt" 125 | "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/AmazonFireTV.txt" 126 | "https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt" 127 | 128 | # malicious 129 | "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareHosts.txt" 130 | "https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt" 131 | "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt" 132 | "https://v.firebog.net/hosts/Prigent-Crypto.txt" 133 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Risk/hosts" 134 | "https://bitbucket.org/ethanr/dns-blacklists/raw/8575c9f96e5b4a1308f2f12394abd86d0927a4a0/bad_lists/Mandiant_APT1_Report_Appendix_D.txt" 135 | "https://phishing.army/download/phishing_army_blocklist_extended.txt" 136 | "https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt" 137 | "https://raw.githubusercontent.com/Spam404/lists/master/main-blacklist.txt" 138 | "https://raw.githubusercontent.com/Te-k/stalkerware-indicators/master/generated/hosts" 139 | "https://urlhaus.abuse.ch/downloads/hostfile/" 140 | 141 | # other 142 | "https://zerodot1.gitlab.io/CoinBlockerLists/hosts_browser" 143 | ``` 144 | 145 | #### Allowlist 146 | 147 | 아래 항목은 자주 사용되는 앱에서 잘못 차단되어 임의로 화이트리스트에 등록되었습니다. 148 | 149 | - t.ly 150 | - bit.ly 151 | - t.co 152 | - ow.ly 153 | - s.shopify.com 154 | - cdn.optimizely.com 155 | - tinyurl.com 156 | - github.com 157 | - algolia.com 158 | - aluigi.altervista.org 159 | - media.discordapp.net 160 | - git.zx2c4.com 161 | 162 | #### Exceptions 163 | 164 | 아래 항목은 CloudFlare DNS (1.1.1.1)에서 발생하는 문제를 피하기 위해 Google DNS (8.8.8.8)에서 가져옵니다. 165 | 166 | - hyundaicard.com 167 | -------------------------------------------------------------------------------- /packages/controller/src/subscriptions.ts: -------------------------------------------------------------------------------- 1 | import {type FilterListHook, type FilterList} from './fetcher/index.js'; 2 | import {useCache} from './fetcher/features/useCache.js'; 3 | 4 | const defaultHooks = [ 5 | useCache, 6 | ]; 7 | 8 | export const useDefaultHooks = (hooks: FilterListHook[] = []) => ([ 9 | ...defaultHooks, 10 | ...hooks, 11 | ]); 12 | 13 | export const subscriptions: FilterList[] = [ 14 | // Priority 15 | { 16 | name: 'yous-youslist', 17 | url: 'https://raw.githubusercontent.com/yous/YousList/master/hosts.txt', 18 | hooks: useDefaultHooks(), 19 | }, 20 | 21 | // Suspicious 22 | { 23 | name: 'polishfiltersteam-kadhosts', 24 | url: 'https://raw.githubusercontent.com/PolishFiltersTeam/KADhosts/master/KADhosts.txt', 25 | hooks: useDefaultHooks(), 26 | }, 27 | { 28 | name: 'firebog-w3kbl', 29 | url: 'https://v.firebog.net/hosts/static/w3kbl.txt', 30 | hooks: useDefaultHooks(), 31 | }, 32 | { 33 | name: 'firebog-neohostsbasic', 34 | url: 'https://v.firebog.net/hosts/neohostsbasic.txt', 35 | hooks: useDefaultHooks(), 36 | }, 37 | { 38 | name: 'matomo-org-referrer-spam-blacklist', 39 | url: 'https://raw.githubusercontent.com/matomo-org/referrer-spam-blacklist/master/spammers.txt', 40 | hooks: useDefaultHooks(), 41 | }, 42 | { 43 | name: 'someonewhocares-zero', 44 | url: 'https://someonewhocares.org/hosts/zero/hosts', 45 | hooks: useDefaultHooks(), 46 | }, 47 | { 48 | name: 'velesila-yhosts', 49 | url: 'https://raw.githubusercontent.com/VeleSila/yhosts/master/hosts', 50 | hooks: useDefaultHooks(), 51 | }, 52 | { 53 | name: 'mvps-winhelp2002-hosts', 54 | url: 'https://winhelp2002.mvps.org/hosts.txt', 55 | hooks: useDefaultHooks(), 56 | }, 57 | { 58 | name: 'rooneymcnibnug-snafu', 59 | url: 'https://raw.githubusercontent.com/RooneyMcNibNug/pihole-stuff/master/SNAFU.txt', 60 | hooks: useDefaultHooks(), 61 | }, 62 | 63 | // Advertising 64 | { 65 | name: 'adaway-hosts', 66 | url: 'https://adaway.org/hosts.txt', 67 | hooks: useDefaultHooks(), 68 | }, 69 | { 70 | name: 'firebog-adguarddns', 71 | url: 'https://v.firebog.net/hosts/AdguardDNS.txt', 72 | hooks: useDefaultHooks(), 73 | }, 74 | { 75 | name: 'firebog-admiral', 76 | url: 'https://v.firebog.net/hosts/Admiral.txt', 77 | hooks: useDefaultHooks(), 78 | }, 79 | { 80 | name: 'anudeepnd-blacklist', 81 | url: 'https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt', 82 | hooks: useDefaultHooks(), 83 | }, 84 | { 85 | name: 'disconnect-simplead', 86 | url: 'https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt', 87 | hooks: useDefaultHooks(), 88 | }, 89 | { 90 | name: 'pgl-adservers', 91 | url: 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext', 92 | hooks: useDefaultHooks(), 93 | }, 94 | { 95 | name: 'fademind-uncheckyads', 96 | url: 'https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts', 97 | hooks: useDefaultHooks(), 98 | }, 99 | { 100 | name: 'bigdargon-hostvn', 101 | url: 'https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts', 102 | hooks: useDefaultHooks(), 103 | }, 104 | { 105 | name: 'jdlingyu-ad-wars', 106 | url: 'https://raw.githubusercontent.com/jdlingyu/ad-wars/master/hosts', 107 | hooks: useDefaultHooks(), 108 | }, 109 | 110 | // Tracking 111 | { 112 | name: 'firebog-easyprivacy', 113 | url: 'https://v.firebog.net/hosts/Easyprivacy.txt', 114 | hooks: useDefaultHooks(), 115 | }, 116 | { 117 | name: 'firebog-prigent-ads', 118 | url: 'https://v.firebog.net/hosts/Prigent-Ads.txt', 119 | hooks: useDefaultHooks(), 120 | }, 121 | { 122 | name: 'windowsspyblocker-spy', 123 | url: 'https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt', 124 | hooks: useDefaultHooks(), 125 | }, 126 | { 127 | name: 'frogeye-1ptrackers', 128 | url: 'https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt', 129 | hooks: useDefaultHooks(), 130 | }, 131 | { 132 | name: 'frogeye-3ptrackers', 133 | url: 'https://hostfiles.frogeye.fr/multiparty-trackers-hosts.txt', 134 | hooks: useDefaultHooks(), 135 | }, 136 | { 137 | name: 'dan-adsandtracking', 138 | url: 'https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt', 139 | hooks: useDefaultHooks(), 140 | }, 141 | { 142 | name: 'perflyst-piholeblocklist-androidtracking', 143 | url: 'https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/android-tracking.txt', 144 | hooks: useDefaultHooks(), 145 | }, 146 | { 147 | name: 'perflyst-piholeblocklist-smarttv', 148 | url: 'https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt', 149 | hooks: useDefaultHooks(), 150 | }, 151 | { 152 | name: 'perflyst-piholeblocklist-amazonfiretv', 153 | url: 'https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/AmazonFireTV.txt', 154 | hooks: useDefaultHooks(), 155 | }, 156 | { 157 | name: 'quidsup-notrack', 158 | url: 'https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt', 159 | hooks: useDefaultHooks(), 160 | }, 161 | 162 | // Malicious 163 | { 164 | name: 'dandelionsprout-adfilt', 165 | url: 'https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareHosts.txt', 166 | hooks: useDefaultHooks(), 167 | }, 168 | { 169 | name: 'digitalside-threats', 170 | url: 'https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt', 171 | hooks: useDefaultHooks(), 172 | }, 173 | { 174 | name: 'disconnect-malvertising', 175 | url: 'https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt', 176 | hooks: useDefaultHooks(), 177 | }, 178 | { 179 | name: 'firebog-prigentcrypto', 180 | url: 'https://v.firebog.net/hosts/Prigent-Crypto.txt', 181 | hooks: useDefaultHooks(), 182 | }, 183 | { 184 | name: 'fademind-risk', 185 | url: 'https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Risk/hosts', 186 | hooks: useDefaultHooks(), 187 | }, 188 | { 189 | name: 'ethanr-badlists', 190 | url: 'https://bitbucket.org/ethanr/dns-blacklists/raw/8575c9f96e5b4a1308f2f12394abd86d0927a4a0/bad_lists/Mandiant_APT1_Report_Appendix_D.txt', 191 | hooks: useDefaultHooks(), 192 | }, 193 | { 194 | name: 'phishingarmy-extended', 195 | url: 'https://phishing.army/download/phishing_army_blocklist_extended.txt', 196 | hooks: useDefaultHooks(), 197 | }, 198 | { 199 | name: 'quidsup-notrack-malware', 200 | url: 'https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt', 201 | hooks: useDefaultHooks(), 202 | }, 203 | { 204 | name: 'spam404', 205 | url: 'https://raw.githubusercontent.com/Spam404/lists/master/main-blacklist.txt', 206 | hooks: useDefaultHooks(), 207 | }, 208 | { 209 | name: 'tek-stalkerware-indicators', 210 | url: 'https://raw.githubusercontent.com/Te-k/stalkerware-indicators/master/generated/hosts', 211 | hooks: useDefaultHooks(), 212 | }, 213 | { 214 | name: 'urlhaus', 215 | url: 'https://urlhaus.abuse.ch/downloads/hostfile/', 216 | hooks: useDefaultHooks(), 217 | }, 218 | 219 | // Others 220 | { 221 | name: 'zerodot-coinblockers', 222 | url: 'https://zerodot1.gitlab.io/CoinBlockerLists/hosts_browser', 223 | hooks: useDefaultHooks(), 224 | }, 225 | ]; 226 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Xstl encrypted DNS 2 | 3 | [한국어](/README.ko.md) 4 | 5 | Xstl DNS is public DNS service enhances the privacy level with minimal overhead in the common use. [(Updates)](/updates/index.md) 6 | 7 | | Type | Address | Upstream | Host | 8 | |---------------------|-----------------------------|--------------------------------------|------------------------------------| 9 | | Do53, DoT, DoH (h3) | tls://dns.seia.io | CloudFlare DNS | SK Broadband, South Korea | 10 | | Do53, DoT, DoH (h3) | tls://secondary.dns.seia.io | CloudFlare DNS | Oracle Cloud Platform, South Korea | 11 | 12 | **Features** 13 | 14 | - Block hosts serves ads or trackers 15 | - Use CloudFlare as upstream DNS 16 | - DO NOT log any personal information by logging policy 17 | 18 | **Installation** 19 | 20 | > If you're using the profile distributed before Oct 2023, you should update your profile by removing and reinstalling. 21 | 22 | - Apple Devices (iOS 14 or higher) 23 | - DoT: [https://get.dns.seia.io/config/xstl-tls.mobileconfig](https://get.dns.seia.io/config/xstl-tls.mobileconfig) 24 | - DoH: [https://get.dns.seia.io/config/xstl-https.mobileconfig](https://get.dns.seia.io/config/xstl-https.mobileconfig) 25 | - DoP (unencrypted DNS for global setting): Switch via `sudo networksetup -setdnsservers Wi-Fi 116.121.57.111 140.238.14.191` and `sudo networksetup -setdnsservers Wi-Fi empty` 26 | - Android Devices 27 | - Set privacy DNS value to `dns.seia.io` in Network Settings. 28 | - Other devices (or unencrypted DNS) 29 | - Set primary DNS value to `116.121.57.111`. 30 | - Set secondary DNS value to `140.238.14.191`. 31 | 32 | You can connect all servers via `tls://dns.seia.io` or `https://dns.seia.io`. 33 | 34 | ## Notes 35 | 36 | There are things that you need to know before applying the DNS to your device. 37 | 38 | ### Encrypted DNS 39 | 40 | Encrypted DNS hides its queries from Internet Service Providers by wrapping the packet using TLS tunnel or TLS-like protocol. 41 | There are two ways to provide encrypted DNS typically. 42 | 43 | > DoT(DNS over TLS, port 853) and DoH(DNS over Https, port 443), and both works when the connection established over valid certificate. 44 | 45 | I provide DoT service to minimize the overhead. 46 | 47 | ### DNS and Internet 48 | 49 | DNS can be the failure point when internet disconnects temporarilly. 50 | DNS server works as a phone book by linking the website address and real IP address. 51 | So the outage of DNS server make the use of Internet unable. 52 | 53 | ### Why 54 | 55 | Xstl DNS can be a better alternative if you're already using the service from AdGuard or third-party ad blockers. 56 | 57 | - If you concern the extra bettery consumption while using the DNS filtering applications like AdGuard. 58 | - If you want to apply system-wide ad blocking. 59 | - If you feel the AdGuard DNS and typical DNS services are slow in Korea or you concern about being rate limited 60 | 61 | Our DNS doesn't collect users' IP address when logging. 62 | All instances are running behind of virtual bridge interface and the bridge is not forwarding any user information. 63 | 64 | **Comments** 65 | 66 | - Request larger than or equal to 1750 bytes will be dropped. 67 | 68 | ### Tracking Reduction 69 | 70 | The type of privacy applied on this DNS service is TR. 71 | 72 | - [Two types of privacy by Rohan Kumar](https://seirdy.one/posts/2022/06/25/two-types-of-privacy/) 73 | 74 | **Comments** 75 | 76 | - Every filters are refreshed every 1 hour. 77 | 78 | #### Blocklist 79 | 80 | See [blocklist.txt](/blocklist.txt) for blocklist file applied to my serivce. 81 | 82 | ```bash 83 | # priority 84 | "https://get.dns.seia.io/blocklist.txt" 85 | "https://raw.githubusercontent.com/yous/YousList/master/hosts.txt" 86 | 87 | # suspicious 88 | "https://raw.githubusercontent.com/PolishFiltersTeam/KADhosts/master/KADhosts.txt" 89 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts" 90 | "https://v.firebog.net/hosts/static/w3kbl.txt" 91 | "https://raw.githubusercontent.com/matomo-org/referrer-spam-blacklist/master/spammers.txt" 92 | "https://someonewhocares.org/hosts/zero/hosts" 93 | "https://raw.githubusercontent.com/VeleSila/yhosts/master/hosts" 94 | "https://winhelp2002.mvps.org/hosts.txt" 95 | "https://v.firebog.net/hosts/neohostsbasic.txt" 96 | "https://raw.githubusercontent.com/RooneyMcNibNug/pihole-stuff/master/SNAFU.txt" 97 | "https://paulgb.github.io/BarbBlock/blacklists/hosts-file.txt" 98 | 99 | # advertising 100 | "https://adaway.org/hosts.txt" 101 | "https://v.firebog.net/hosts/AdguardDNS.txt" 102 | "https://v.firebog.net/hosts/Admiral.txt" 103 | "https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt" 104 | "https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt" 105 | "https://v.firebog.net/hosts/Easylist.txt" 106 | "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext" 107 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts" 108 | "https://raw.githubusercontent.com/bigdargon/hostsVN/master/hosts" 109 | "https://raw.githubusercontent.com/jdlingyu/ad-wars/master/hosts" 110 | 111 | # tracking 112 | "https://v.firebog.net/hosts/Easyprivacy.txt" 113 | "https://v.firebog.net/hosts/Prigent-Ads.txt" 114 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.2o7Net/hosts" 115 | "https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt" 116 | "https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt" 117 | "https://hostfiles.frogeye.fr/multiparty-trackers-hosts.txt" 118 | "https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt" 119 | "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/android-tracking.txt" 120 | "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt" 121 | "https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/AmazonFireTV.txt" 122 | "https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt" 123 | 124 | # malicious 125 | "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareHosts.txt" 126 | "https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt" 127 | "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt" 128 | "https://v.firebog.net/hosts/Prigent-Crypto.txt" 129 | "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Risk/hosts" 130 | "https://bitbucket.org/ethanr/dns-blacklists/raw/8575c9f96e5b4a1308f2f12394abd86d0927a4a0/bad_lists/Mandiant_APT1_Report_Appendix_D.txt" 131 | "https://phishing.army/download/phishing_army_blocklist_extended.txt" 132 | "https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt" 133 | "https://raw.githubusercontent.com/Spam404/lists/master/main-blacklist.txt" 134 | "https://raw.githubusercontent.com/Te-k/stalkerware-indicators/master/generated/hosts" 135 | "https://urlhaus.abuse.ch/downloads/hostfile/" 136 | 137 | # other 138 | "https://zerodot1.gitlab.io/CoinBlockerLists/hosts_browser" 139 | ``` 140 | 141 | #### Allowlist 142 | 143 | Some domain names are allowed forcibly by default to avoid incorrect blocking: 144 | 145 | - t.ly 146 | - bit.ly 147 | - t.co 148 | - ow.ly 149 | - s.shopify.com 150 | - cdn.optimizely.com 151 | - tinyurl.com 152 | - github.com 153 | - algolia.com 154 | - aluigi.altervista.org 155 | - media.discordapp.net 156 | - git.zx2c4.com 157 | 158 | #### Exceptions 159 | 160 | Some domain names are loaded from Google DNS (8.8.8.8) to avoid service breakage with CloudFlare DNS (1.1.1.1): 161 | 162 | - hyundaicard.com 163 | --------------------------------------------------------------------------------