NeverGiveUp!! wrote:
該篇Mangle的DSCP...(恕刪)
該篇Mangle的DSCP再次小幅修正.
07/03再次更正:刪除所有的"Tin-0X -> DSCP(XX)"
新增"SECURE QOS: Bypass LAN-to-LAN from QoS"
及"Clean up externally outroduced DSCP contamination"
NeverGiveUp!! wrote:
該篇Mangle的DSCP...(恕刪)
JQJQ wrote:NPTv6轉換後的GUA-IP,ROS計算腳本。
RAW NOTRACK...(恕刪)
# =======================================================
# NPTv6 /64 Checksum-Neutral 計算工具 (修復 Time Interval 錯誤版)
# =======================================================
# 1. 填入您的原始 IP、內部前綴、外部前綴(支援縮寫格式,例如 :: 或 fd00:88::2:2)
:local ipInRaw "fd00:88::1891:7994:6915:9a30"
:local prefInRaw "fd00:88::"
:local prefOutRaw "2001:b011:3007:de02::"
# =======================================================
# 核心模組一:自動還原並補零 IPv6 函式
# =======================================================
:local ipv6Expand do={
:local txt $1
# 移除可能帶有的 / 遮罩符號
:local posSlash [:find $txt "/"]
:if ($posSlash >= 0) do={ :set txt [:pick $txt 0 $posSlash] }
# 處理特殊純雙冒號狀況
:if ($txt = "::") do={ :return "0000:0000:0000:0000:0000:0000:0000:0000" }
# 將字串依據冒號切割
:local parts [:toarray ""]
:local tmp ""
:local dblIdx -1
:for i from=0 to=([:len $txt] - 1) do={
:local c [:pick $txt $i ($i + 1)]
:if ($c = ":") do={
:if ($tmp = "") do={
# 抓到雙冒號位置
:set dblIdx [:len $parts]
} else={
:set parts ($parts , $tmp)
:set tmp ""
}
} else={
:set tmp ($tmp . $c)
}
}
:if ($tmp != "") do={ :set parts ($parts , $tmp) }
# 補滿各別區段的前導零
:local fullParts [:toarray ""]
:for i from=0 to=([:len $parts] - 1) do={
:local p ([:pick $parts $i])
:while ([:len $p] < 4) do={ :set p ("0" . $p) }
:set fullParts ($fullParts , $p)
}
# 如果有雙冒號,計算需要插入幾個 0000
:if ($dblIdx >= 0) do={
:local missing (8 - [:len $fullParts])
:local left [:toarray ""]
:local right [:toarray ""]
:if ($dblIdx > 0) do={
:for i from=0 to=($dblIdx - 1) do={ :set left ($left , [:pick $fullParts $i]) }
}
:for i from=$dblIdx to=([:len $fullParts] - 1) do={ :set right ($right , [:pick $fullParts $i]) }
:local mid [:toarray ""]
:if ($missing > 0) do={
:for i from=1 to=$missing do={ :set mid ($mid , "0000") }
}
:set fullParts ($left , $mid , $right)
}
# 組合回標準字串
:local res ""
:for i from=0 to 7 do={
:if ($i > 0) do={ :set res ($res . ":") }
:set res ($res . [:pick $fullParts $i])
}
:return $res
}
# =======================================================
# 核心模組二:基礎數學與校驗和運算
# =======================================================
:local hexToDec do={
:local hexStr $1
:local hex "0123456789abcdef"
:local res 0
:for i from=0 to=([:len $hexStr] - 1) do={
:local char [:tonum [:find $hex [:pick $hexStr $i ($i + 1)]]]
:set res (($res * 16) + $char)
}
:return $res
}
:local onesSum do={
:local v1 $1
:local v2 $2
:local s ($v1 + $v2)
:while ($s > 0xFFFF) do={ :set s (($s & 0xFFFF) + ($s >> 16)) }
:return $s
}
:local decToHex do={
:local v $1
:local hex "0123456789abcdef"
:local res ""
:if ($v = 0) do={ :return "0000" }
:while ($v > 0) do={
:local rem ($v % 16)
:set res ([:pick $hex $rem ($rem + 1)] . $res)
:set v ($v / 16)
}
:while ([:len $res] < 4) do={ :set res ("0" . $res) }
:return $res
}
# =======================================================
# 核心模組三:主程式邏輯
# =======================================================
# 呼叫還原函式
:local ipIn [$ipv6Expand $ipInRaw]
:local prefIn [$ipv6Expand $prefInRaw]
:local prefOut [$ipv6Expand $prefOutRaw]
# 計算前綴一補數和
:local sumIn 0
:local sumOut 0
:for i from=0 to=3 do={
:local valIn [$hexToDec [:pick $prefIn ($i * 5) (($i * 5) + 4)]]
:local valOut [$hexToDec [:pick $prefOut ($i * 5) (($i * 5) + 4)]]
:set sumIn [$onesSum $sumIn $valIn]
:set sumOut [$onesSum $sumOut $valOut]
}
# 【關鍵修正】:使用 0xFFFF 減法取代 ~ 符號,完美避開直譯器的型態判斷錯誤
:local invOut (0xFFFF - $sumOut)
:local delta [$onesSum $invOut $sumIn]
# 調整第 5 個字組
:local origIdx4 [$hexToDec [:pick $ipIn 20 24]]
:local newIdx4 [$onesSum $origIdx4 $delta]
:if ($newIdx4 = 0xFFFF) do={ :set newIdx4 0 }
:local idx4Hex [$decToHex $newIdx4]
# 組合最終輸出 (前綴 4 字組 + 補償字組 + 原始後半段 3 字組)
:local ipOut ([:pick $prefOut 0 19] . ":" . $idx4Hex . ":" . [:pick $ipIn 25 44])
# 輸出結果至 Log 與 Console
:log info "==== NPTv6 自動補零計算結果 ===="
:log info "輸入原始 IP: $ipInRaw"
:log info "還原補零 IP: $ipIn"
:log info "計算輸出 IP: $ipOut"
:put "計算輸出 IP: $ipOut"