27 มิถุนายน 2569

Mikrotik container : zerotier router

/interface bridge
add name=containers
/ip address
add address=172.17.0.1/24 interface=containers
/interface veth
add address=172.17.0.2/24 gateway=172.17.0.1 name=veth-zerotier
/interface bridge port
add bridge=containers interface=veth-zerotier

/container envs
add list=zerotier key=ZEROTIER_ONE_GATEWAY_MODE value=both
add list=zerotier key=ZEROTIER_ONE_LOCAL_PHYS value=veth-zerotier
add list=zerotier key=ZEROTIER_ONE_NETWORK_IDS value=0d66ea7479dd0d63
add list=zerotier key=ZEROTIER_ONE_USE_IPTABLES_NFT value=true

/container mounts
add list=zerotier src=/zerotier-lib dst=/var/lib/zerotier-one

/container
add interface=veth-zerotier \
    name=zerotier:router \
    remote-image=ghcr.io/zyclonite/zerotier:router \
    root-dir=/disk1/zerotier \
    envlists=zerotier \
    mountlists=zerotier \
    logging=yes\
    start-on-boot=yes


Ref : https://github.com/zyclonite/zerotier-docker

16 มิถุนายน 2569

dig kdig doggo

DoT
dig @dns.google example.com +tls (+tls-ca)
kdig @dns.google example.com +tls (+tls-ca) (-d)
doggo @tls://dns.google example.com

DoH
dig @dns.google example.com +https (+tls-ca)
kdig @dns.google example.com +https (+tls-ca) (-d)
doggo @https://dns.google/dns-query example.com

dig ไม่มีการตรวจสอบ TLS certificate โดยค่าเริ่มต้น ต้องใช้ +tls-ca 
kdig ไม่มีการตรวจสอบ TLS certificate โดยค่าเริ่มต้น ต้องใช้ +tls-ca และใช้ -d เพื่อแสดงข้อมูล TLS certificate 
doggo มีการตรวจสอบ TLS Certificate โดยค่าเริ่มต้น (Default) อยู่แล้ว 

29 พฤษภาคม 2569

Mikrotik container : PowerDNS DNSdist

/interface veth
add address=10.0.0.20/24 gateway=10.0.0.1 name=veth-dnsdist

/interface bridge port
add bridge=br-lan interface=veth-dnsdist

/file
add name="/dnsdist-conf/dnsdist.conf" \
contents="setLocal('0.0.0.0:53')\n\
\n\
setACL(\"0.0.0.0/0\")\n\
\n\
webserver(\"0.0.0.0:8083\")\n\
setWebserverConfig({\n\
\tpassword=hashPassword(\"admin\"),\n\
\tapiKey=hashPassword(\"admin\"),\n\
\tacl=\"0.0.0.0/0\"\n\
})\n\
\n\
newServer({\n\
\tname=\"cloudflare-DoT\",\n\
\taddress=\"1.1.1.1:853\",\n\
\ttls=\"openssl\",\n\
\tsubjectName=\"1.1.1.1\",\n\
\tvalidateCertificates=true,\n\
\tpool=\"main-pool\",\n\
\n\
\thealthCheckMode = \"lazy\",\n\
\tcheckInterval = 30,\n\
\tmaxCheckFailures = 3,\n\
\trise = 2,\n\
\tcheckName = \"cloudflare-dns.com\"\n\
})\n\
\n\
newServer({\n\
\tname=\"google-DoT\",\n\
\taddress=\"8.8.8.8:853\",\n\
\ttls=\"openssl\",\n\
\tsubjectName=\"8.8.8.8\",\n\
\tvalidateCertificates=true,\n\
\tpool=\"main-pool\",\n\
\n\
\thealthCheckMode = \"lazy\",\n\
\tcheckInterval = 30,\n\
\tmaxCheckFailures = 3,\n\
\trise = 2,\n\
\tcheckName = \"dns.google\"\n\
})\n\
\n\
newServer({\n\
\tname=\"quad9-DoT\",\n\
\taddress=\"9.9.9.9:853\",\n\
\ttls=\"openssl\",\n\
\tsubjectName=\"9.9.9.9\",\n\
\tvalidateCertificates=true,\n\
\tpool=\"main-pool\",\n\
\n\
\thealthCheckMode = \"lazy\",\n\
\tcheckInterval = 30,\n\
\tmaxCheckFailures = 3,\n\
\trise = 2,\n\
\tcheckName = \"dns.quad9.com\"\n\
})\n\
\n\
newServer({\n\
\tname=\"cloudflare-DoH\",\n\
\taddress=\"1.1.1.1:443\",\n\
\ttls=\"openssl\",\n\
\tsubjectName=\"1.1.1.1\",\n\
\tdohPath=\"/dns-query\",\n\
\tvalidateCertificates=true,\n\
\tpool=\"main-pool\",\n\
\n\
\thealthCheckMode = \"lazy\",\n\
\tcheckInterval = 30,\n\
\tmaxCheckFailures = 3,\n\
\trise = 2,\n\
\tcheckName = \"cloudflare-dns.com\"\n\
})\n\
\n\
newServer({\n\
\tname=\"google-DoH\",\n\
\taddress=\"8.8.8.8:443\",\n\
\ttls=\"openssl\",\n\
\tsubjectName=\"8.8.8.8\",\n\
\tdohPath=\"/dns-query\",\n\
\tvalidateCertificates=true,\n\
\tpool=\"main-pool\",\n\
\n\
\thealthCheckMode = \"lazy\",\n\
\tcheckInterval = 30,\n\
\tmaxCheckFailures = 3,\n\
\trise = 2,\n\
\tcheckName = \"dns.google\"\n\
})\n\
\n\
newServer({\n\
\tname=\"quad9-DoH\",\n\
\taddress=\"9.9.9.9:443\",\n\
\ttls=\"openssl\",\n\
\tsubjectName=\"9.9.9.9\",\n\
\tdohPath=\"/dns-query\",\n\
\tvalidateCertificates=true,\n\
\tpool=\"main-pool\",\n\
\n\
\thealthCheckMode = \"lazy\",\n\
\tcheckInterval = 30,\n\
\tmaxCheckFailures = 3,\n\
\trise = 2,\n\
\tcheckName = \"dns.quad9.com\"\n\
})\n\
\n\
setServerPolicy(leastOutstanding)\n\
\n\
global_cache = newPacketCache(10000)\n\
getPool(\"main-pool\"):setCache(global_cache)\n\
\n\
addAction(AllRule(), PoolAction(\"main-pool\"))\n"

/container/mounts
add list=dnsdist-conf src="/dnsdist-conf/dnsdist.conf" dst="/etc/dnsdist/dnsdist.conf"

/container
add name=dnsdist \
interface=veth-dnsdist \
remote-image="registry-1.docker.io/powerdns/dnsdist-19:latest" \
mountlists=dnsdist-conf \
root-dir="/dnsdist-root" \
user=0 \
start-on-boot=yes \
logging=yes

Mikrotik container : AdGuard DNS Proxy

/interface veth
add address=10.0.0.20/24 gateway=10.0.0.1 name=veth-dnsproxy

/interface bridge port
add bridge=br-lan interface=veth-dnsproxy

/container
add name=dnsproxy \
interface=veth-dnsproxy \
remote-image=registry-1.docker.io/adguard/dnsproxy:latest \
root-dir=/dnsproxy \
cmd="--upstream-mode parallel \
-u h3://1.1.1.1/dns-query \
-u h3://8.8.8.8/dns-query \
-u h3://9.9.9.9/dns-query \
-u tls://1.1.1.1 \
-u tls://8.8.8.8 \
-u tls://9.9.9.9 \
-u quic://9.9.9.9" \
start-on-boot=yes \
logging=yes

02 มีนาคม 2569

Crowdsec command

cscli decisions list
ดูรายชื่อ IP ที่โดนแบนอยู่ทั้งหมด (Local + CAPI)

cscli decisions list --origin CAPI
cscli decisions list --origin CAPI | wc -l 
ดูเฉพาะ IP มหาโจรจากส่วนกลาง (Community List)

cscli decisions add --ip 1.2.3.4 --duration 1h
สั่งแบน IP 1.2.3.4 เป็นเวลา 1 ชั่วโมง

cscli decisions delete --ip 1.2.3.4
ปลดแบน IP 1.2.3.4 (Whitelist คืนมา)

cscli decisions delete --all
ล้างรายการแบนทั้งหมด (ใช้ตอนเผลอบล็อกตัวเองยกแผง)

cscli bouncers list
เช็คว่า Traefik Bouncer ยัง Online (✔️) อยู่ไหม

cscli bouncers add <name>
สร้าง API Key ชุดใหม่ (เอาไปใส่ใน Traefik Middleware)

cscli bouncers delete <name>
ลบ Bouncer ที่ไม่ได้ใช้งานแล้ว

cscli capi register
ลงทะเบียนเครื่องนี้กับส่วนกลาง (ทำครั้งแรกครั้งเดียว)

cscli capi status
เพื่อเช็คการเชื่อมต่อส่วนกลาง

cscli metrics
สำคัญมาก! ดูว่า CrowdSec อ่าน Log ไปกี่บรรทัด และบล็อกไปกี่ครั้ง

cscli alerts list
ดูเหตุการณ์ที่ CrowdSec ตรวจพบ (ใคร ทำอะไร ที่ไหน)

cscli alerts inspect <ID>
ดูรายละเอียดเชิงลึกของ Alert นั้นๆ (เช่น Log บรรทัดที่เป็นปัญหา)

cscli hub update
อัปเดตรายชื่อ Scenario ล่าสุด (เหมือน Update Antivirus)

cscli hub upgrade
สังอัปเกรด Scenario ที่ติดตั้งไว้ให้เป็นเวอร์ชันใหม่

cscli collections list
"ดูว่าเราติดตั้งการป้องกันอะไรไว้บ้าง (Traefik, HTTP, etc.)"

cscli collections install <name>
ติดตั้งการป้องกันเพิ่ม (เช่น crowdsecurity/wordpress)