
School caste, huh?

what is the tagline?

Upgrade package บน raspberrypi วันนี้มี package ที่ต้อง update แต่มีปัญหาอยู่ เจ้า package อันนั้นก็คือ
tzdata 2024a-0+deb11u1
ซึ่ง upgrade ไปแล้วจะได้ผลประมาณนี้
Fetched 13.2 MB in 1min 14s (180 kB/s) Reading package lists... Done Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done The following packages will be upgraded: tzdata 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/304 kB of archives. After this operation, 931 kB of additional disk space will be used. apt-listchanges: Reading changelogs... Preconfiguring packages ... (Reading database ... 52286 files and directories currently installed.) Preparing to unpack .../tzdata_2024a-0+deb11u1_all.deb ... Unpacking tzdata (2024a-0+deb11u1) over (2023c-5) ... dpkg: error processing archive /var/cache/apt/archives/tzdata_2024a-0+deb11u1_all.deb (--unpack): unable to open '/usr/share/zoneinfo/posix/Africa/Abidjan.dpkg-new': No such file or directory Errors were encountered while processing: /var/cache/apt/archives/tzdata_2024a-0+deb11u1_all.deb needrestart is being skipped since dpkg has failed E: Sub-process /usr/bin/dpkg returned an error code (1)
ตรวจสอบดูแล้ว คิดว่าย้อนกลับไปใช้ตัวเก่าจะดีกว่า
cj@pi01:~ $ apt-cache policy tzdata
tzdata:
Installed: 2023c-5
Candidate: 2024a-0+deb11u1
Version table:
2024a-0+deb11u1 500
500 http://ftp.jaist.ac.jp/raspbian bullseye/main armhf Packages
*** 2023c-5 500
500 http://ftp.jaist.ac.jp/raspbian bookworm/main armhf Packages
100 /var/lib/dpkg/status
ติดตั้ง version 2023c-5 โดยการใช้คำสั่ง
sudo apt install tzdata=2023c-5
จบ
มี application อยู่ 2 ตัวที่ใช้สำหรับ trace ว่า โปรแกรมตัวนึงมันติดต่อผ่าน network ไปที่ไหนบ้าง
ทั้งสองตัวมีเป็น package ให้ติดตั้งแล้ใช้งานได้บน debian/ubuntu และเดาว่าน่าจะมีบน Linux distro ทั่วๆไปทั้งหมด
sysdig — ยังไม่เคยลองใช้งานจริงจังมาก่อน แต่ดูแล้ววน่าสนใจ เพราะเขียนโปรแกรมร่วมเข้าไปใช้งานในการวิเคราะห์ข้อมูลได้ (แต่ยังไม่ได้ลอง)
ตัวอย่าง จะใช้ sysdig สำหรับ trace event ที่เกิดขึ้น กับโปรแกรม ping
เราอยากจะรู้ว่า มี event อะไรเกิดขึ้นบ้างถ้าเราใช้คำสั่ง
ping -c 3 8.8.8.8
ทำได้ประมาณนี้
จาก terminal หนึ่ง ให้ run คำสั่ง
sudo sysdig proc.name='ping'
และ อีก terminal หนึ่งให้ไป run คำสั่ง
ping -c 3 8.8.8.8
ที่ terminal แรกก็จะเห็นผลลัพธ์ประมาณนี้
98006 10:06:55.851978155 3 ping (2145859.2145859) < execve res=0 exe=ping args=-c.3.8.8.8.8. tid=2145859(ping) pid=2145859(ping) ptid=2114748(bash) cwd= fdlimit=1024 pgft_maj=0 pgft_min=31 vm_size=460 vm_rss=4 vm_swap=0 comm=ping cgroups=cpuset=/user.slice.cpu=/user.slice/user-1000.slice/user@1000.service/app.slic... env=SHELL=/bin/bash.SESSION_MANAGER=local/trantor:@/tmp/.ICE-unix/16757,unix/tran... tty=34829 pgid=2145859(ping) loginuid=1000 flags=0
98007 10:06:55.852042985 3 ping (2145859.2145859) > access mode=0(F_OK)
98008 10:06:55.852070023 3 ping (2145859.2145859) < access res=-2(ENOENT) name=/etc/suid-debug
98009 10:06:55.852087854 3 ping (2145859.2145859) > brk addr=0
...
ถ้าจะดูผลเฉพาะการติดต่อกับ network (สำหรับ ping) ก็ใช้คำสั่งนี้
sudo sysdig proc.name='ping' | grep -E 'sendto|recvmsg'
ลองดู blog ตัวนี้
https://sysdig.com/blog/sysdig-tracers/
Tag line ของ blog ก็คือ “open source transaction tracing meets htop and strace” ซึ่งจะชี้ไปที่ strace
strace — system trace เทียบกับ sysdig ที่เป็นการ trace event ที่เกิดขึ้นบนระบบทั้งหมด แล้วค่อยมา filter เลือกเอา event ที่สนใจ เช่น event ที่เกิดขึ้นจาก โปรแกรม ping ก็ใช้ proc.name=’ping’
สำหรับ strace จะใช้ในลักษณะของ wrapper ที่จะ wrap โปรแกรมนั้นและแสดง system trace ที่โปรแกรมนั้นเรียกใช้ทั้งหมด เช่น ต้องการดู trace ของ ping
ping -c 3 8.8.8.8
ก็ใช้คำสั่ง
sudo strace ping -c 3 8.8.8.8
ถ้าต้องการดูเฉพาะ network activity ก็ใช้คำสั่ง
sudo strace -e trace=network ping -c 3 8.8.8.8
ถ้าโปรแกรมที่ trace นั้นมีการ fork sub process แล้วเราต้องการ trace sub process นั้นด้วย ก็ต้องเพิ่ม option “-f” หรือ “–follow-forks”

root@debian-12:~# dns-scout
IPINFO_API_TOKEN environment variable not set.
Enter ipinfo.io API token, or press return to skip ASN:
Enter domain, IP (or 'exit' to quit):
------------------------------------
cjv6.net
Reg 🟢: PDR Ltd. d/b/a PublicDomainRegistry.com
IPs 🟢: 128.199.245.86, 2400:6180:0:d0::28d:3001
NS 🟢: ns2.cjv6.net, ns1.cjv6.net
MX ✅: turtle.cjv6.net
TXT 🟢:
v=spf1 a mx ip4:128.199.245.86 ip6:2001:19f0:5:5ca:5400:ff:fe87:9bd8 ip4:45.76.10.5 -all
SPF ✅: v=spf1 a mx ip4:128.199.245.86 ip6:2001:19f0:5:5ca:5400:ff:fe87:9bd8 ip4:45.76.10.5 -all
DMARC ✅: v=DMARC1; p=quarantine; rua=mailto:cj@cjv6.net
DKIM ✅: default._domainkey.v=DKIM1;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcz5hE2H1C9bgHmvDtt4byrDmQh10VL5
olAipQqW6zQnVHJApkJ4T/x61t/YvyFq4RpZ0w9TNg3/Ur0eO41jq/2H2G8nsKWvp3AmxMB2hyc/APC6
rwWoLUL1x01oqHoK32P6Vxby6SwWaAgmhdVgg+N/jYjPJrlIRT0HgqJtdQIDAQAB
PTR ✅: turtle.cjv6.net
Enter domain, IP (or 'exit' to quit):
------------------------------------
คำถาม หลังจาก disable DNSSEC สำหรับ domain นึงแล้ว จะใช้เวลาเท่าไหร่ ก่อนที่ สถานะของ DNSSEC สำหรับ domain นั้นๆ จะถูกยกเลิก กลายเป็น domain ที่ไม่มีการใช้งาน DNSSEC?
นี่คือผลของการตรวจสอบที่ตัว server ของ domain นั้น
root@turtle:~# rndc dnssec -status cjz.monster
dnssec-policy: default
current time: Thu Sep 28 15:54:07 2023
key: 20391 (ECDSAP256SHA256), CSK
published: yes - since Tue Jan 31 11:12:43 2023
key signing: yes - since Tue Jan 31 11:12:43 2023
zone signing: yes - since Tue Jan 31 13:17:43 2023
No rollover scheduled
- goal: omnipresent
- dnskey: omnipresent
- ds: omnipresent
- zone rrsig: omnipresent
- key rrsig: omnipresent
key: 47119 (ECDSAP256SHA256), CSK
published: no
key signing: no
zone signing: no
Key has been removed from the zone
- goal: hidden
- dnskey: hidden
- ds: unretentive
- zone rrsig: hidden
- key rrsig: hidden
โดยที่ปิด DNSSEC ที่ server ของ namecheap แล้ว

# dig +trace cjz.monster soa | grep $'RRSIG\tSOA' | awk '{ print $9,$10 }'
20231008012542 20230924002542
เท่าที่ดูแล้ว น่าจะเป็น 2023-10-08 01:25:42
คือวันที่ 8 ตุลาคม นี้นะ
Edit: 2023-09-29 17:15
อาจจะไม่ใช่
cj@turtle:~$ dig +trace cjz.monster soa | grep $’RRSIG\tSOA’ | awk ‘{ print $9,$10 }’
20231012232439 20230928222439
cj@turtle:~$ date
Fri Sep 29 05:14:18 PM +07 2023
เป็นศัพท์คำใหม่ที่ได้มาจากการอ่านการ์ตูนหรือไม่ก็ Light Novel ซึ่งจะว่าไป เป็นศัพท์ที่เห็นมาบ่อยครั้งอยู่พอสมควรล่ะ แต่จาก context ของการเห็นครั้งแรกๆ ก็จะเป็นการอ่านแบบผ่านๆ เลยเห็นเป็นว่าคำนี้คือ castle ไม่ใช่ caste
ซึ่ง context ที่ว่าก็คือ ตัวเอก (ซึ่งมักจะเป็นผู้ชาย MC — Main Character หรือ Male Main Character) บรรยายถึงตัวละครในเรื่องอีกคนหนึ่ง ซึ่งมักจะเป็น Love Interest ของตัวเอกว่า different caste — ซึ่งทำให้เข้าใจว่า สาวเจ้าน่ะเป็นเจ้าหญิงอยู่บนหอคอย (castle) ซึ่งสูงเกินเอื้อม อะไรประมาณนั้น
จนเห็นคำนี้หลายครั้งเข้า ก็ชักสงสัยแล้วละว่า คนแปลน่ะ (หรือคนที่ทำหน้าที่ type setting) น่ะ ไม่ได้พิมพ์ผิดโดยการทำตัว l หายไป 1 ตัวหรอก แต่เป็นเราคนอ่านเองนี้แหละ ที่เข้าใจผิดมาตั้งแต่ตอนแรก
ก็เลยต้อง google search หา meaning of caste ดู
ก็ได้ข้อสรุปว่า ข้าพเจ้านี้น่ะ ไม่ใช่แมว แต่โง่เอง
คำนี้แปลว่า ชนชั้น หรือ วรรณะ
ติดตั้ง Debian Bookworm ใหม่ วันนี้บน VPS ของ cloudcone แล้วเจอว่า คำสั่ง ping มีปัญหาถ้าใช้งานจาก ผูัใช้ธรรมดาที่ไม่ใช่ root โดยเจอ
cj@cc1:~$ ping www.google.com
2023-09-07 on cc1
ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?
เอาล่ะ มีปัญหาเรื่อง capability ล่ะ จะ set มันยังไง ยังไม่อยากแก้ปัญหาด้วย setuid root
Search google ก็ไปเจอ
https://unix.stackexchange.com/questions/592911/how-does-ping-work-on-fedora-without-setuid-and-capabilities
คำตอบที่น่าสนใจคือเรื่องของ ping group range ใน sysctl ซึ่งก็ไม่ตรงกับ capability โดยตรงสักเท่าไหร่ ลองหาดูจาก sysctl -a | grep ping_group_range ก็เจอเฉพาะ ipv4 ไม่มีของ ipv6 ค่าตั้งต้นเป็น 1 0
root@cc1:/home/cj# sysctl -a | grep net.ipv4.ping_group_range
net.ipv4.ping_group_range = 1 0
ซึ่งเป็น range เริ่มต้นที่ 1 และจบที่ 0
ซึ่งถ้าเป็นตามนี้จริงๆก็คือ ไม่มีใครใช้งานได้เลยแม้กระทั่ง root แต่จริงๆไม่ใช่ เพราะทดลองใช้ root แล้วก็สามารถ ping ได้ ไม่มีปัญหา
แต่เพื่อจะให้มันใช้งานได้ก่อน เพราะ cloudcone agent มันต้องการฟังก์ชันส่วนนี้ในการ monitor ตัว server อยู่ก็เลยไปเพิ่มไฟล์ 999-ping.conf ใน /etc/sysctl.d
echo “net.ipv4.ping_group_range=0 4294967295” > /etc/sysctl.d/999-ping.conf
ตามตัวอย่างใน stackexchange ซึ่งไม่ work ต้องเปลี่ยนค่า group ตัวหลังเป็น 65535 ถึงจะใช้งานได้
root@cc1:/home/cj# sysctl -p /etc/sysctl.d/999-ping.conf
sysctl: setting key “net.ipv4.ping_group_range”: Invalid argumentroot@cc1:/home/cj# cat /etc/sysctl.d/999-ping.conf
net.ipv4.ping_group_range=0 65535root@cc1:/etc/sysctl.d# sysctl -p /etc/sysctl.d/999-ping.conf
net.ipv4.ping_group_range = 0 65535
จาก bullseye เป็น bookworm
การ upgrade desktop ที่ใช้อยู่ ซึ่งประกอบไปด้วย notebook 2-3 เครื่อง ดูเหมือนว่าจะผ่านไปได้ด้วยดีจนน่าแปลกใจ ไม่มีอะไรผิดปกติ application ที่ใช้งานอยู่ ก็ใช้งานได้ทั้งหมด
ตัว Gnome desktop เปลี่ยนตำแหน่งของ Icon ที่ใช้ start app จากด้านซ้ายของ screen มาเป็นด้านล่าง ซึ่งทำให้การเคลื่อนของ mouse ไปเปิด app เปลี่ยนไปนิดหน่อย แต่อย่างอื่นก็ดูไม่ต่าง ในแง่ของการใช้งาน
ปัญหาเริ่มเกิด เมื่อต้องไป update ตัว server ซึ่งเป็น VM อยู่บน digital ocean ที่ใช้งานมาแล้วเกือบ 10 ปี (เริ่ม 2014) และด้วย config เก่าๆจำนวนมากที่ไม่ได้ update ตามไปด้วย
เรื่องแรกที่เป็นปัญหาเลยก็คือ openvpn config ที่เคยใช้งานได้ ทั้งสำหรับเครื่อง Linux debian อื่นๆ และ mikrotik swtich และ router ที่มีอยู่ 2-3 ตัว อยู่ๆ ก็ใช้งานไม่ได้ขึ้นมา มี error เกี่ยวกับ ชนิดของ cypher ระหว่างตัว client กับ server ที่ไม่ตรงกัน เลยทำให้เชื่อมต่อไม่ได้
ซึ่งเนื่องจากตัว mikrotik config ที่เกี่ยวกับ openvpn ไม่ได้เปลี่ยนเปลงอะไร งั้นปัญหาก็อยู่ที่ตัว debian server แหง
หลังจากงมอยู่พักนึง ก็พบว่า เดิมทีเพื่อที่ให้ config ตัวนี้ ใช้งานได้กับ mikrotik ก็ต้องจำกัด cypher ให้เหลือแค่ AES-256-CBC
พอ upgrade openvpn เป็น version ที่ใช้งานอยู่บน bookworm ก็ต้องเพิ่ม config ใหม่ “data-cyphers” ให้เป็นแบบเดียวกัน
cipher AES-256-CBC
data-ciphers AES-256-CBC
นอกจากนั้นก็เป็นปัญหาทั่วไปของ service บางอย่างที่ start ไม่ได้ เพราะ package ถูกถอนออกไป โดยไม่ได้ติดตั้งตัวทดแทน เช่น php-fpm และ mariadb ซึ่งพอติดตั้งกลับเข้าไปก็สามารถใช้งานได้
ปัญหาใหญ่ที่สุดที่เจอ ก็คือ ssh ซึ่งเดิมทีใช้ในการ connect เข้าไปที่ตัว mikrotik ได้ โดยใช้ public key ซึ่งใช้งานได้ดี อยู่ ๆ ก็ใช้งานไม่ได้ เครื่อง mikrotik จะถาม password ลอง setup password แล้ว ก็ดูเหมือนว่ายังใช้งานไม่ได้ เพราะ password ที่ป้อนเข้าไปไม่ถูกต้อง
ssh ที่ติดตั้งอยู่เดิมบน bullseye คือ openssh 8.4
ssh ที่ติดตั้งบน bookworm คือ openssh 9.2p1
หลังจากลองอยู่พักใหญ่ แล้วยังใช้งานไม่ได้ ก็เลย copy ตัว ssh binary จาก VM ที่ติดตั้ง bullseye เอาไว้ มาใช้งานปน server ก็ปรากฏว่าใช่งานได้ ก็เลย copy ไปไว้ใน ~/bin และ แก้ไข script ที่ใช้ในการ login เข้า mikrotik router ให้ใช้ ssh ตัวนี้แทน ก็เลยทำให้ script ที่ใช้งานอยู่กลับมาใช้งานได้เป็นปกติ
Edit: 2023-07-05
วันนี้เพิ่งเจอว่า ตอน openssh update เป็น 8.8 มีการเปลี่ยน config
openssh (1:8.8p1-1) unstable; urgency=medium
OpenSSH 8.8 includes a number of changes that may affect existing
configurations:
- This release disables RSA signatures using the SHA-1 hash algorithm by default. This change has been made as the SHA-1 hash algorithm is cryptographically broken, and it is possible to create chosen-prefix
hash collisions for <USD$50K.- For most users, this change should be invisible and there is no need to replace ssh-rsa keys. OpenSSH has supported RFC8332 RSA/SHA-256/512 signatures since release 7.2 and existing ssh-rsa keys will automatically use the stronger algorithm where possible.
- Incompatibility is more likely when connecting to older SSH implementations that have not been upgraded or have not closely tracked improvements in the SSH protocol. For these cases, it may be necessary to selectively re-enable RSA/SHA1 to allow connection and/or user authentication via the HostkeyAlgorithms and PubkeyAcceptedAlgorithms options. For example, the following stanza in ~/.ssh/config will enable RSA/SHA1 for host and user authentication for a single destination
host old-host
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
สรุป เพิ่ม 2 บรรทัดนี้เข้าไปใน .ssh/config ก็จบ ใช้งาน openssh 9.1 กับ mikrotik ต่อไปได้
หลังจากครั้งที่แล้วได้ update จาก 5.9.2 แล้วหลังจากนั้นก็เพิ่ม blog ใหม่ไม่ได้ -_-“
สำหรับการ update ครั้งล่าสุดแบบ manual ทำได้แล้ว โดยการ extract tgz file ไปลงใน /var/www/wordpress โดยก่อนหน้านั้นก็ rename ตัวเก่าจาก wordpress ไปเป็น wordpress-6.1.1 ไปซะ
พอได้ตัวใหม่มา ถ้าจะยังใช้ theme อันเก่า ก็ต้อง copy มาจาก
wp-content /themes
ซึ่งตอนนี้ก็ใช้ blank-canvas และ มี seedlet อีกตัวนึง
รูปภาพและอะไรอื่นๆ จะอยู่ใน wp-content/uploads ซึ่งส่วนนี้ควรจะแยกเก็บเอาไว้ต่างหาก แล้วค่อย link เอามาเก็บไว้ใน wp-content ของ wordpress version ล่าสุด
อีกส่วนที่จำเป็นต้องใช้ก็คือ .htaccess ซึ่งควรที่จะ copy มาจาก wordpress ตัวเก่าได้เลย
#!/bin/sh
[ "$(id -u)" != 0 ] && echo "Need root privileges" && exit
WP_FILE=$(ls -t ${HOME}/Downloads/wordpress* 2> /dev/null | head -1)
[ -z "${WP_FILE}" ] && echo "No wordpress tgz file in ${HOME}/Downloads" && exit
cd /var/www
STAMP=$(date +%s -r wordpress)
WP=$(pwd)/wordpress
WP_OLD=${WP}-${STAMP}
mv ${WP} ${WP_OLD}
tar -zxvf ${WP_FILE}
chown www-data:www-data ${WP}/wp-content
cp ${WP_OLD}/.htaccess ${WP}
cp ${WP_OLD}/wp-config.php ${WP}
ln -s /var/www/wp_themes/* ${WP}/wp-content/themes/
ln -s /var/www/wp_uploads ${WP}/wp-content/uploads
ทดลองกับ wp.cjv6.net เอง เมื่อเพิ่ม histats javascript เข้าไป แล้วทดสอบโดยใช้ GTMetrix ก็จะได้ประมาณนี้
https://gtmetrix.com/reports/wp.cjv6.net/xSWUtDwW/
โอเค ทีนี้เอามันออก
ก็จะได้ประมาณนี้
https://gtmetrix.com/reports/wp.cjv6.net/Rps79MTY/
แต่เฮ้ย ทำไมผลลัพธ์มันถึงได้แย่กว่าเดิมว้อย!!!
โอเค re-test
ได้ผลตามนี้
https://gtmetrix.com/reports/wp.cjv6.net/P6pQhdsg/
ในแง่ของประสิทธิภาพ / Grade ที่ได้จาก GTMetrix ไม่ต่างจากเดิม แต่ ถ้าเอาข้อมูลในส่วนของ Waterfall มาเทียบกัน

นี่คือกรณีที่ไม่ได้ใส่ histat เอาไว้ในส่วนของ footer จำนวน request เท่ากับ 17 เวลาที่ใช้ในการ load เท่ากับ 1.8 วินาที
แต่ถ้าใส่ histats เข้าไป





จำนวน request เท่ากับ 162 เวลาที่ใช้ในการ load เท่ากับ 6.1 วินาที
ในแง่ของคนที่เปิด blog มาดูอาจจะไม่เห็นความแตกต่าง เพราะทั้งหมดของ histats และส่วนที่ตามมาจะถูกโหลดเป็นแบบ background แต่ … เมื่อเทียบจำนวน request และ เวลาที่กว่า web client จะโหลดเสร็จ … เราควรเปลี่ยนไปใช้วิธีการอื่นในการเก็บ stat จะดีกว่า
ไม่ต้องพูดถึงว่า ไอ้เจ้าสารพัด script ที่ถูกโหลดตามมาทีหลังจะเก็บข้อมูลอะไรเอาไปบ้าง -_-“