[RouterOS]_關於一些RouterOS使用中華電信非固定制IPV6的小雜記
這裡記錄一下RouterOS在設定Hinet Dual stack的一些設定與Script
對V6瞭解還為皮毛程度,如有錯誤煩請指教~
Hinet Dual stack意旨同時能夠獲取並使用V4與V6的IP,其實當初接觸ROS第一個原因就是需要可以做DUAL STACK的路由器
因此很早就有實作過,但其中的運作原理一直沒有認真的去順一遍…
直到最近有K到V6 PROTOCAL才略知一二,不過還是沒有真的很熟啦…
可是覺得有必要筆記一下過程~分享一下相關的實作步驟與一點原理。
在ROS上面,首先需要設定DHCPv6 Client,並透過PPPoE的Interface跟中華電信拿取V6 IP進來(紅色箭頭)
並設定一個要將這個V6位置配送到內網的Pool(綠色框框,名稱自訂),而通常DHCPV6Client拿到的前面64Bit為ISP配送的V6位置,又稱為V6 IP Prefix
而後64bit才為透過V6規範(RFC多少忘記了…)將Client的MAC透過一個規則轉換後成為後64Bit,而就成為完整的IPV6位置了~
而在IPV6 POOL需新增一個Pool,prefix預先設定為::/64,長度為64,名稱需與前面DHCPv6Client相對應
設定好之後,再重新enable剛剛新增的DHCPV6Client,就會發現新增的pool所帶的prefix自動改為中華配發的Prefix
在v6 address裡面也可以看到拿到prefix+::1的v6位置,而prefix+::1的位置其實就是你routeros自己拿來當作自己的v6,
所以這時你routeros與內網的機器應該是可以ping6出去v6的機器,而外部的機器也可以ping的到prefix+::1的位置(也就是你的routeros)
例如這裡的prefix假裝是2001:b011:abcd:efaa,則2001:b011:abcd:efaa::1就是你的routeros位置
因為v6沒有NAT,沒有以前有區域網路能夠做到基礎的網路隔離,因此這可能會造成一些安全上的問題
例如外面只要Ping或針對2001:b011:abcd:efaa:aaaa:aaaa:aaaa:aaaa做連線(假設aaaa:aaaa:aaaa:aaaa為你其中內網的一台機器,並透過MAC轉換成V6位置)
其實是可以直接打通的…
因此當然要做點FW,而V6的FW觀念又跟V4截然不同,但這邊就不細說太多詳細內容,
以及V6其實也可以規劃成區域網路的概念,但這邊也不探討這種情況,
首先先要建立幾個觀念,V4 NAT是將LAN輸入(INPUT)ROUTER的封包轉換IPSRC後送往WAN去。
而V6沒有NAT,因此RouterOS只負責轉送(FORWARD)封包出去WAN。
因此在之前V4常常CHAIN會設定INPUT以及DSTNAT,而在V6並不是這麼一回事了。
而是要設定過濾FOWARD的封包,可以看一下官方對於Layer3的FW過濾流程圖:
http://wiki.mikrotik.com/wiki/Manual:Packet_Flow
因此我也依照了幾個規範跟參考了外國的V6 FW TABLE做了一些規則,在這裡分享一下~
一步一步逐條解說
- 對於輸入ROS不合法的連線會直接DROP
- 輸入下面CLIENT不合法的連線會直接DROP
- 允許對ROS合理流量的PING6(注意,V6是走ICMP V6)
- 允許對CLIENT合理流量的PING6
- DHCPv6 Client連線用的port,這是很重要的,必須要讓外面的DHCPv6Server能夠與你的ROS溝通,注意是走UDP 546 PORT
- 允許CLIENT建立的連線
- 允許CLIENT相關的連線
- 允許ROS本身對外的連線
- 除此之外對ROS的連線全部DROP
- 除此之外對CLIENT的連線全部DROP
最後一條有mangle的部分是因為PPPOE撥號出去的封包大小可能加上PPP HEADER會超過1500BYTE,因此必須要處理縮小,這邊就由系統自行判斷縮小的程度(clamp-to-pmtu)
/ipv6 firewall filter add action=drop chain=input comment="Drop invalid" connection-state=invalid add action=drop chain=forward comment="Drop invalid" connection-state=invalid add chain=input comment="Allow limited pings" limit=50/5s,2 protocol=icmpv6 add chain=forward comment="Allow limited pings" limit=50/5s,2 protocol=icmpv6 add chain=input comment="DHCPv6 client" dst-port=546 protocol=udp add chain=forward comment=Established connection-state=established add chain=forward comment=Related connection-state=related add chain=output comment="Accept output" add action=drop chain=input comment="Drop the rest" add action=drop chain=forward comment="Drop the rest" /ipv6 firewall mangle add action=change-mss chain=forward new-mss=clamp-to-pmtu passthrough=no protocol=tcp tcp-flags=syn
另外在某些情況,如24小時重新撥號的時候,會有一定機率發生V6都重新拿PREFIX了,POOL的位置也沒錯,ROS自己本身也拿到正確的PRFIX+::1的對應位置
但就是無法V6連線,對內對外都是不通的…非常弔詭,在某些ROS版本中會遇到…應該是ROS本身的BUG(之前在CHANGE LOG就有看到),這對內網機器沒什麼影響
因為裝置的作業系統會自動FALLBACK回V4,唯獨ANDROID到了5.1對V6 FALLBACK的支援性還是很感冒…所以如果V6有問題,就會沒辦法用FB, LINE等…
因此也撰寫了下面的腳本,來搭配排程執行,定期確認V6的可使用性,若不行則自動的斷掉DHCPV6CLIENT並清空POOL後重新連線,通常都能夠解決!
:local PPPName "HOME PPPoE"; :local DHCPV6Client "HOME V6Client"; :local V6PoolName "HiNet Dual Stack IP Pool"; :local V6DNS1 "2001:4860:4860::8844"; :local V6DNS2 "2001:b000:168::1"; :local ReTryCount 5; :log info ("Start V6Connection test."); :if ([/interface pppoe-client get $PPPName running]=true) do={ :local index 0; :local V6Status false; :while ($index < $ReTryCount) do={ :log info ("V6Connection test repeat:" . $index); :if (([/ping $V6DNS1 count=3]=0)&&([/ping $V6DNS2 count=3]=0)) do={ :log info ("Ping failure, start release V6Client."); :do { /ipv6 pool remove numbers=$V6PoolName; } on-error={:put "No pool found to delection."}; :delay 3s; :do { /ipv6 dhcp-client disable $DHCPV6Client; } on-error={:put "DHCPV6Client already disable."}; :delay 3s; /ipv6 dhcp-client enable $DHCPV6Client; :delay 3s; #/ipv6 dhcp-client release $DHCPV6Client; #:delay 3s; :log info ("Release V6Client completed."); } else={ :set V6Status true; #:log info ($V6Status); :set index $ReTryCount; :log info ("V6Connection OK!") } :set index ($index+1); } :if ($V6Status=false) do={ :log info ("V6Status still failure after 10 tried, disable V6."); /ipv6 dhcp-client disable "HOME V6Client"; } }
然後命名為v6Checker,並且加入排程,每小時都檢查一下
/system scheduler add name=runv6Checker interval=1h on-event=v6Checker
以上,有想到什麼再補充了~
試著用你的FWrule設定,但最後一條add action=drop chain=forward comment=”Drop the rest”
看起來會影響ipv6 test網站跟ping ipv6的功能
拿掉後就正常了,不知道為什麼
請問是哪個測試網站?,我這邊用這一系列rule好一段時間了,都沒問題
如果沒有該rule,等同於拿v6的裝置直接暴露在外…可能會有安全性的隱憂
我用最後一條也有相同情況
我用最後一條也有相同情況