2020年3月28日 星期六

如何阻擋來try VPN連線的IP with RouterOS (VPN IP banner)


看到Mobile01上的討論
需求 :
  拜請gfx神人,最近發現好像有人會來踹L2TP VPN,所以想問以下兩個問題。
  1.VPN登入的錯誤記錄,有辦法變成獨立的log檔查閱嗎?目前ROS的log檔內容實在太多啦。
  2.來踹的IP可以自動加到address list中嗎?例如列到BanIP的列表中。

神人回覆 : https://www.mobile01.com/topicdetail.php?f=110&t=3205444&p=682&p=682#72357712

結論 >> 先說結論 >> 如果連線, 15分鐘內沒有成功, 就會被block 14天

設定請參考原始作者的文章

這邊是自己消化後, 來理解為何要這樣設定
也不知道對不對, 反正先筆記下來

address list:
friends : 可信賴的list, 可直接接受
mobile : dynamic list, 通過認證的ip list
temp : dynamic list, 暫存區, 還未確認是否為正常的連線ip list
Scanners : dynamic list, 掃port的ip list, 直接drop掉

先參考RouterOS內部的packet flow
https://wiki.mikrotik.com/wiki/Manual:Packet_Flow
https://help.mikrotik.com/docs/display/ROS/Packet+Flow+in+RouterOS




如果是外部連到Router上的l2tp/ipsec VPN server
1. 流到(I), 然後進到[PREROUTING]
2. [PREROUTING]內, 先碰到<RAW PREROUTING>
   a. 接受src-address-list=friends
   b. drop掉src-address-list=Scanners

   /ip firewall raw
   add action=accept chain=prerouting comment=friends src-address-list=friends
   add action=drop chain=prerouting comment=Scanners src-address-list=Scanners
 
3. 進到[INPUT], 碰到<MANGLE INPUT>
   a. 接受所有LAN端來的連線
   b. 接受所有src-address-list=friends的連線
   c. 接受所有src-address-list=mobile的連線
   d. 如果新連線是udp port=1701,500,4500的時候, 而且ip不在temp list中, 先跳到(vpn-point)節點
   e. 在(vpn-point)節點上的連線, 如果src ip不在Scanners list內的話, 就把src ip加到temp list中, 設定16分鐘後timeout

   /ip firewall mangle
   add action=accept chain=input comment="Local area network" src-address=192.168.0.0/16
   add action=accept chain=input comment=friends src-address-list=friends
   add action=accept chain=input comment=mobile src-address-list=mobile
   add action=jump chain=input connection-state=new dst-port=1701,500,4500 \
      jump-target=vpn-point protocol=udp src-address-list=!temp
   add action=add-src-to-address-list address-list=temp address-list-timeout=16m chain=vpn-point \
      src-address-list=!Scanners

4. 從[INPUT]<MANGLE INPUT>, 再進到<FILTER INPUT>
   a. 接受所有src-address-list=friends的連線
   b. 接受所有src-address-list=mobile的連線
   c. drop掉從pppoe-out1進來, 非lan端的src address, 且src ip不在temp list內, conntection state為invalid,或是new
   /ip firewall filter
   add action=accept chain=input comment=friends src-address-list=friends
   add action=accept chain=input comment=mobile src-address-list=mobile
   add action=drop chain=input comment=Outlanders connection-state=invalid,new \
      in-interface=pppoe-out1 src-address-list=!temp src-address-type=!local

到這邊可以看到, 主要就是
    friend 是static list, 預設就都會被accept
temp 是dynamic list, 從udp 1701,500,4500來的新連線, 只要不在Scanner list內, 就都會被先加到temp list
temp 有timeout值
mobile 是dynamic list, 也是都會被accept
    Scanner list就是會直接被drop掉
但是, 現在只有看到src ip被加到temp的動作
完全沒看到src ip甚麼時候被加到mobile or Scanners

Mobile01上, 還有幾個步驟
------------------
/ppp profile
On Up:
:if ([/interface get $interface type]~"in") do={
  :do {/ip firewall address-list add list=mobile address=$"caller-id" timeout=1d} on-error={}
  :do {/ip firewall address-list remove [find list~"(temp|Scanners)" address=$"caller-id" dynamic]} on-error={}
}
在l2tp用的ppp profile內的On up event加上這段script
/interface 下, 在VPN連線上的時候會有多一組l2tp的interface, type是l2tp-in

[MikroTik] /interface> print
Flags: D - dynamic, X - disabled, R - running, S - slave
 #     NAME                                TYPE       ACTUAL-MTU L2MTU  MAX-L2MTU MAC-ADDRESS   
 7 DR  <l2tp-l2tp_user>                    l2tp-in          1450

所以這邊就是在On up的時候, 把/interface下, 有帶"in"得這組src ip加到mobile list, mobile list timeout 1天
然後把這組src ip從temp or Scanner移除
到這邊, 就有mobile list了

------------------
/system scheduler 新增: (scheduling, 1m)
:global vpn
:if ([:typeof $vpn]!="num") do={:set vpn 0}

:local total [/ip firewall mangle get [find chain=vpn-point action=add-src-to-address-list] byte]
:if ($vpn!=$total) do={:set vpn $total ; /system script run vpn-server}

新增一組script, 每一分鐘跑一次
去撈3.e標記的資料量, 如果跟上一次的資料量不相等, 就呼叫system script (如下)

-----------------
/system script 新增:
:global vpn
:local connected [/ip firewall address-list find list=temp dynamic]

:local scanners 0
:foreach i in=$connected do={
  :if ([/ip firewall address-list get $i timeout]<0:1:0) do={
    /ip firewall address-list add list=Scanners address=[get $i address] timeout=14d
    /ip firewall address-list remove $i ; :set scanners ($scanners+1)
  }
}
:if ([:len $connected]>$scanners) do={:set vpn ($vpn-1)}

把/ip firewall下的 所有的temp list都撈出來
如果temp list timeout值小於1分鐘, 就把此ip加到Scanners, 並把原本這temp list移除

-------------------------------
完整的動作會變成
1. 從外面來的udp port 1701,500,4500, ip A,嘗試連線
2. ip A會被先加到temp list (timeout 16分鐘)
3. 如果這次連線有成功, 觸發ppp On up script, ip A就會被移到mobile list(timeout 1天)
4. 下次連線, 如果還沒timeout, 就會被判出是mobile list, 被accept

如果是掃port的
1. 從外面來的udp port 1701,500,4500, ip B,嘗試連線
2. ip B會被先加到temp list (timeout 16分鐘)
3. 此次連線認證失敗, 不會觸發ppp On up script
4. scheduler script每一分鐘就會去看有多少資料量在3.e那個狀態, 如果跟上一次值不一樣就觸發system script
4. system script會去撈所有的temp list, 如果timeout value已經小於1分鐘, 就移到Scanner list(timeout 14天)

所以, 如果連線, 15分鐘內沒有成功, 就會被block 14天

沒有留言:

張貼留言

在Raspberry Pi 2B上跑Docker, AdguardHome, Bitwarden, RPi-Monitor

在Raspberry Pi 2B上跑Docker, AdguardHome, Bitwarden, RPi-Monitor 請先參考前置準備工作 安裝Raspberry Pi 2B 來跑docker 前置準備 安全性考量, 移除預設pi帳號 Ref :     h...