雨水花園專案 · 工作月報
工作成果與待釐清事項彙整
本階段的第一步,是與對方環境部窗口(環境資訊科技司行政資訊服務科)完成協調與網路開通。在對方單位於防火牆開放 220.128.158.152 的 443 埠對外放行之後,我方才具備從外部進行後續切換與驗證的條件。實際施作上採用 real VNC(遠端桌面連線)遠端登入,逐一調整各站點 .py 檔的伺服器指向;為求穩妥,在正式施作前先行測試了 queue 的持久化行為,確認服務重啟後排程與資料不致遺失,並替備份操作補上對應的 request 物件,讓整個切換過程可追溯、也可回復。
第一階段的重點,放在防火牆連線、VM 端更版、OT 端灰度發佈,以及資料補齊這四件事的確認。防火牆方面,HTTPS 連線已確認可透過 curl 正常存取;ping 則持續無回應,初步判斷是 ICMP(ping 測試用的協定)未開放或遭到阻擋所致,對實際的服務存取與 API 呼叫並沒有影響,因此暫不處理。系統配置調整完成後,已可正常與 Fenri 端建立連線。VM 端(虛擬機)完成了一版更新;OT 端(現場端設備)則採較保守的灰度方式逐步發佈,目前已針對 PI、大智、中正國小等站點完成 URL 更新。資料層面,全站資料皆已補齊,並持續觀察回補後的狀態與服務穩定性——整體服務目前可正常運作,惟穩定性仍需再觀察一段時間才能定論。另外要記上一筆的是,目前 Log 輸出的噪音仍偏多,已做了小幅降噪調整,但尚未正式提交至 Git,列為後續待辦。
第二階段主要檢查 IIS 站點關閉後的服務狀態、現場各站點的運作情況,以及 Log 噪音對 I/O 的影響。關於 Log,已將其改放到 VM 以外的 S 槽,並做 gz.zip 壓縮處理;即使噪音仍在,評估對 I/O 造成溢出的風險並不高。要坦白說明的是,這批修改過的檔案還沒有經過長時間的實測驗證;考量到契約結束在即,我方以系統穩定性為第一優先,因此決定優化版本暫時不上正式站,先確保現行功能穩定運行。經雙方商議,已將「優先關閉 IIS 站點」列為最優先目標;關閉之後,部分 API 已確認從外部無法存取,但本機端仍可正常連線,符合目前的切換與驗證方向。站點狀態方面,新街、忠福等站運作正常,先前已更新的大智、中正國小也一併再次確認無誤。至於服務本身,W3SVC(IIS 對外發佈網站的服務)已經關閉,目前狀態分別為關閉與手動,後續仍會持續確認關閉後是否有殘留服務、以及會不會被意外重新啟用。
由於廠商契約即將到期,我方已完成 VM 端更版,確保既有功能在交接之後仍能如常運行,並把剩餘的 OT 站點全數指向 Fenri server,同樣以 real VNC 逐項修改到位。收尾的其他工作還包括:持續檢查 queue 的寫入是否正常、有無壓力與限速的問題,以及替 hub 補上 pull 路由的白名單,讓後續的資料流有一條明確而且受控的路徑。
下表為本次 14 個站點的最終驗收結果。多數站點運作正常;一品、康樂兩處因為採太陽能供電,連線呈現斷續但整體仍屬可用;蟹仔埔公園目前列為報修,需要另外安排現場處理。
| 編號 | 站點代碼 | 中文名稱 | 驗收結果 |
|---|---|---|---|
| D01 | gnes | 歸南國小 | ok |
| D02 | tatung | 大同國小 | ok |
| D03 | chung-cheng | 中正國小 | ok |
| D04 | dazhi | 大智國小 | ok |
| D05 | wuri | 烏日國中 | ok |
| D06 | chung-wen | 崇文國小 | ok |
| D07 | epa-niea | 環檢所 | ok |
| D08 | jfes-tyc | 忠福國小 | ok |
| D09 | sjes-tyc | 新街國小 | ok |
| D10 | yi-pin-park | 一品公園 | 斷續 ok · 太陽能 |
| D11 | kang-lee-park | 康樂公園 | 斷續 ok · 太陽能 |
| D12 | hue-a-poo | 蟹仔埔公園 | 報修 |
| D13 | nlps-hc | 南寮國小 | ok |
| D14 | ppes-hcc | 北平華德福 | ok |
這次需求的起點,是承辦希望把這個網址從目前的「現況」改成他想要的「目標」狀態,並且附上了下面這兩張畫面來說明。左邊是現在的樣子,右邊是他期望達到的樣子——乍看之下很直覺,但其實藏了一個需要先講清楚的細節。
畫面判讀(這點很重要,先講清楚)
有一個很容易被誤會、但一定要先說明白的地方:右圖網址列上的 raingardenajldkjass.moenv.gov.tw,其實是一組隨機打出來、根本不存在的名稱。它之所以顯示 DNS_PROBE_FINISHED_NXDOMAIN,純粹是因為這個名稱從來沒有被登記過。承辦是拿它來「示意」一筆紀錄被刪掉之後,畫面該長成什麼樣子。
換句話說,這兩張圖是兩個不同的網址,並不是同一台主機的前後對照。真正的目標,是要讓 raingarden.moenv.gov.tw 這個名稱本身,也走到右圖那種「查無此網域」的狀態。
先講我方的判斷。DNS server 這一塊,本來就應該是由對方單位在管理的;而依照過往處理類似案子的經驗,我傾向認為這根本就是 DNS 紀錄還沒刪的問題,而不是 IIS 這一層的問題。這個判斷並不是憑感覺——PART 3 的技術佐證已經證明,我方的 IIS 對外是完全沒有回應的。既然來源這一端已經關到連 TCP 都連不上,那麼右圖想要的那種 NXDOMAIN,就只剩下一條路可走:由對方的 DNS 維運端,把 raingarden 這一筆紀錄從權威區域裡刪掉。
不過在動手之前,有一件事得先跟承辦問清楚:同樣是「傳兩張圖過來」,背後想表達的訴求其實可能差很多。與其各自猜、各做各的,不如先把對方到底要什麼還原、理解清楚。我大致把它拆成三種可能:
| # | 可能的訴求 | 我方對應 |
|---|---|---|
| A | 是不是在暗示「IIS 沒關乾淨」? | PART 3 已證明來源零 HTTP 回應;若是此意,證據可以直接回覆。 |
| B | 是不是內部檢測或承包商方案的既定要求? | 需索取該方案或驗收標準,把「完成」的定義對齊清楚。 |
| C | 或者只是比較兩個狀態後覺得奇怪的單純提問? | 說明 REFUSED 與 NXDOMAIN 的差異即可——這屬 DNS 紀錄/傳播層,不在 IIS。 |
raingarden 的 A 紀錄,並同步各權威伺服器。COMPLETE_CLOSURE_VERIFIED(我方稽核腳本的「已徹底關閉」判定字串)才算真正結案。這一節是用來支撐前面討論的技術佐證。前面之所以敢說「IIS 已經關乾淨、問題出在 DNS」,並不是嘴上講講,而是有實際的稽核數據撐著。以下把驗證的邏輯、指令,以及真實的回傳一併附上,讓結論可以被覆核。
為什麼 REFUSED 與 Timeout 都代表「沒有 HTTP 服務」
先把兩個常被混為一談的現象分開講。「拒絕連線(RST)」代表主機還在、但那個埠沒有服務在聽;「逾時(封包被丟棄)」則代表主機關機、或前面的防火牆直接把封包 DROP 掉。這兩種情況有一個共通點:都是在 TCP 這一層就失敗了,伺服器根本沒有機會送出 200/301/302/404 或任何一個標頭。
而且,使用者瀏覽器看到的 ERR_CONNECTION_REFUSED,與我方雲端稽核看到的 Timeout,是兩個彼此獨立的外部視角。兩邊同時都連不上 TCP,正好互相印證——這不是單一環境的偶發,而是來源真的沒有在服務。
直接對來源 IP 223.200.81.115,帶上正確的 Host 與 SNI、而且不跟隨轉址地去探測:
| 目標 | 連線 | HTTP 狀態 | 結果 |
|---|---|---|---|
| http://…:80 via 223.200.81.115 | 失敗 | — | Timeout · 無回應 |
| https://…:443 via 223.200.81.115 | 失敗 | — | Timeout · 無回應 |
沒有 200、沒有 301/302、沒有 404,也沒有任何標頭——連 Server: Microsoft-IIS 都看不到,因為連線根本就沒建立起來。
底下的指令與輸出都是實跑擷取下來的,沒有經過美化。
驗證指令
# 帶正確 Host 與 SNI、不跟隨轉址,逾時 8 秒 curl -sS --max-time 8 -o /dev/null \ -w 'http_code=%{http_code} time=%{time_total}s\n' \ https://raingarden.moenv.gov.tw/ # 純 TCP 層:直接測來源 IP 的 80 / 443(bash /dev/tcp) for p in 80 443; do timeout 6 bash -c "exec 3<>/dev/tcp/223.200.81.115/$p" \ && echo "port $p OPEN" || echo "port $p UNREACHABLE" done
實際回傳
curl: (28) Connection timed out after 8001 milliseconds http_code=000 time=8.002224s # 連 HTTP 狀態列都沒收到 port 80 UNREACHABLE port 443 UNREACHABLE
有人可能會質疑:會不會只是我方這台機器連不到 MoENV?為了把這個可能性排除掉,我在同一台稽核機、同一個時刻,拿 MoENV 相鄰網段的權威 NS 跟來源 IP 做對照——如果鄰段連得上、只有來源連不上,那問題就一定出在來源主機本身,而不是網路路徑。
# 相鄰權威 NS vs 來源 IP,同源同時比較
for hp in 223.200.80.244:53 223.200.80.51:53 223.200.81.115:443; do
h=${hp%:*}; p=${hp#*:}
timeout 6 bash -c "exec 3<>/dev/tcp/$h/$p" 2>/dev/null \
&& echo "$hp OPEN" || echo "$hp UNREACHABLE"
done
223.200.80.244:53 OPEN (14 ms) # 鄰段權威 NS 秒回 223.200.80.51:53 OPEN (13 ms) 223.200.81.115:443 UNREACHABLE # 來源全埠不可達 → 是主機無服務,不是路徑問題
把這件事拆成兩層來看,責任歸屬就一目了然:一層是我方負責的 Web/IIS,一層是對方負責的 DNS。
已徹底關閉
兩個外部視角的 TCP 都無法建立;沒有任何 HTTP 回應;差異化連通性也證明了是主機無服務,而非路徑問題。
責任方:應用/主機端 —— 已完成
尚未刪除
4 台權威伺服器 AA=1 都還是回 223.200.81.115;3 家公開解析器的結果也一致。
責任方:DNS 維運端 —— 待處理
一句話結論:「還沒關乾淨」的癥結不在 IIS,而在 DNS。 目前那個 IP 就算還被解析得到,連上去也只會得到「拒絕/無回應」這種正常的關閉結果(沒有站台、也未開放),並沒有任何內容或轉址被暴露出去。