主要也是怕自己忘記,打在這邊讓自己以後能用到

------------------------------------新增雙WAN自訂路由----------------------------------------------------------
首先新增2個PPPOE介面,並且取消Add Default Route勾選
接著到Routing>table裡,建立2個table,如pppoe-1與pppoe-2,並且都勾選FIB選項

接著到Routing>Rule選項裡,新增自己的內網網段,如我2個都要走不同位址,那就用2個,並對應到我的WAN上,如我要讓10.10.10.0/24往pppoe-out2介面送,那就這樣設定把他綁定到pppoe2上

接著到IP>routes選項,建立預設路由,並且綁定到自己建立的Rule裡table上,建議Distance都一樣,然後預設
table main,也要建立,且Distance也要一樣,讓他們同時都能進出,不是standby

接著到IP>Firewall>NAT裡,建立2條針對各2個網段的masquerade出去

下一步到IP>Firewall>Mangle裡,建立perouting,標記到我們的Routing table上

這樣就可以讓這2個網段,透過不同的pppoe介面出去

這邊要注意,如果不想讓內網網段,一樣也丟到pppoe介面上去,導致無法透過RouterOS幫忙中轉內網網段
需在Dst.AddressList新建清單,對應的清單,在FireWall的Address List下建立


然後接著要讓2個pppoe介面,均能回應ping封包,需要進行這個操作
(也可以不做,已可進行基礎路由NAT進出)
到Routing>Rule裡,建立Dst Address:0.0.0.0的封包回應,在Src Address部分可以先不用填
僅需建立起對應table為剛剛建立的pppoe-1與pppoe-2,Action均lookup即可,然後comment輸入要注意,要自己能分辨,如這邊是用isp1與isp2進行分辨

接著到System>scripts裡,寫段自動執行腳本,更新剛剛建立的isp1與isp2的Rule中Src Address位置

Name部分,一樣設定你方便辨認的就好,這邊Name以ISP-1紀錄
Source內容部分如下

:local pppoe2IP ""
/ip address {
:foreach i in=[find where interface="pppoe-out1"] do={
:set pppoe2IP [:pick [get $i address] 0 [:find [get $i address] "/"]];
}
}
:if ($pppoe2IP != "") do={
:put ("PPPoE2 IP: " . $pppoe2IP);
# 添加遮罩 /32
:local maskedIP ("$pppoe2IP/32")
/routing/rule {
:foreach i in=[find comment="isp1"] do={
set $i src-address=$maskedIP; # 更新帶入遮罩的 IP
}
}
} else={
:put "PPPoE2 has no IP address assigned!";
}
完成後記得按下Apply後,在案Run Scripts有沒有成功更新到Rules中isp1的Src Address位置

最後再以Scheduler方式,完成自動每10秒更新,防止浮動IP自動斷線重播,位置變換
到System>Scheduler,Name一樣取你看的懂得,Interval部分為時間,格式為時、分、秒
然後在On Event那裡,輸入
/system script run isp1

其中isp1為剛剛建立Scripts的名稱(要注意大小寫),完成後按下OK,即可完成自動更新位置
之後再用手機去ping自己的外網關看有沒有回應即可,如果沒有Ping成功,建議檢查步驟是否有無做錯
或是有無防火牆阻擋
------------------------------------自動黑名單更新----------------------------------------------------------
接著是防火牆黑名單自動更新部分,這邊採用Scripts自動抓取,與Scheduler方式進行更新
防火牆提供者,可以參考GitHub上提供者,如本篇使用的pwlgrzs / Mikrotik-Blacklist,喜歡的可以去支持作者下,截至目前,已高達19萬條黑名單規則,通常每週更新
或是也可以參考下這個最近常常更新的源
alsyundawy mikrotik-blacklist
首先到System>Scripts,新建2個專案

名稱(Name)
pwlgrzs-blacklist-replace
內容(On Event)
/ip firewall address-list remove [find where list="pwlgrzs-blacklist"]; /import file-name=blacklist.rsc; /file remove blacklist.rsc
名稱(Name)
pwlgrzs-blacklist-dl
內容(On Event)
/tool fetch url="https://raw.githubusercontent.com/pwlgrzs/Mikrotik-Blacklist/master/blacklist.rsc" mode=https
之後到System>scheduler下新增

名稱(Name)
dl-mt-blacklist
內容(On Event)
/system script run pwlgrzs-blacklist-dl
名稱(Name)
ins-mt-blacklist
內容(On Event)
/system script run pwlgrzs-blacklist-replace
時間(Interval)部分,建議1天跑一次就好,以我RB5009UG+S+,在新增黑名單時,CPU使用率會跑到30-40%
建議算好時間,挑離峰時間自動更新
並且注意更新防火牆本機的scripts,不可早於下載清單的時間,會導致沒清單可以套用!!
接著到IP>Firewall>Address Lists下看有沒有成功新增

之後到IP>Firewall>Filter Rule下定義要進行套用黑名單的規則

像這邊就是套用自動新增的pwlgrzs-blacklist這規則,套用到pppoe介面下自動丟包
------------------------------------常見資安漏洞封鎖----------------------------------------------------------
接著說下資安部分,首先這邊說明我建立的邏輯,我這邊如果要透過外網連回本家,一律透過wireguard方式回去,能從外網允許存取的,也僅我wireguard的IP192.168.3.2,其餘都視為可疑連線,都先關小黑屋再說
這邊也建議wireguard與WinBOX的port孔,都記得更改,如本範例wireguard為13232,WinBox為22000這樣

首先設定允許部分(這邊建議要執行剩下步驟前,將192.168.3.2、192.168.1.0/24、10.10.10.0/24,設定為白名單
然後將WAN回來的192.168.3.2獨立建一條,方便做紀錄(可看存取次數判斷有無非法連線),剩下2網段直接併這邊先設定WireGuard部分的私人IP允許規則

接著允許我設定Winbox端口,雖然RouterOS預設規則是會禁止外網存取,但是還是建議設定,避免意想不到的意外,這邊設定僅開放內網作存取,可以至AddressList底下建立清單後再套用

接著套用到FilterRules分頁下

再來是防範潛在ping攻擊或嘗試,這邊一樣到FilterRule下建立

完成後要在記得建立個規則,把這個類型的存取,都丟包掉

下一步為結合剛剛上面的自動黑名單部分,防止內網用戶端對黑名單服務進行存取

接著針對弱點端口進行防範,對試著建立連結的IP做紀錄

接著再試著針對自動執行弱點掃描與嘗試自動暴力破解存取的肉雞,建立存清單紀錄

最後一定要記得再設一個把上述2個規則清單,進行drop動作的原則,如本次會產生的BruteForce清單

接著嘗試丟棄Echo Request封包,建議不要直接拒絕ICMP全部類型回應,將會導致RouterOS某些服務會不正常,如DNS的DoH認證相關服務

最後拒絕特定IP一次建立大量連結

最後完成的清單大概如下方,如我的pppoe-out有1跟2,那就一份清單要建立2個,然後順序記得要排好,別把白名單方到最下面,那這樣白名單規則將被上面的拒絕清單給拒絕掉

如我這份清單,順序遞次為,黑名單拒絕>丟棄Echo Reply>pingFlood>對外黑名單拒絕連線>弱點服務連線拒絕>限制單次IP的TCP連線
至於WireGuard允許部分,如果是RouterOS建立的,他會自動允許該端口連線,如果不是透過RouterOS建立,則要自行建立端口放行
接著記得要把admin預設帳號進用掉,建立一個新的高級權限帳號,避免被暴力破解

最後一個針對浮動PPPOE用戶的優勢,遇到被高頻率弱點攻擊,直接變換IP,讓攻擊者肉雞群去跟空氣鬥智鬥勇,如果條件可以,建議還是設置下,要不然如我這張圖沒設的狀態下,10分鐘內被進行6萬次DDOS攻擊,導致家裡服務無法正常存取


首先到system>scripts下建立一個新腳本

source內容部分說明

source文字內容
:local threshold 50
:local detected 0
:log info "[DEBUG] 開始檢查防火牆規則..."
:foreach rule in=[/ip firewall filter find where comment="弱點服務坐牢房間"] do={
:local count [/ip firewall filter get $rule packets]
:log info ("檢查規則 ID:" . $rule . ",當前存取次數:" . $count)
:if ($count >= $threshold) do={
:set detected 1
}
}
:if ($detected = 1) do={
:log warning "[警告] 偵測到高頻存取,重新撥號!"
/interface pppoe-client disable [find name="pppoe-out1"]
/interface pppoe-client disable [find name="pppoe-out2"]
:delay 5
/interface pppoe-client enable [find name="pppoe-out1"]
/interface pppoe-client enable [find name="pppoe-out2"]
}
# **重置計數器**
/ip firewall filter reset-counters [find where comment="弱點服務坐牢房間"]
:log info "[DEBUG] 檢查完畢"
接著利用System>Scheduler下,建立一個1分鐘執行一次偵測

/system script run check_attack_count
附上低於50次的LOG狀態,此時並不會主動斷線重新連線,且會將該條目packets計數歸零

高於50次的LOG狀態,此時主動斷線重新連線,且會將該條目packets計數歸零

------------------------------------家用版防止DDOS----------------------------------------------------------
如果是家用,也沒特別要做什麼,就純上上網,打打遊戲,那可以考慮照下方設置
如本人用途,就也是打打遊戲,上上網,偶爾用DDNS透過WireGuard VPN連回來NAS這樣的話,可以參考如下設置
先把必定會用到的服務,排到最上面

這邊建議要開通MikroTik家的服務端口,如下IP位址
159.148.147.244、159.148.147.229、159.148.147.201、159.148.172.251、159.148.147.251
端口開放,TCP為443,8728,8729,80、UDP端口為15252,123
詳細方式如圖

然後第一個就是拒絕所有PING回應,僅允許自己內部網段這樣
先建立內部網網段清單表

接著建立規則

接著拒絕所有UDP封包,別讓對方探測到,因為UDP在某些情況會返回目標端口未開通,建議也是收到就丟包

下一步,拒絕全部TCP包回應

接著填寫自動化,偵測上方的TCP、UDP、ICMP,在1分鐘內,接收到25000個封包,直接重新撥號取得IP
先到Scripts輸入以下內容

Source內容解釋(此為統計指定類型的封包數總合,超過指定數值自動斷線重連)

Source內容
:local threshold 250000
:local detected 0
:local totalPackets 0
:log info "[DDOS_Guard] 開始檢查防火牆規則..."
# **定義 comment 規則列表**
:local comments {"TCP非核定丟包"; "丟棄UDP包"; "停止PING回應"}
# **遍歷所有 comment 名稱**
:foreach c in=$comments do={
:local ruleId [/ip firewall filter find where comment=$c]
# **確保找到規則**
:if ([:len $ruleId] > 0) do={
:local count [/ip firewall filter get $ruleId value-name=packets]
:set totalPackets ($totalPackets + $count)
} else={
:log warning "[錯誤] 找不到防火牆規則: $c"
}
}
:log info "[DDOS_Guard] 違規項目總計封包數量: $totalPackets"
# **判斷是否超過門檻**
:if ($totalPackets >= $threshold) do={
:set detected 1
:log warning "[警告] 偵測到高頻存取,重新撥號!"
/interface pppoe-client disable [find name="pppoe-out1"]
/interface pppoe-client disable [find name="pppoe-out2"]
:delay 5
/interface pppoe-client enable [find name="pppoe-out1"]
/interface pppoe-client enable [find name="pppoe-out2"]
}
# **重置計數器**
:foreach c in=$comments do={
/ip firewall filter reset-counters [find where comment=$c]
}
:log info "[DDOS_Guard] 檢查完畢,個別項目計數器清空"
接著創建schduler項目,讓他定時跑一次流量偵測

On Event內容
/system script run DDOS_guard
然後如果你有需要,你可以在設置一個統計當前流量使否為DDOS攻擊,然後生成LOG訊息
大概像這樣(非必要),可以有個參考訊息

一樣是用Scripts方式+Scheduler方式達成

Source內容
:local threshold 2000
:local detected 0
# **定義 comment 規則列表**
:local comments {"TCP非核定丟包"; "丟棄UDP包"; "停止PING回應"}
# **遍歷所有 comment 規則**
:foreach c in=$comments do={
:local ruleId [/ip firewall filter find where comment=$c]
# **確認找到規則**
:if ([:len $ruleId] > 0) do={
:local count [/ip firewall filter get $ruleId value-name=packets]
:local name [/ip firewall filter get $ruleId value-name=comment]
# **即時判斷是否超過門檻**
:if ($count >= $threshold) do={
:set detected 1
:log warning ("[警告] 偵測到特定 DDoS 攻擊區塊: " . $name . ",當前存取次數: " . $count)
}
} else={
:log warning ("[錯誤] 找不到防火牆規則: " . $c)
}
}
Scheduler的On Event內容
/system script run DDOS_Detected
這樣下來,至少我是沒被DDOS攻擊了,就算真的在遇到,就斷線自動重新撥號,基本上能抵擋許多許多基礎攻擊....

------------------------------------家用版防止DDOS----------------------------------------------------------
------------------------------------我是分隔線----------------------------------------------------------
另外這邊想詢問問下,要如何能讓wireguard回來的封包,能順利透過自定義的pppoe介面出去?
這邊試的結果,可以從pppoe-out1跟pppoe-out2回來沒問題,但是出去就一定只能透過pppoe-out1
用mangle方式強制引導,會導致只能連回來,但是無法進行任何通訊
想請知道的前輩們指導下
