[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位置了~

2015-11-15_01-14-09

而在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做了一些規則,在這裡分享一下~

一步一步逐條解說

  1. 對於輸入ROS不合法的連線會直接DROP
  2. 輸入下面CLIENT不合法的連線會直接DROP
  3. 允許對ROS合理流量的PING6(注意,V6是走ICMP V6)
  4. 允許對CLIENT合理流量的PING6
  5. DHCPv6 Client連線用的port,這是很重要的,必須要讓外面的DHCPv6Server能夠與你的ROS溝通,注意是走UDP 546 PORT
  6. 允許CLIENT建立的連線
  7. 允許CLIENT相關的連線
  8. 允許ROS本身對外的連線
  9. 除此之外對ROS的連線全部DROP
  10. 除此之外對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

以上,有想到什麼再補充了~

4 Comments

  1. 試著用你的FWrule設定,但最後一條add action=drop chain=forward comment=”Drop the rest”
    看起來會影響ipv6 test網站跟ping ipv6的功能
    拿掉後就正常了,不知道為什麼

    • 請問是哪個測試網站?,我這邊用這一系列rule好一段時間了,都沒問題
      如果沒有該rule,等同於拿v6的裝置直接暴露在外…可能會有安全性的隱憂

  2. 我用最後一條也有相同情況

  3. 我用最後一條也有相同情況

Leave a comment 取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Exit mobile version