找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 3311|回复: 43

[Router OS] ROS分流求救

[复制链接]
发表于 2023-8-9 17:00 | 显示全部楼层 |阅读模式
各位大佬:
    求救:想要实现的目标:国内网站通过bgp收中国区AS号,直接从PPPOE出去,其他非中国区走隧道出去192.168.100.2.

目前网络情况如下
1.通过vultr的BGP收了V4的全表:
2.配置了配置WireGuard,打通了家里与vultr的通道
3.安装了bird2,配置文件在/etc/bird这么写:

router id 我的vultrIP;

include "asn_cn.conf";

protocol device {}

protocol static {
        ipv4 {};
}

protocol bgp vultr
{
        local as 我vultr的AS;
        neighbor vultr上面邻居IP asvultr上面邻居AS;
        password "BGP密码";
        source address 我vultr的IP;

  ipv4 {
                import all;
                export none;
  };
        graceful restart on;
        multihop 2;

}

protocol bgp home  #这是去我家的配置
{
        local as 65533;
        neighbor 10.88.88.2 as 65532;
        source address 10.88.88.1;

  ipv4 {
                import none;
                export filter {
                        #if bgp_path ~ [4134, 4809, 36678, 4837, 9929, 9808, 9394, 4538, 23910] then accept; else reject;
                        if bgp_path ~ china_asn then accept; else reject;
                };
  };
}


其中asn_cn.conf文件,通过脚本自动更新了中国区的AS号。


ROS里面配置BGP:ROS---Routing---Filters 这么写了
if (protocol bgp) {set gw pppoe-out1;accept}

这样是实现了所有中国区AS号过滤来的IP通过PPPOE-out1出去了,但是国外的路由不能走隧道192.168.100.2出去,上网海淘深造不了。

请问要这么写才能实现bgp分流,解决上网海淘深造问题呢。

发表于 2023-8-9 17:53 | 显示全部楼层
用bird 没成功过 ,后来用了某位大佬的 CN地址列表,打标分流science数据方法 ,一次成功 ,教程在这www.itxiaoniao.cn/archives/448/

点评

感谢感谢,CN这个地址更新不是很及时,所以就想换个折腾  详情 回复 发表于 2023-8-10 08:30
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-10 08:30 | 显示全部楼层
yangyongzzx 发表于 2023-8-9 17:53
用bird 没成功过 ,后来用了某位大佬的 CN地址列表,打标分流science数据方法 ,一次成功 ,教程在这www.it ...

感谢感谢,CN这个地址更新不是很及时,所以就想换个折腾
回复 支持 反对

使用道具 举报

发表于 2023-8-10 09:44 | 显示全部楼层
那么,你的asn_cn.conf 里面是什么内容呢?你用的脚本又是什么呢?你又如何处理境外VPS自己的IP地址呢?IPv6呢?

对于我用的OSPF,其中routes4.conf 里面是这个样子:

  1. route 1.224.0.0/11 via "ens3";
  2. route 1.208.0.0/12 via "ens3";
  3. route 1.200.0.0/15 via "ens3";
  4. route 1.128.0.0/11 via "ens3";
  5. route 1.160.0.0/12 via "ens3";
  6. route 1.186.0.0/15 via "ens3";
复制代码


对于IPv6部分是这个样子:

  1. route 3000::/4 via "ens3";
  2. route 2800::/5 via "ens3";
  3. route 2700::/8 via "ens3";
  4. route 2680::/9 via "ens3";
  5. route 2640::/10 via "ens3";
  6. route 2620::/11 via "ens3";
  7. route 2610::/12 via "ens3";
  8. route 2608::/13 via "ens3";
  9. route 2606::/16 via "ens3";
  10. route 2607::/17 via "ens3";
复制代码


其中ens3是境外VPS上Ubuntu系统的网卡名字。

点评

asn_cn.conf 里面都是中国区的AS号 自动更新中国asn的python脚本:  详情 回复 发表于 2023-8-10 10:07
asn_cn.conf 里面都是中国区的AS号 自动更新中国asn的python脚本: # version ython 3.7.3 import os import re import urllib.request # 读出文件最后一行 # 参考大神代码https://blog.csdn.net/weixin_30632899  详情 回复 发表于 2023-8-10 09:58
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-10 09:58 | 显示全部楼层
mantouboji 发表于 2023-8-10 09:44
那么,你的asn_cn.conf 里面是什么内容呢?你用的脚本又是什么呢?你又如何处理境外VPS自己的IP地址呢?IPv ...

asn_cn.conf  里面都是中国区的AS号
自动更新中国asn的python脚本:
# version ython 3.7.3
import os
import re
import urllib.request


# 读出文件最后一行
# 参考大神代码https://blog.csdn.net/weixin_30632899/article/details/97566294
def getEndLing(name):
    with open(name, 'rb') as f:
        file_size = os.path.getsize(name)
        offset = -100
        # 文件字节大小为0则返回none
        if file_size == 0:
            return ''
        while True:
            # 判断offset是否大于文件字节数,是则读取所有行,并返回最后一行
            if abs(offset) >= file_size:
                f.seek(-file_size, 2)
                data1 = f.readlines()
                return data1[-1]
            # 游标移动倒数的字节数位置
            f.seek(offset, 2)
            data1 = f.readlines()
            # 判断读取到的行数,如果大于1则返回最后一行,否则扩大offset
            if len(data1) > 1:
                return data1[-1]
            else:
                offset *= 2


file_name = 'asn_cn.conf'
str1 = 'define china_asn = ['
str5 = '];'
datas_source = 'https://whois.ipip.net/countries/CN'

response = urllib.request.urlopen(datas_source)

html = response.read().decode('utf-8')

with open(file_name, 'a') as file:
    file.write(str1 + "\n")
print("step 1.添加文件第一行字符串!")

results = re.findall(', CN\">AS(.*?)</a> </td>', html, re.S)
for result in results:
    with open(file_name, 'a') as file_object:
        str2 = result.strip() + ',' + '\n'
        file_object.write(str2)
print("step 2.采集ASN号数据!")

data2 = getEndLing(file_name)
if data2:
    str3 = data2.decode('utf-8').strip()


with open(file_name,"r",encoding="utf-8") as f:
    lines = f.readlines()
    #print(lines)
with open(file_name,"w",encoding="utf-8") as f_w:
    for line in lines:
        if str3 in line:
            continue
        f_w.write(line)
print("step 3.提取数据完成!")

str4 = str3[:-1]
with open(file_name, 'a') as file:
    file.write(str4 + "\n")
    file.write(str5)

print("step 4.生成中国区ASN成功!")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-10 10:06 | 显示全部楼层
  1. # version :Python 3.7.3
  2. import os
  3. import re
  4. import urllib.request


  5. # 读出文件最后一行
  6. # 参考大神代码https://blog.csdn.net/weixin_30632899/article/details/97566294
  7. def getEndLing(name):
  8.     with open(name, 'rb') as f:
  9.         file_size = os.path.getsize(name)
  10.         offset = -100
  11.         # 文件字节大小为0则返回none
  12.         if file_size == 0:
  13.             return ''
  14.         while True:
  15.             # 判断offset是否大于文件字节数,是则读取所有行,并返回最后一行
  16.             if abs(offset) >= file_size:
  17.                 f.seek(-file_size, 2)
  18.                 data1 = f.readlines()
  19.                 return data1[-1]
  20.             # 游标移动倒数的字节数位置
  21.             f.seek(offset, 2)
  22.             data1 = f.readlines()
  23.             # 判断读取到的行数,如果大于1则返回最后一行,否则扩大offset
  24.             if len(data1) > 1:
  25.                 return data1[-1]
  26.             else:
  27.                 offset *= 2


  28. file_name = 'asn_cn.conf'
  29. str1 = 'define china_asn = ['
  30. str5 = '];'
  31. datas_source = 'https://whois.ipip.net/countries/CN'

  32. response = urllib.request.urlopen(datas_source)

  33. html = response.read().decode('utf-8')

  34. with open(file_name, 'a') as file:
  35.     file.write(str1 + "\n")
  36. print("step 1.添加文件第一行字符串!")

  37. results = re.findall(', CN">AS(.*?)</a> </td>', html, re.S)
  38. for result in results:
  39.     with open(file_name, 'a') as file_object:
  40.         str2 = result.strip() + ',' + '\n'
  41.         file_object.write(str2)
  42. print("step 2.采集ASN号数据!")

  43. data2 = getEndLing(file_name)
  44. if data2:
  45.     str3 = data2.decode('utf-8').strip()


  46. with open(file_name,"r",encoding="utf-8") as f:
  47.     lines = f.readlines()
  48.     #print(lines)
  49. with open(file_name,"w",encoding="utf-8") as f_w:
  50.     for line in lines:
  51.         if str3 in line:
  52.             continue
  53.         f_w.write(line)
  54. print("step 3.提取数据完成!")

  55. str4 = str3[:-1]
  56. with open(file_name, 'a') as file:
  57.     file.write(str4 + "\n")
  58.     file.write(str5)

  59. print("step 4.生成中国区ASN成功!")
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-10 10:07 | 显示全部楼层
mantouboji 发表于 2023-8-10 09:44
那么,你的asn_cn.conf 里面是什么内容呢?你用的脚本又是什么呢?你又如何处理境外VPS自己的IP地址呢?IPv ...

asn_cn.conf  里面都是中国区的AS号
自动更新中国asn的python脚本:
  1. # version :Python 3.7.3
  2. import os
  3. import re
  4. import urllib.request


  5. # 读出文件最后一行
  6. # 参考大神代码https://blog.csdn.net/weixin_30632899/article/details/97566294
  7. def getEndLing(name):
  8.     with open(name, 'rb') as f:
  9.         file_size = os.path.getsize(name)
  10.         offset = -100
  11.         # 文件字节大小为0则返回none
  12.         if file_size == 0:
  13.             return ''
  14.         while True:
  15.             # 判断offset是否大于文件字节数,是则读取所有行,并返回最后一行
  16.             if abs(offset) >= file_size:
  17.                 f.seek(-file_size, 2)
  18.                 data1 = f.readlines()
  19.                 return data1[-1]
  20.             # 游标移动倒数的字节数位置
  21.             f.seek(offset, 2)
  22.             data1 = f.readlines()
  23.             # 判断读取到的行数,如果大于1则返回最后一行,否则扩大offset
  24.             if len(data1) > 1:
  25.                 return data1[-1]
  26.             else:
  27.                 offset *= 2


  28. file_name = 'asn_cn.conf'
  29. str1 = 'define china_asn = ['
  30. str5 = '];'
  31. datas_source = 'https://whois.ipip.net/countries/CN'

  32. response = urllib.request.urlopen(datas_source)

  33. html = response.read().decode('utf-8')

  34. with open(file_name, 'a') as file:
  35.     file.write(str1 + "\n")
  36. print("step 1.添加文件第一行字符串!")

  37. results = re.findall(', CN">AS(.*?)</a> </td>', html, re.S)
  38. for result in results:
  39.     with open(file_name, 'a') as file_object:
  40.         str2 = result.strip() + ',' + '\n'
  41.         file_object.write(str2)
  42. print("step 2.采集ASN号数据!")

  43. data2 = getEndLing(file_name)
  44. if data2:
  45.     str3 = data2.decode('utf-8').strip()


  46. with open(file_name,"r",encoding="utf-8") as f:
  47.     lines = f.readlines()
  48.     #print(lines)
  49. with open(file_name,"w",encoding="utf-8") as f_w:
  50.     for line in lines:
  51.         if str3 in line:
  52.             continue
  53.         f_w.write(line)
  54. print("step 3.提取数据完成!")

  55. str4 = str3[:-1]
  56. with open(file_name, 'a') as file:
  57.     file.write(str4 + "\n")
  58.     file.write(str5)

  59. print("step 4.生成中国区ASN成功!")
复制代码
回复 支持 反对

使用道具 举报

发表于 2023-8-10 10:27 | 显示全部楼层
这是我看到其他人的介绍,没仔细研究,供你参考:

https://www.truenasscale.com/2021/12/27/423.html

点评

这个就是上网海淘的流量要打标签,我是在想是不是可以不用打标签,通过路由表出去 bird收中国区路由 与 需要science的路由 最终实现: 中国区路由通过PPPOE出去 science的路由通过隧道出去  详情 回复 发表于 2023-8-10 10:32
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-10 10:32 | 显示全部楼层
mantouboji 发表于 2023-8-10 10:27
这是我看到其他人的介绍,没仔细研究,供你参考:

https://www.truenasscale.com/2021/12/27/423.html ...

这个就是上网海淘的流量要打标签,我是在想是不是可以不用打标签,通过路由表出去
bird收中国区路由  与  需要science的路由
最终实现:
中国区路由通过PPPOE出去
science的路由通过隧道出去

点评

OSPF方案是不需要打什么标签的。BGP方案理论上也不需要吧。核心还是RouterOS这边写好路由规则。 唉。投胎在这么个鬼地方,吃饱了撑的研究这些……  详情 回复 发表于 2023-8-10 11:08
回复 支持 反对

使用道具 举报

发表于 2023-8-10 11:08 | 显示全部楼层
恩山蜡笔 发表于 2023-8-10 10:32
这个就是上网海淘的流量要打标签,我是在想是不是可以不用打标签,通过路由表出去
bird收中国区路由  与  ...

OSPF方案是不需要打什么标签的。BGP方案理论上也不需要吧。核心还是RouterOS这边写好路由规则。

唉。投胎在这么个鬼地方,吃饱了撑的研究这些……

点评

OSPF方案是的,不需要打标签 BGP方案应该是不需要打标签才对,上面那个大佬的最后还是打标签。 我感觉都是路由协议,肯定是做好路由协议,指定出口就行了 哎,生命在于折腾,期待大佬的BGP方案。 大佬如果要收vultr  详情 回复 发表于 2023-8-10 12:21
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-10 12:21 | 显示全部楼层
mantouboji 发表于 2023-8-10 11:08
OSPF方案是不需要打什么标签的。BGP方案理论上也不需要吧。核心还是RouterOS这边写好路由规则。

唉。投 ...

OSPF方案是的,不需要打标签
BGP方案应该是不需要打标签才对,上面那个大佬的最后还是打标签。
我感觉都是路由协议,肯定是做好路由协议,指定出口就行了
哎,生命在于折腾,期待大佬的BGP方案。
大佬如果要收vultr的表,我可以贡献出来。反正机子也是开在那。
回复 支持 反对

使用道具 举报

发表于 2023-8-11 15:39 | 显示全部楼层
我用bgp分流的电信联通,我只会指定AS号的,你这种情况估计得接着if往后写

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

点评

折腾不下去了,还是用回ospf  详情 回复 发表于 2023-8-27 17:17
回复 支持 反对

使用道具 举报

发表于 2023-8-11 15:45 | 显示全部楼层
if (protocol bgp) {set gw pppoe-out1;accept} else {set gw wireguard1;accept}  试试这样不行的话就自己研究这个文档把,问题应该在过滤筛选上 https://help.mikrotik.com/docs/d ... lection+and+Filters

点评

还有就是条件不能用 protocol bgp 了  详情 回复 发表于 2023-8-11 15:49
回复 支持 反对

使用道具 举报

发表于 2023-8-11 15:49 | 显示全部楼层
idoudou 发表于 2023-8-11 15:45
if (protocol bgp) {set gw pppoe-out1;accept} else {set gw wireguard1;accept}  试试这样不行的话就自己 ...

还有就是条件不能用 protocol bgp 了

点评

感谢感谢,感觉也不能用bgp-as-path进行筛选,因为我看那生成的中国区cn的AS号有几十上百个。  详情 回复 发表于 2023-8-13 07:48
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 07:48 | 显示全部楼层
idoudou 发表于 2023-8-11 15:49
还有就是条件不能用 protocol bgp 了

感谢感谢,感觉也不能用bgp-as-path进行筛选,因为我看那生成的中国区cn的AS号有几十上百个。

点评

何苦来哉,岂不是每个包都要经过CPU一长串处理,吃饱了撑的。  详情 回复 发表于 2023-8-13 15:19
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-29 04:37

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表