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 這兩個值

2024年6月7日 星期五

ESXi find what process lock file


ESXi 檔案刪不掉,出現 Device or resource busy
若檔案名稱是 windows-10-flat.vmdk
下此指令就可以知道那邊佔用

ps | grep `lsof | awk '/windows-10-flat.vmdk/ {print $1}'`

另外這個指令可以顯示機器名稱與 datastore 的檔案對應,

vim-cmd vmsvc/getallvms

改機器名稱,datastore 的檔案不會跟著改名,有可能出現與目錄名稱不一致的情況

2024年4月28日 星期日

Eazy way to install OpenWrt

這個方法網路要通,直接抓 image 寫入硬碟
隨便找一片 Linux ISO 開到 rescue 模式
fdisk -l 看一下硬碟位置,如果是 /dev/sda

curl https://repo.jing.rocks/openwrt/releases/23.05.3/targets/x86/generic/openwrt-23.05.3-x86-generic-generic-ext4-combined.img.gz | zcat > /dev/sda

一行解決,然後重開就可以了
上面的網址是 Japan Mirror 的網址,其他可參考 OpenWrt Downloads

Codeit repo for EL8/EL9

Codeit repo 對 EL8/EL9 的支援到 2023 年底才支援
用這個 repo 的主要是要使用最新版的 Apache 或 nginx

dnf -y install https://repo.codeit.guru/codeit-repo-release.el8.rpm
or
dnf -y install https://repo.codeit.guru/codeit-repo-release.el9.rpm

dnf -y module reset httpd
dnf -y module enable httpd:codeit

若是從舊版升級上來,ssl error log 可能看到這樣的錯誤,服務起不來
AH01898: Unable to configure permitted SSL ciphers
SSL Library Error: error:0A0000B9:SSL routines::no cipher match


需要調整 ssl.conf 這兩行的設定
SSLCipherSuite "EECDH+AES128:EECDH+AES256:+SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RSA+3DES:!DSS"
SSLProxyCipherSuite "EECDH+AES128:EECDH+AES256:+SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RSA+3DES:!DSS"
原本是
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM

ref. CodeIT Technical blog

2024年4月21日 星期日

Stunnel

Stunnel 有點像 SSH tunnel,可以建立加密通道
原本未加密的協議,讓它走 Stunnel,就可以達到不改變協議,數據有加密的效果
以下用一個實例說明:

A 要 telnet B,IP 12.34.56.78,因 telnet 協議本身未加密,
若要讓 A 到 B 的傳輸數據加密,此時就可以用 Stunnel

建立憑證
cd /etc/stunnel
openssl req -new -x509 -days 9999 -nodes -out stunnel.pem -keyout stunnel.key
把 stunnel.pem 及 stunnel.key copy 到另一台

A 要配置 Stunnel client
/etc/stunnel/stunnel.conf 內容如下
cert = /etc/stunnel/stunnel.pem
key = /etc/stunnel/stunnel.key
client = yes

[telnet]
accept = 23
connect = 12.34.56.78:2323

B 要配置 Stunnel server
/etc/stunnel/stunnel.conf 內容如下
cert = /etc/stunnel/stunnel.pem
key = /etc/stunnel/stunnel.key
client = no

[telnet]
accept = 2323
connect = 127.0.0.1:23

配置後兩邊啟動服務
systemctl enable stunnel --now

在 A 就可以 telnet localhost (取代直連 telnet 12.34.56.78),
然後封包加密,送到 12.34.56.78:2323,
B 收到封包後解密,再送給 localhost:23

2024年4月16日 星期二

OpenVPN disconnect after 3.4.0

如果 OpenVPN 本來都連線正常,Server 也沒動,OpenVPN Client 升版到 3.4.0 以後的版本,就不能連了,
狀況是連上又斷線,一直重複 (repeat connect and disconnect)
我的環境 RouterOS 6.49.14 及 7.14.2 都遇到此狀況
很可能就是以下原因

OpenVPN Client 在 3.4.0 新增了一個功能 Security Level

Settings / ADVANCED SETTINGS (at bottom)



預設值是 Legacy
如果本來可以連,升版後不能連,把這邊改成 Insecure 可能就能連了
此功能將一些已不安全的協定禁用,若 Server 端暫時沒有新的支援,
Workaround 只能選 Insecure,不然就使用 3.3.7 版 ,意思一樣。

RouterBoard 與 HiNet MOD 的奇怪問題

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