分类 路由器 下的文章

RouterOS使用DNS转发功能实现域名分流解析

之前写过两篇文章介绍实现域名分流解析的方案,一个是使用dnsmasq基于大陆域名白名单分流解析域名,另一个是使用overture替换dnsmasq做域名分流解析
这次介绍的方案与dnsmasq类似,默认使用境外dns服务器解析,境内域名使用白名单转发到境内dns服务器。
routeros在v6.47中增加了静态条目规则type属性,其中包含FWD类型。FWD类型可以将指定域名转发到指定的DNS服务器。
以下以routeros v7.1beta6的chr版本为环境,dns服务器是8.8.8.8和8.8.4.4
增加alicdn.com域名转发给114.114.114.114解析。正则匹配如下

.*\.alicdn\.com$

命令如下

/ip/dns/static/add regexp=".*\\.alicdn\\.com\$" forward-to=114.114.114.114 ttl=300s

详细命令请参考官方wiki
这里使用dnsmasq-china-list做白名单转发给境内dns服务器解析,生成脚本如下

/ip/dns/static/remove [/ip/dns/static/find type=FWD]
/ip/dns/static/add regexp=".*\\.0-100\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp=".*\\.0-6\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp=".*\\.0-gold\\.net\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp=".*\\.00\\.net\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp=".*\\.00042\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp=".*\\.0006266\\.com\$" forward-to=114.114.114.114 ttl=300s
/ip/dns/static/add regexp=".*\\.0007\\.net\$" forward-to=114.114.114.114 ttl=300s
...

脚本有接近7万行,使用intel i5-7200u分配2逻辑核心的虚拟机首次执行需要约3.5分钟,阿里云1核心服务器首次执行需要2.5分钟,再次执行需要7.5分钟,再次执行时会先删除type=FWD的静态条目,脚本执行时cpu占用100%,所以cpu性能较差时需要耐心等待。导入后,dns查询未见cpu使用异常升高。
这里下载我生成的脚本,后期会设置一个定时脚本定期更新。
导入方法:下载后解压,把dnsfwd.rsc上传到routeros,使用

/import dnsfwd.rsc

导入,等待完成。

使用RouterOS自带dns转发功能做域名分流解析优点是可以抛弃openwrt或者linux服务器的小尾巴,实现routeros单一系统完成全部网络功能,特别适合不支持直通的cpu裸装routeros的情况。
缺点和使用dnsmasq分流解析一样,境内域名列表更新不及时,可能导致一些新的域名解析成境外地址。

另外,导入dns转发脚本后不要使用webfig打开dns静态列表,条目太多会卡死。

windows单网卡实现802.1x认证的有线网络共享

以下内容仅适合我的特殊网络情况,仅供参考。

公司使用的是标准802.1x有线互联网认证,认证策略是PEAP/EAP-MSCHAPv2(不验证认证服务器证书)。这种认证策略在桌面操作系统支持的比较好,windows、mac、ubuntu都没有问题,但是在品牌路由器上能很好支持的基本没有。以linux为基础的vyos可以使用linux软件间接实现,openwrt同理,routeros声称可以支持,但是认证策略是PEAP时需要CA证书验证服务器身份切不能关闭,所以routeros也不行。

想使用网络共享是为了给手机wifi,笔记本本来是有移动热点功能的,结果intel的ax200无线网卡与iphone等设备有兼容性问题(表现为wifi连接成功, 不能获取IP地址),且只能使用2.4g频段(可以通过连接5gwifi后再共享的方式破解限制)。

中间使用过usb网卡共享网络给路由器,结果usb网卡在windows下稳定性太差,经常使用一段时间后就消失,只能重启恢复。

最终方案是,笔记本电脑网卡开启vlan功能,一根网线两个vlan,一个vlan走802.1x认证,另一个vlan共享网络。

设备:机械革命CODE01笔记本(realtek有线网卡),路由器mikrotik hap ac2(routeros v7.1beta6)

下载并安装Realtek Ethernet Diagnostic Utility,启用网卡vlan功能,创建vlan10和vlan20分别用于802.1x认证和网络共享。启用vlan后会虚拟出两个网卡,分别对应vlan10 和vlan20,在Utility中修改vlan10虚拟网卡的mac地址为物理网卡mac地址(802.1x绑定了mac地址、用户名和密码)。

routeros使用交换芯片的硬vlan,软vlan经过测试有问题(也可能配置有问题)

/interface/ethernet/switch/vlan
/interface/ethernet/switch/port
/interface/bridge/vlan
/interface/vlan
/ip/address/

routeros配置待完善。

Routeros V7配置策略路由

20201206更新:V7.1beta3中恢复了mangle添加的路由标记自动添加路由表功能

在两年前我写过一篇routeros配置vpn分流大陆ip的文章,里面主要介绍了使用routeros基于源地址和目的地址的策略路由。在使用Routeros V7 测试版的过程中发现V7相比于V6版在路由配置方便有很大变更,所以这篇文章会以Routeros V7为基础介绍策略路由的配置。

网络基本情况
routeros作为家庭唯一路由,通过pppoe接入互联网,通过wireguard连接香港的routeros。

策略路由目标
1,需要翻墙的内网ip:目的地址是境内ip走pppoe默认路由,目的地址是境外IP走wireguard通过香港routeros进入墙外互联网
2,其他内网ip全部走pppoe默认路由

IP地址分配参考上一篇文章Routeros 配置WireGuard

本地lan的地址是192.168.1.1/24,wg-access地址是10.0.0.1/24,wg-hk的地址是10.0.1.1/30,手机wireguard的地址是10.0.0.2/32,笔记本电脑的地址是10.0.0.3/32
香港wg0地址是10.0.1.2/30

配置步骤
1,使用ipip.net发布在github的大陆ip列表生成境内IP地址列表,并导入routeros
在mac或者linux系统上执行下列命令

curl -s https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt |sed -e 's/^/add address=/g' -e 's/$/ list=CNIP/g'|sed -e $'1i\\\n/ip firewall address-list' -e $'1i\\\nremove [/ip firewall address-list find list=CNIP]' -e $'1i\\\nadd address=10.0.0.0/8 list=CNIP comment=private-network' -e $'1i\\\nadd address=172.16.0.0/12 list=CNIP comment=private-network' -e $'1i\\\nadd address=192.168.0.0/16 list=CNIP comment=private-network'>cnip.rsc

把cnip.rsc上传到routeros,执行

/import cnip.rsc

2,配置分流路由表
Routeros V7取消了通过firewall的mangle里添加路由标记自动添加路由表功能,所有这里需要手动添加路由表,v7.1beta3已恢复此功能

/routing/table/add name="gfw" fib

添加IP分流策略路由

/ip/route/add dst-address=0.0.0.0/0 routing-table="gfw" gateway=10.0.1.2

3,新建需要翻墙的内网地址列表,假定192.168.1.100和192.168.1.200需要翻墙

/ip/firewall/address-list/add list=gfw address=192.168.1.100/32
/ip/firewall/address-list/add list=gfw address=192.168.1.200/32

4,给需要翻墙的内网ip添加标记

/ip/firewall/mangle/add chain=prerouting action=mark-routing new-routing-mark=gfw passthrough=yes dst-address-type=!local src-address-list=gfw dst-address-list=!CNIP log=no log-prefix=""

5,配置无污染DNS服务器
参考使用dnsmasq基于大陆域名白名单分流解析域名使用overture替换dnsmasq做域名分流解析

6,测试目的IP分流
在192.168.1.100上执行traceroute命令

traceroute 8.8.4.4
192.168.1.100--->192.168.1.1--->10.0.1.2--->香港服务器公网路由--->8.8.4.4
traceroute 114.114.114.114
192.168.1.100--->192.168.1.1--->PPPoE公网路由---->114.114.114.114

Routeros 配置WireGuard

Routeros在2019年下半年发布了V7的beta版,我在之前文章一直在更新beta版新特性。2020年6月routeros v7beta7系统内核升级到5.6,8月发布了Routeros v7.1 beta2增加了对WireGuard的支持。
WireGuard被视为下一代VPN隧道协议,是类似于gre、ipip隧道的无状态VPN隧道,基于UDP协议,配置简单。

由于Routeros V7还在beta阶段,webfig和winbox等UI控制台还存在很多不完善的地方,下面通过命令行配置。
以下配置基于Routeros V7.1beta2 CHR版。

简单介绍一下拓扑,routeros作为唯一路由器,新建两个wireguard接口:wg-access和wg-hk,wg-access用于手机、PC等在非本地网络下的远程接入,wg-hk用于连接香港VPS用于加速访问境外地址。

本地lan的地址是192.168.1.1/24,wg-access地址是10.0.0.1/24,wg-hk的地址是10.0.1.1/30,手机wireguard的地址是10.0.0.2/32,笔记本电脑的地址是10.0.0.3/32
香港wg0地址是10.0.1.2/30

通过ssh连接routeros或者webfig、winbox的terminal输入命令。
1,wg-access
新建本地routeros的wg-access接口,注意mtu要改成1500,默认是1420,输入下面新建接口命令后会自动创建接口的private-key和对应的public-key

/interface/wireguard/add name="wg-access" mtu=1500 listen-port=50000

给本地routeros的wg-access接口配置IP地址

/ip/address/add address=10.0.0.1/24 interface=wg-access

添加wg-access接口下的客户端peers,注意下面的public-key和preshared-key替换成实际的key,客户端的key在新建空隧道时会自动生成

/interface/wireguard/peers/add interface=wg-access public-key="lYVc...AlE=" allowed-address=10.0.0.2/32 preshared-key="93E...PSA="
/interface/wireguard/peers/add interface=wg-access public-key="lYVc...AlE=" allowed-address=10.0.0.3/32 preshared-key="93E...PSA="

2,wg-hk
新建本地routeros的wg-hk接口

/interface/wireguard/add name="wg-hk" mtu=1500 listen-port=10000

新建香港VPS上routeros的wg0接口

/interface/wireguard/add name="wg0" mtu=1500 listen-port=10000

在香港routeros的wg0接口下添加peer

/interface/wireguard/peers/add interface=wg0 public-key="lYVc...AlE=" allowed-address=10.0.1.1/30 preshared-key="93E...PSA="

给香港routeros的wg0接口配置IP地址

/ip/address/add address=10.0.1.2/30 interface=wg0

在香港routeros上添加本地lan的路由

/ip/route/add dst-address=192.168.1.1/24 gateway=10.0.1.1

在本地routeros的wg-hk接口下添加peer

/interface/wireguard/peers/add interface=wg-hk public-key="lYVc...AlE=" endpoint=香港VPS的公网IP:10000 allowed-address=0.0.0.0/0 preshared-key="93E...PSA="

给本地routeros的wg-hk接口配置IP地址

/ip/address/add address=10.0.1.1/30 interface=wg-hk

配置本地routeros的策略路由
参考Routeros V7配置策略路由routeros配置vpn分流大陆ip

关于routeros的wireguard的说明
1,mtu要修改成1500,使用默认的1420时会有部分cdn不能加载,现象是浏览器报超时错误。mtu问题类似情况参考ikev2 客户端mtu引起的网络故障
2,wireguard每个接口有个自己的公钥对应的路由表,配置peer就是写路由表,routeros v7.1beta2目前有bug,配置多个相同路由的peer,删除后配置的不会恢复之前的路由。
3,routeros v7.1beta2的全局路由表和wireguard的路由表可能存在某些bug,如果配置后不生效,可以删除peer后重新添加。

公网服务器安装routeros后的安全设置

最近很多朋友尝试在vps或者云服务器上安装ros,由于服务器是公网ip,安全风险很大,在这里写一下安装routeros后的安全设置。如何在云服务器上安装routeros,可以参考 Google Cloud Platform(gcp)谷歌云安装Routeros青云主机安装routeros,附一键安装routeros脚本

routeros安装完成首次启动是没有密码的,并且所有管理端口是开放的,也就是说,任何人只要先于你设置了密码,你就失去了控制权。

如果你是公有云(如阿里云,谷歌gcp等)的ecs上安装的话,先要设置安全组或者防火墙只允许自己宽带的公网ip访问,这样可以最大限度保证自己能在第一时间设置密码。如果是普通idc的vps的话,只能加快手速了。

1,使用webfig或者winbox登陆到routeros后,第一件事就是设置密码,路径是/webfig/#System:Password

2,关闭不需要的管理端口,路径是/webfig/#IP:Services,这里建议关闭除winbox和www的所有服务,并把开放的服务修改成其他端口号

3,修改管理员账号,/webfig/#System:Users,新建管理员,记得group选full取得所有权限,使用新管理员账号登陆routeros后禁用admin账号,避免输错管理员账号密码把自己关在外面

4,配置完其他后,记得在防火墙关闭公网dns查询,/webfig/#IP:Firewall.Filter_Rules.new,chain选input,protocol选udp,dst.port写53,in.interface选你的公网接口如ether1,最后action选drop。这样就能防止你的routeros被用来做ddos的放大攻击工具攻击别人,防止云服务商或者idc因为你的攻击行为(尽管非你本意)关闭你的服务器。