RouterOS 6.41版應用於設有伺服器的家用網路(一):Multi-PPPoE/DHCP/Route

Mikrotik RB450G外觀RouterOS在6.41算是個大改版,某些用戶會因為取消了Master-port並預設以Bridge代替之後出現無法上網的情況,
修正了Bridge後可能還是不行,因為DHCP server的interface也需要重新指向,沒錯,我的確是那個多數用戶之一。

由於還不知道有多少遺毒,且現行的設定已沿用好幾版更新,乾脆整包砍掉重練,避免日後有掌握不到原因的突發狀況要解。

目前家裡的網路環境如下
  • Router為RB450G,RouterOS 6.41版,重置後帶入6.41版本的預設值。
  • WAN為Hinet光世代,上行40Mbps下行100Mbps,RB450G透過ETH1與中華電信的小烏龜連結。
  • 共有一個固定IP及七個浮動IP可同時以PPPoE的方式撥號上網,機房端不鎖MAC。

這次的需求如下
  • LAN的部分只使用一個子網路192.168.88.0/24,並將ETH2、ETH3、ETH4與ETH5 port橋接在一起,其Interface命名為Bridge。
  • Multi-PPPoE,RB450G同時撥出一組固定IP與一組浮動IP。
  • Neptune Apex與Synology NAS走固定IP,其他裝置(電腦/手機/平板/Chromecast/...)走浮動IP,以該裝置是否在DHCP pool內來劃分。
  • 建立PPTP與L2TP二種VPN伺服器,方便從WAN取得LAN的資源。
  • 以HTB+PCQ建立QoS,優先權依序為各種服務→伺服器→一般網路使用→影音多媒體串流→P2P應用,以確保在流量滿載的情況下,重要的服務還可以正常使用。

目前家中的網路拓樸(Network topology)如下,別理會那個紅圈了,用上這張照片的文章已不知道在草稿堆裡躺多久了。


建立PPPoE連線
  1. 以下二條為浮動/固定IP的PPPoE撥號,分別取名為PPPoE_D與PPPoE_S(Dynamic/Static)。
  2. 命名時若需分隔字元方便辨識時,盡量用"-"或"_",不要用空白鍵給找自己麻煩。
  3. 多WAN連線的情況下不要勾選加入預設路由(Add Default Route),改以手動添加路由表才能指定路由標記(Routing-mark)與路由順序(Distance)。
  4. 浮動IP這一條的Profile要另外選擇,該Profile(PPPoE_D_AutoupdateIP)中以Script的方式將浮動IP更新到路由表中(後述)。
/interface pppoe-client
add disable=no interface=ether1 name=PPPoE_D password=***** profile=PPPoE_D_AutoupdateIP user=*****@hinet.net
add disable=no interface=ether1 name=PPPoE_S password=***** user=*****@ip.hinet.net

建立Interface list,方便後續維護管理用。
/interface list
add comment=defconf name=WAN
add comment=defconf name=LAN
/interface list member
add comment=defconf interface=bridge list=LAN
add comment=defconf interface=ether1 list=WAN
add interface=PPPoE_S list=WAN
add interface=PPPoE_D list=WAN

建立ETH2~5的橋接(預設)
RB450G共有五個實體Port(ETH1~5),每個Port為一張獨立的網卡,若要讓Port與Port間的裝置能夠互連,要先做橋接(Bridge)的動作,在RouterOS預設值中,ETH1為WAN而ETH2~5已預設橋接為LAN,命名為bridge。
/interface bridge
add admin-mac=***** auto-mac=no comment=defconf name=bridge
/interface bridge port
add bridge=bridge comment=defconf interface=ether2
add bridge=bridge comment=defconf interface=ether3
add bridge=bridge comment=defconf interface=ether4
add bridge=bridge comment=defconf interface=ether5

建立DHCP server(預設)
/ip pool
add name=dhcp ranges=192.168.88.181-192.168.88.254
/ip dhcp-server
add address-pool=dhcp disabled=no interface=bridge name=defconf

建立IP address(預設)
這裡定義內外網的IP位址,PPPoE連線後會自動帶出外網IP,而下面這條是內網使用,帶入預設值後系統會自己加進去。
/ip address
add address=192.168.88.1/24 comment=defconf interface=ether2 network=192.168.88.0

建立路由表
依照需求,Router會撥出一個固定IP與一個浮動IP,固定IP給伺服器使用,浮動IP給一般裝置像是電腦/手機/平板/Chromecast使用,這樣做當然不會使頻寬加倍,目的只是在日常使用下不想用固定IP在網路上打滾而已,這裡以裝置是否在DHCP的IP pool內來劃分,所以配置路由表前有一些前置作業。

一樣,為了方便管理,先設一個DHCP的address-list,/ip pool與/ip firewall address-list並不相同,不要搞混了。
/ip firewall address-list
add address=192.168.88.181-192.168.88.254 list=DHCP

然後將從這些裝置出去的連線都加上路由標記(Routing-mark)
/ip firewall mangle
add action=mark-routing chain=prerouting new-routing-mark=to_PPPoE_D passthrough=yes src-address-list=DHCP

路由表由一條或數條路由依照指定的順序(Distance)組織而成,Distance的數字愈小愈優先,Router要送出封包之前會找出符合所有條件且Distance最小的路由,依照其定義的方式送出封包。所以,在每一條路由內,要定義出Dst. Address、Gateway、判斷Gateway是否有效的方法、優先順序及其他條件(例如Routing-mark)。下圖為內網路由,意思是如果某一個封包要往傳到內網(192.168.88.0/24)的某個裝置,就要丟往bridge這個Gateway,可以想像成郵差寄信之前都要做分信的動作。
內網路由

若是要傳往網際網路(0.0.0.0/0)上的裝置,那當然要從PPPoE的Gateway送出,下圖有另一個附加條件是我希望被標上Routing-mark為to_PPPoE_D的封包都要從PPPoE_D送出,所以再Routing-mark的欄位要額外指定,並設一個適當的Distance(這裡設為6),通常條件愈嚴謹,優先權要愈高(Distance數字愈小)。注意若是在建立PPPoE連線時勾選了加入預設路由(Add default gateway),這裡便無法指定Distance及Routing-mark。
外網路由

最後回到路由表的部分,設上這二條就可以讓DHCP的裝置走PPPoE_D,剩下的走PPPoE_S
/ip route
add check-gateway=ping distance=6 gateway=PPPoE_D routing-mark=to_PPPoE_D
add check-gateway=ping distance=7 gateway=PPPoE_S

為了避免PPPoE_S Gateway失效導致封包出不去,再設走PPPoE_D的路由做為備援。
/ip route
add check-gateway=ping comment="Backup PPPoE_S" distance=11 gateway=PPPoE_D

多WAN的情況下需要考慮由外網進來的封包要怎麼回去,若封包從PPPoE_D進到伺服器,但在路由表中該伺服器出去的封包要走PPPoE_S,雖然到的了目的端但卻因為進出的IP不一樣,封包可能會在目的端被丟棄,若要確保封包進出都走一樣的路,必須替這些進來的封包加上Routing-mark做辨識,可以從Profile或Mangle下手,下面是Profile的做法(以Script自動更新浮動IP的位址)。
/ppp profile
add change-tcp-mss=yes name=PPPoE_D_AutoupdateIP on-up="/interface pppoe-client monitor PPPoE_D once do={/ip route rule set [find table=\"PPPoE_D_IN\"] src-address=\"\$\"local-address\"/32\"}"

在/interface pppoe-client中將浮動IP那條的Profile改為上面這個PPPoE_D_AutoupdateIP,並在策略路由中加入這二條,就可以上由固定IP進來的封包被標上PPPoE_D_IN的路由標記,而從浮動IP進來的則被標上PPPoE_S_IN。
/ip route rule
add src-address=***.***.***.*** table=PPPoE_D_IN
add src-address=***.***.***.*** table=PPPoE_S_IN

最後再回到路由表中定義進出同路的路由,雖然策略路由的優先權最高,不會受Distance影響,但依照個人習慣還是統一規則避免日後看不懂,所以以下二條路由都標上Distance=1。
/ip route
add check-gateway=ping distance=1 gateway=PPPoE_D routing-mark=PPPoE_D_IN
add check-gateway=ping distance=1 gateway=PPPoE_S routing-mark=PPPoE_S_IN

整個路由表先後順序如下所示,前三條為系統自行帶出的rule,其distance皆預設為0。
路由表

建立NAT masquerade規則
/ip firewall nat
add action=masquerade chain=srcnat comment="PPPoE NAT" ipsec-policy=out,none out-interface=PPPoE_D
add action=masquerade chain=srcnat ipsec-policy=out,none out-interface=PPPoE_S

到這裡就可以正常上網

1 意見:

作者已經移除這則留言。

張貼留言