RouterOS+Fastnetmon 全自动 BGP 路由黑洞

前言 :

自己起 BGP , 有什么好处?
有小伙伴肯定会说,把路由拉直,乱写 WHOIS 看 Netflix 用… 你们啊 NAIVE !
安全生产在各行各业都是最重要的一环!


本次爆炸实验所需材料 :

VPS1 RouterOS CHR 6.45.8-6.45.9
VPS2 Ubuntu 16.04 安装 Fastnetmon + Exabgp , 选装 Grafana + Influxdb 提升 B 格 .

Vultr 请用相同 Region, 2 台同时开启 Private IP , 放在同一个段内,根据说明书手工配置网卡,打通内网.
https://www.vultr.com/docs/configuring-private-network

实验流程图 :

idlzbe2g0or9.png

新手最想不通的一点 :
ROS 如何把流量数据传给 Fastnetmon , 接着如何发送黑洞路由给 ROS .
Pig God 写的文章本菜鸡 2019 年就看了,然而以上问题我是恶补了 1 年的基础知识才想通 …
ROS 下 : /ip traffic-flow 这个就是输出流量数据的工具

1sqvgvqa0ucl.png
然后 Setting 建议无脑根据本图设定,这样输出数据最精准.接下来是 Traffic Flow Targets : Src 填 ROS 内网 IP , Dst 显然就是你另一台 VPS 的内网 IP . 其它照填 .

接下来我们在 ubuntu 的 VPS 上首先安装 Fastnetmon

  • apt-get install build-essential tcptraceroute socat python-pip traceroute curl -y
  • wget https://raw.githubusercontent.com/pavel-odintsov/fastnetmon/master/src/fastnetmon_install.pl -Ofastnetmon_install.pl
  • perl fastnetmon_install.pl

后编辑 /etc/fastnetmon.conf

  • # Netflow capture method with v5, v9 and IPFIX support
  • netflow = on
  • # it’s possible to specify multiple ports here, using commas as delimiter
  • netflow_port = 2055
  • netflow_host = 0.0.0.0

编辑 /etc/networks_list
把你 BGP 广播的 IP 段写进去 比如 103.114.0.0/24

运行 service fastnetmon start , 再运行 /opt/fastnetmon/fastnetmon_client
看的到有每个 IP 的流量,说明第一步完成无误 .

0zkatz4bygeq.png

接下来安装 exabgp :
pip install exabgp==3.4.20

使用巴西大神写的简易 systemctl 控制脚本 :

vim /etc/init.d/exabgp

  • #!/bin/bash
  • ### BEGIN INIT INFO
  • # Provides: exabgp
  • # Required-Start: $all
  • # Required-Stop:
  • # Default-Start: 2 3 4 5
  • # Default-Stop:
  • ### END INIT INFO
  • VERMELHO=‘\033[1;31m’
  • VERDE=‘\033[1;32m’
  • NC=‘\033[0m’
  • PROCESSO=$(ps -x |grep -v “grep” |grep -v “/bin/bash” |grep exabgp |wc -l);
  • function startExaBGP(){
  • if [ $PROCESSO -eq 0 ]
  • then
  • echo “Iniciandos…”;
  • env exabgp.daemon.user=root \
  • exabgp.daemon.daemonize=true \
  • exabgp.daemon.pid=/var/run/exabgp.pid \
  • exabgp.log.destination=/var/log/exabgp.log \
  • exabgp /etc/exabgp.conf
  • sleep 0.3
  • echo -e “ExaBGP [${VERDE} Iniciado ${NC}] “;
  • else
  • echo -e “ExaBGP já exstá em execuxão. [${VERDE} Ativo ${NC}] “;
  • fi
  • }
  • function stopExaBGP(){
  • if [ $PROCESSO -eq 0 ]
  • then
  • echo -e “ExaBGP não está sendo executado. [${VERMELHO} Parado ${NC}]”;
  • else
  • echo “Parando…”;
  • kill -9 `cat /var/run/exabgp.pid` &>/dev/null
  • echo -e “ExaBGP [${VERMELHO} Parado ${NC}] “;
  • fi
  • }
  • function statusExaBGP(){
  • if [ $PROCESSO -eq 0 ]
  • then
  • echo -e “ExaBGP está [${VERMELHO} Parado ${NC}]”;
  • else
  • echo -e “ExaBGP está [${VERDE} Ativo ${NC}]”;
  • fi
  • echo
  • echo “Logs:”
  • tail /var/log/exabgp.log
  • }
  • case $1 in
  • start )
  • startExaBGP
  • ;;
  • stop )
  • stopExaBGP
  • ;;
  • restart )
  • stopExaBGP
  • sleep 1
  • startExaBGP
  • ;;
  • status )
  • statusExaBGP
  • ;;
  • * )
  • echo “Opção inválida, use start | stop | restart | status”
  • ;;
  • esac

chmod a+x /etc/init.d/exabgp

vim /lib/systemd/system/exabgp.service

  • [Unit]
  • Description=ExaBGP
  • After=network.target remote-fs.target
  • [Service]
  • Type=simple
  • RemainAfterExit=yes
  • ExecStart=/etc/init.d/exabgp start
  • ExecStop=/etc/init.d/exabgp stop
  • ExecReload=/etc/init.d/exabgp restart
  • [Install]
  • WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable exabgp

vim /etc/exabgp.conf

  • group fastnetmon {
  • local-as YOUR-AS-NUMBER;
  • peer-as YOUR-AS-NUMBER;
  • neighbor ROS内网IP {
  • local-address 本地内网IP;
  • family {
  • ipv4 unicast;
  • ipv6 unicast;
  • }
  • }
  • process service-dynamic {
  • run /usr/bin/socat stdout pipe:/var/run/exabgp.cmd;
  • }
  • }

到了这一步最好重启一下 VPS , 然后开始配 ROS 的 BGP.


本文大大降低难度,不起私有 AS 号。直接 2 台 VPS 用现有的 AS 号起 IBGP.

首先新建两条 Filter Rules:

  • /routing filter
  • add action=accept chain=FastNetMon-IN settype=blackhole
  • add action=discard chain=FastNetMon-OUT

之后利用你现有的 BGP instance 两端用相同的 AS 号起 IBGP ~
那么 IBGP 的多跳这里别忘记打勾!
FILTER 选刚才建好的那 2 个 :

4ma1j81o5bmy.png

BGP State 显示 established 之后我们进入 Fastnetmon 详细参数配置 .
又要编辑 /etc/fastnetmon.conf 了,之后你还有得好编辑他了,每做一步编辑一次,不要浪!

  • # Enable/Disable any actions in case of attack
  • enable_ban = on
  • # How long (in seconds) we should keep an IP in blocked state
  • # If you set 0 here it completely disables unban capability
  • ban_time = 1900
  • # Different approaches to attack detection
  • ban_for_pps = off
  • ban_for_bandwidth = on
  • ban_for_flows = off
  • # Limits for Dos/DDoS attacks
  • threshold_mbps = 900
  • # announce blocked IPs with BGP protocol with ExaBGP
  • exabgp = on
  • # specify different communities for host and subnet announces
  • # next_hop 填你内网网卡的IP
  • exabgp_next_hop = 10.25.96.3
  • # Announce /32 host itself with BGP
  • exabgp_announce_host = on
  • # Announce origin subnet of IP address instead IP itself
  • exabgp_announce_whole_subnet = off

解释一下部分参数 : ban_time 按照秒来算,时间到了 IP 解封,这个看你心情设定 .
通过哪种计量单位来 ban , 我们只开启 ban_for_bandwidth , 这就足够了.
threshold_mbps = 900 以上,通常被出问题来的必然被打满 . 10G 口的建议调的更高 .
注意:这是单个 / 32 IP 得到的量,不是所有 IP 的总量 …

那么我们先用 ROS 自带的 bandwidth test 来测一发速模拟一下 DDOS 流量
threshold_mbps = 300 即可
配完之后 service fastnetmon restart 进行暴力测速 (超过设定的 300)

打开你的 ROS /ip route
然后你会发现你的路由表里多了一条从 IBGP 传过来的 /32 路由

meo4t93xgw52.png
自带 BGP Local Pref. 100 属性,我们接下来利用这个特点把他转化为黑洞路由发往公网 .

来到了当初速成班提到的防止路由泄露 Filter 要做好的地方,新建一条,编辑完成后放在 0 号位最优先.
Chain : 自己起 BGP 允许拨出去的 IP 相同的 Chain 即可
Prefix Length 输入 32 , 黑洞路由都是 一个一个 IP 发的 .

2da3cl2vcqt3.png
那么这个 IP 还有什么特点呢?是从 IBGP 发过来的,以及 Local Pref. 100 .
93qxsyor5tez.png
之后 Actions 选项果断 accept 就不截图了 .BGP Actions 我们要给他打上 Vultr 的黑洞社区标签 .
q8z4nbfphhnp.png

最后当然要验证一下路由到底有没有发出去 .
看到 BGP Advertisements 里有这条 /32 路由,且附带了 黑洞社区标签那么基本 OK 了.
当然自己最好本地 traceroute 一发确保路由空了 .

ew7ku9kcz4k5.png


补充知识要点 :

我们仔细看一下 fastnetmon.conf 之后可以发现它控制 exabgp 发路由实际上通过的是 /var/run/exabgp.cmd 这个脚本.
那么有的情况下,fastnetmon 被重启了,之前被 BAN 的 IP 的就永远不会被解封了 – -… 这是一个缺点.
解决方法有两种,重启 exabgp , 那么所有被封的 IP 全部解封.
人工运行一下 exabgp.cmd 单独解封 IP :

  • echo “withdraw route 被封IP next-hop 内网IP” > /var/run/exabgp.cmd

最后一步我们要通知自己被 D 爆以及在群里分享爆炸的喜悦~

利用这个脚本即可:
https://github.com/halbebruno/fastnetmon-telegram/blob/master/telegram_notify_about_attack.sh
把他保存在 /usr/local/bin/notify_about_attack.sh
修改完成后别忘记添加权限 chmod a+x /usr/local/bin/notify_about_attack.sh

Telegram Bot 使用教程 :
https://www.91yunbbs.com/discussion/633
注意一下 userid 之前有一个 “-” 千万别忘记填上 .
作者的变量写的是 : bot$KEY , 那么记得别多写一个 bot 上去.

于是效果如下 :

w3rct4z9qxyw.png


要点已经木有了,接下来是提升 B 格的部分~纯属 SHOW 给小伙伴们看 .

请全程参考以下文章 :
https://ccav.me/fastnetmon-grafana-monitoring-network-traffic-and-ddos-early-warning.html
https://forum.mikrotik.com/viewtopic.php?t=124958

根据文章安装配置 Grafana 和 Influxdb 后,
这里的要点就是编辑 /etc/fastnetmon.conf 中如下字段

  • graphite = on
  • graphite_host = 127.0.0.1
  • graphite_port = 2003
  • graphite_prefix = fastnetmon

作用是把 Fastnetmon 的数据能写入 InfluxDB 数据库 …
最后通过 Grafana 来读取 InfluxDB 中的数据 …

Grafana 添加 DB :
在 Configuration – Data sources 选项里,添加一个 InfluxDB 接口,基本上都是默认参数即可.

8n4k38vkfnj1.png

导入控制台模板 :
选择 Create – Import 选项卡 输入 7378 , 即可导入下面这个控制台
https://grafana.com/grafana/dashboards/7378

导入之后会发现最底下的 Top incoming / Out Going By Subnet 都没办法用.
经查这些面板默认查询数据库中 “networks” 表,然而我们这个是 ROS 导入的数据,所以要改成 “total” 这个表.
截图里的位置,修改一下,这个功能就复活了 .

8l2gxmnz7zac.png

成品效果图 :

pexdjmhphmak.jpg
y0gfwcxcynlw.jpg

于是整个实验按照流程图全部完成了~

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇