2024年11月9日 星期六

RouterBoard 與 HiNet MOD 的奇怪問題

HiNet MOD 機上盒(註1),在實體電源關機(註2)後兩分鐘,
會造成 RouterBoard 的 PPPoE 斷線重連,有夠怪的問題
這個問題追了好久,終於找到兩者竟然有關聯
經過多次驗證,確認了這個關聯性,就在機上盒關機後的兩分鐘(正負5秒),
RouterBoard 的 PPPoE 必定斷線重連
Log 呈現大概是這樣


交叉測試已知的結果:
  1. 只有影響 RouterBoard,手邊兩台(註2)都有這狀況,同時間用 Linux 電腦撥號的不影響,RouterOS CHR 版本也不影響
  2. 6.x 版及 7.x 版都有此狀況(註3),6.x 版斷線時間較長,大約30秒到1分鐘,可以察覺到斷線,7.x 版只是瞬斷,PING 只會掉一個包或甚至沒掉,沒看 Log 應該無法察覺有斷線
  3. 跟假固定 IP 無關 (HNnumber@ip.hinet.net)
  4. 跟數據機後面的 Port 位無關

註1: MOD 機上盒型號 MOD502A,HiNet 數據機型號 Alcatel-Lucent I-040GW
註2: 按電源開關整個關機,非遙控器按鈕
註3: 兩台型號是 RB2011UiAS-2HnD 及 RB3011UiAS
註4: 測試時的版本是 6.49.17 及 7.16.1

問題的答案:

經過抓包後找到答案,在機上盒關機後兩分鐘,
頭端設備都會送出一個 PPPoED Active Discovery Terminate (PADT) 斷線訊號

此封包是在 RouterBoard packet sniffer 抓的
第一個封包,是頭端設備(Nokia BRAS)送 PADT 給機上盒(L2封包),此時已經是關機兩分鐘,
Port Down,MAC Address 會直接消失在數據機的 MAC Table
數據機的 Switch 晶片在處理上就用廣播的方式送出 PADT 封包,所以直接接在數據機後面的都可以收到 PADT
RouterBoard 在收到 PADT 封包時,沒有判斷 Dest MAC Address 不是給自己的,直接 PPPoE 斷線反應,
接電腦抓封包並不會看到這個包,看起來是有判斷 Dest MAC Address 不是給自己的所以 Drop 該封包

解決方式:

若是使用 7.x 的 RouterOS,此問題造成的斷線重連其實無感,不需特別去解。
要解的話也簡單,在下面多接一台 Switch 即可,機上盒接 Switch,不要直接接數據機,
MAC Address 的 aging time 通常是 300 秒。
接在 Switch 下的機上盒關機了,數據機的 MAC Table 並不會立刻消失,
當頭端要送出 PADT 封包時,因為 MAC entry 仍在,所以不會用廣播方式,
如此 RouterBoard 就不會收到 PADT 封包,也就不會斷線重連了。
後續觀察數據機的 MAC Table,並沒有 aging time 300 秒的機制,跟一般 Switch 的行為不同,
曾經學過的 MAC 都不會消失,只會多,不會少,除非 Port Down。

2024年11月6日 星期三

MySQL 8.4 LTS

許久沒有留意 MySQL 的版本發展,8.4 都已經出一段時間了(2024-04),
這是繼 8.0 LTS 後下一個 LTS 版本
寫這篇文章時,已經出到 8.4.3

Overview of changes in MySQL 8.4.0

感覺異動不大,
mysql_native_password 預設關閉,
因應時代變化,一些預設參數有調整,
replication 的指令有異動

Download MySQL Yum Repository

裝這個 8.4 的 repo 檔,然後 yum -y update 就升完了
拿一台 8.0 的機器直接升級,並沒有遇到什麼問題,算是無痛升級

2024年11月2日 星期六

RouterOS Cloud DDNS Server

RouterOS Cloud DDNS Server 是

cloud.mikrotik.com
or
cloud2.mikrotik.com

若機器上設了很多路由,IP / Cloud 的 DDNS IP 可能不是想要的
可以設這段 static route 159.148.128.0/18 控制它走那一段路由出去 Cloud DDNS

LINE Notify Replacement

前一陣子 LINE 發出 LINE Notify 結束服務公告(結束時間2025-03-31),這對有在用這個服務的人影響頗大,
LINE Notify 好用在於免費,而且可以無限量發送
幾乎所有的 IM 軟體都有串 Bot Message 的功能,找替代方案不是問題

Telegram
Discaord
Facebook Messenger
IG
Skype
Google Chat
Microsoft Teams
Slack

個人使用就挑一套有在用的轉即可,個人是推薦 Telegram
量不大的話也可以用 LINE Messaging API,免費額度一個月是 200 則
商家的話比較麻煩,跳其他 APP 平台客戶不見得會繼續用,最佳替代方案只能付費選 LINE Messaging API
又是一個養套殺案例

inotify-tools

inotify-tools 工具,可以監控檔案系統的異動,後續觸發想要的動作,
例如此腳本監控 /abc 目錄,後續觸發 rsync 動作
while true
do
inotifywait -e modify -e create -e delete /abc
rsync -au /abc/ /def/
done

加 -d 參數可以常駐執行,監控 Event 存成 Log
inotifywait -dr --timefmt '%F %T' --format '%T %w%f %e' /abc -o /var/log/inotifywait.log

另外一個指令 inotifywatch 感覺比較沒用,它是監控一段指定時間或直到按 Ctrl-C,顯示 Event Counter

2024年10月6日 星期日

Linux PPPoE NAT MTU and MSS

Linux 在 PPPoE 環境下 NAT,下面的 Client 可能會有部份網站連不上,
已知 LINE 的網站 (https://line.me) 及 LINE 服務就有這個狀況

這個問題是因為 Client 的 MTU 1500 大於 Linux NAT WAN 端的 MTU 1492 所導致,
解決方式有兩種:

1. 在 Linux NAT 解決,加一行 Rule
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
TCPMSS 這個 target 會更改 TCP SYN 封包的 MSS 值
--clamp-mss-to-pmtu 會根據 path_MTU 自動設定 MSS (Maximun segment size) 的值,即 path_MTU - 40 (for IPv4)
2. 更改 Client 端的 MTU 跟 NAT WAN 端一致

這兩種方式明顯是方法 1 較佳,不用動到 Client 端

原理:
一般 Ethernet MTU 是 1500,PPPoE 是 1492,
Client PC 沒特別調整的話,MTU 也是 1500,進行 TCP SYN 連線,
TCP Option 中的 MSS 會是 1460 (1500-40 TCP Header)



在尚未加上面的 Rule 時,NAT 會原封不動轉送出去,
導致回應封包有可能會超出 PPPoE 環境的值1452,後續就收不到 Server Hello 封包,就會卡住沒通
加入該 Rule 後,封包在轉送出去時,會改成 MSS 值為 1452,後續就會通



那為何大部份的網站都會通呢?
因為用了較小的 MSS,例如 Google 是 1412

2024年9月18日 星期三

pktmon - Windows tcpdump

pktmon 相當於 Windows 下的 tcpdump,是 Windows 10 的內建工具

列出網卡
pktmon comp

新增一個 filter
pktmon filter add tcp80 -t tcp -p 80

開始抓包,--pkt-size 0 是記錄整個封包,不然預設只會記 128 bytes
預設抓所有網卡,要指定網卡可以用 --comp 網卡編號 (參考pktmon comp)
pktmon start -c --pkt-size 0

停止抓包,預設會存在當前目錄 pktmon.etl,若要指定不同的檔名,在 start 時用 -f 參數
pktmon stop

轉成 Wireshark 格式檔案,會轉出 pktmon.pcapng
pktmon pcapng pktmon.etl

pktmon 無法過濾某個軟體的封包,還是只能用 Microsoft Network Monitor,這個功能似乎還沒有替代品

2024年9月10日 星期二

HiNet IDC mirror closed

http://mirror01.idc.hinet.net
HiNet 這個網址關了,要高速下載 Linux ISO 少了一個地方,感謝 HiNet 默默服務了多年
測了幾個 TW mirror 站,推 TWDC 台灣數位串流,常見的 Linux 都有,速度超快
https://mirror.twds.com.tw

2024年8月26日 星期一

RouterOS WireGuard

RouterOS 在 7 版以後支援 WireGuard
註: WireGuard 在 Linux Kernel 5.6 版開始內建

設定滿簡單的,在選單 WireGuard New Interface,Private Key 及 Public Key 不用填,會自動產生
在 IP / Addresses 綁一個 IP 給 wireguard1,例如 10.66.66.1/24
在 IP / Firewall / NAT 加上 srcnat 讓 wireguard1 區段 masquerade

在 Peer 加 Client,這邊就沒有自動產生功能,
要找一台有裝 wireguard-tools 的 Linux,用 wg 指令產生
wg genkey | tee privatekey # 產生 Private Key
wg pubkey < privatekey # 產生 Public Key
wg genpsk # 產生 Preshared Key

Client Address 填入 10.66.66.2 # 要在上面 wireguard1 網段內
Client DNS 填入 8.8.8.8
Client Endpoint 填入 RouterOS 的 Public IP
下面會自動產生 Client Config 及 Client QR 碼

但實測在 [Interface] 內 ListenPort 必需移除才會通,
掃 QR 碼後,需將 ListenPort (監聽連接埠) 設定移除,移除後欄位會呈現 (隨機)

ref. ROS WireGuard

2024年8月5日 星期一

Change Redhat Linux 9 /lib default size

Redhat Linux 9 (or Rocky Linux 9 or Alma Linux 9) 之前的 /lib,設跟 /dev/shm 相同,預設大小是記憶體一半,
在 9 之後,預設大小是記憶體的 20%,若要調整這個大小,可以在 /etc/fstab 加一行覆寫預設值
例如:
tmpfs /run tmpfs defaults,size=5G 0 0

systemd jounal 的預設存放位置就在這 /run/log/journal,
其預設最多使用所在 Partition 的 10%,若 Log 量多,希望保留多一多時間,
就需要調大 SystemMaxUse 及 RuntimeMaxUse 這兩個值

RouterBoard 與 HiNet MOD 的奇怪問題

HiNet MOD 機上盒(註1),在實體電源關機(註2)後兩分鐘, 會造成 RouterBoard 的 PPPoE 斷線重連,有夠怪的問題 這個問題追了好久,終於找到兩者竟然有關聯 經過多次驗證,確認了這個關聯性,就在機上盒關機後的兩分鐘(正負5秒), RouterBoard ...