顯示具有 Network 標籤的文章。 顯示所有文章
顯示具有 Network 標籤的文章。 顯示所有文章

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年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年3月29日 星期五

iptables hashlimit

把 Linux 充當 NAT 的情況下,可以用 iptables hashlimit module 來達到簡單的限速

iptables -A FORWARD -d 192.168.0.0/16 -m hashlimit --hashlimit-name download --hashlimit-mode dstip --hashlimit-above 2048kb/s -j DROP
iptables -A FORWARD -s 192.168.0.0/16 -m hashlimit --hashlimit-name upload --hashlimit-mode srcip --hashlimit-above 1024kb/s -j DROP

第1行,下載規則,當目的是內網時, 以 dstip 分類,限速 2048kbytes/s = 16Mbps
第2行,上傳規則,當來源是內網時, 以 srcip 分類,限速 1048kbytes/s = 8Mbps

效果: 內網每個 IP 都享有 16Mbps/8Mbps 頻寬。測速會超過一些,誤差在 10% 內,還算滿準的。

ref. man iptables-extensions

2023年12月31日 星期日

Get IP addresses by ASN

whois -h whois.radb.net -i origin AS15169 | grep ^route

result
route: IPv4 network segment
route6: IPv6 network segment

2023年7月3日 星期一

Simple traffic shapping with iptables

使用 iptables 限速

範例: Linux Gateway, 區網的網段是 192.168.0.0/24
要限制每個 IP 都有上傳下載 16M/16M bps

iptables -A FORWARD -d 192.168.0.0/24 -m hashlimit --hashlimit-name ratelimitin --hashlimit-mode dstip --hashlimit-above 2048kb/s -j DROP
iptables -A FORWARD -s 192.168.0.0/24 -m hashlimit --hashlimit-name ratelimitin --hashlimit-mode srcip --hashlimit-above 2048kb/s -j DROP
Rule 要分兩個方向來下,兩這條分別是下載及上傳
16M bps = 16384 k bps = 2048 kb/s

實測結果還算準

2023年6月27日 星期二

Get Public IP Address from OpenDNS

一般取得所在 Public IP 都是用 Web 服務取得,例如:
curl ip4.tw
curl ifconfig.co

OpenDNS 有提供一個服務,對他們的 name server 查 myip.opendns.com 會回應來源 IP
dig +short myip.opendns.com @resolver1.opendns.com
host myip.opendns.com resolver1.opendns.com

發現若環境同時有 IPv4+IPv6 可能會不正常,因為兩個 IP 都有的話,通常會走 IPv6 的路由,用 IPv6 路由去查 A 記錄導致無資料

保險一點,指令要區分 IPv4、IPv6
dig -4 +short A myip.opendns.com @resolver1.opendns.com
dig -6 +short AAAA myip.opendns.com @resolver1.opendns.com

2023年1月15日 星期日

Detect iPhone by Port 62078

現在手機預設都有開 Random MAC Address 的功能,也就是無法用 MAC 來判斷是那一家廠商
iPhone 手機有一個固定會 Listen 的 Port 62078,若 Scan 這個 Port 有回應,可以判斷這個 Device 可能是 iPhone
Android 則沒有固定會 Listen 的 Port

Windows 10 ESU extended to 2027-10-12

微軟延長了 Windows 10 ESU 支援時間至 2027-10-12 (又加一年) 可以使用 ConsumerESU 腳本快速啟用 ESU 下載 ZIP 包解開後,以系統管理員身分執行 Consumer_ESU_Enrollment_run.cmd