BakaCai
RouterOS v7 各类隧道的灵活运用&Docker的使用方法

access_time
brush 2090个字
whatshot 4475 ℃

RouterOS v7.1 rc2 开始各项功能总算是可以用了.
最新的rc3, 虽然增加了docker功能, 但是带来了新的Bug. Winbox会在使用中崩溃,mark routing也会失效.
本文为了降低难度, 完全使用winbox配置, v6.4x版本也可完全参考本文进行配置.

那么使用 RouterOS 7.1 rc2 之前你要做的事情是升级到 6.47.10 以上版本
通过 Files - Upload 将routeros-7.1rc2.npk 上传 .
System - Packages - Downgrade 将 6.48.4 stable 升级成 7.1rc2.
这样大多数的配置都能从 v6版本自动转换成v7格式.


接下来我们通过不同的场景,推荐在这个场景下RouterOS最适的隧道.

场景1 : 中国移动无公网IP家宽 - 海外固定公网IP VPS

推荐方式: GRE/IPIP over IPsec

Before we start ...
移动的CGNAT虽然没有公网IP, 但是出口IP基本上是固定的.
这个自制的CloudFlare DDNS脚本可以用来获取自己的出口IP地址.
千万不要指望官方的那个DDNS, 国内的网基本连不上.而且只有CHR版才有 IP-Cloud这个功能, x86版是木有的.
具体使用方法 : https://blog.necosx.net/cf-ddns/

/tool fetch url="http://luispaulo.net/ip" dst-path=myip
:global cfu do={\
:local cfi "zone id(区域ID)";\
:local cfr "record id";\
:local cfe "Cloudflare Email 账号";\
:local cfk "Global API key";\
:local cfd "用于DDNS的域名";\
:local currentIP [file get myip contents];\
:local cfa [:put $currentIP];\
/tool fetch mode=https\
http-method=put\
url="https://api.cloudflare.com/client/v4/zones/$cfi/dns_records/$cfr"\
http-header-field="content-type:application/json,X-Auth-Email:$cfe,X-Auth-Key:$cfk"\
http-data="{\"type\":\"A\",\"name\":\"$cfd\",\"content\":\"$cfa\"}"\
output=none\
}
:delay 1
$cfu

不擅长使用Winbox Cli的还有个简易获取Record ID的方法,在 Linux SSH client中运行以下代码即可 :

curl -X GET "https://api.cloudflare.com/client/v4/zones/区域ID/dns_records" \
-H "x-auth-email:CFemail账号" \
-H "x-auth-key:你的globalapikey" \
-H "content-type: application/json"

把脚本通过 Winbox 复制黏贴到 System-Script里 .
Run Script 一下, 再到 Cloudflare中验证一下有没有更新IP地址.
没有更新的话就两种可能, Record ID写成了其它域名的, 到CF的网络不通畅.

配置完Script之后就可以配置Schedule, Interval 2分钟一次差不多了.如果有多个IP需要更新可以参考图片中的写法.
2.png

接下来到 IP-IPsec-Profiles, 调整一下加密方式, 无须过于强力的:
1.png

创建Gre over IPsec 隧道:
MTU为你PPPoe宽带的 MTU, 移动大多数都是 1480 . 减去 IPSec OverHead 最大值73 , 再减去 Gre包头 24 .
IPsec Secret 填写之后 RouterOS就会自动将普通的Gre隧道转换为Gre over IPsec. 非常便利的功能.
Clamp TCP MSS 必须打勾,Allow Fast Path 必须不打勾.
Local Address 单条宽带的时候不用填写, VPS那头 Remote Address 就填DDNS 域名即可.
3.png

最后配置NAT路由:
IP - Address 给隧道的两头分配一个内网IP地址,比如 10.99.1.1/24 和 10.99.1.2/24
之后ping 一下对面, 验证一下是否成功.
失败的话可以看一下 Log, 通常有3种情况 :
1 被阻断了, 那么IPSec 会无限重连或者会显示 packet have been retransmitted.
2 手残 , 两头的密码不一致.
3 两头加密方式不一致 . 这两种情况在Log里都会有红字提示 .
Ping 通之后还需配置 Src-NAT :
IP-Firewall-NAT 里 Chain : Srcnat , Out Interface选这个隧道 , Action:masquerade.
那么既然这是中等难度教程,我们就不用IP route rule 和 BGP 分流了.
利用这个项目导入chnroutes.rsc :
https://github.com/zealic/autorosvpn
国内的网络显然基本连不上 github的服务器, chnroutes 1年更新1次即可. 把这个文件下载下来用winbox上传到files.
Terminal里面输入 : import chnroutes.rsc即可导入
之后到 IP - Route , 为刚才那条隧道创建一个 Routing Mark
4.png
最后 IP - Firewall - Mangle 进行分流 :
图片中的案例 192.168.10.233 作为需要走隧道的源IP地址, Dst Address list 为 Exclude chnroutes ,new routing mark设置为刚才 IP-route中相同的即可.
5.png


场景2 : 长城宽带无公网IP无固定出口家宽 - 只有部分端口的动态IP NAT VPS

地狱级难度启动~
长城宽带无论是国内还是国际出口都是N条线路Load Balance, 你永远没办法获取固定的IP.
NAT VPS 只有部分端口, 你永远不可能得到 1701 4500.因此 L2TP IPSEC都用不了.

推荐方式 : Wireguard

Wireguard 可以任意设置端口. 把NAT VPS上的Wireguard ListenPort设置到可用端口范围即可.
如果 VPS 连 UDP都给禁了那怎么办 - -?
那还有基于TCP的SSTP可以用 , 方法在第二期的文章中已经详细介绍过了:
https://blog.boom.si/index.php/archives/76/

以CloudFlare Warp 为案例, 介绍一下 RouterOS v7.1 Wireguard的使用方法:
首先你需要找一台海外Linux的VPS 使用wgcf这个项目生成PrivateKey,并注册到CloudFlare的服务器.

mkdir wgcf && cd wgcf
wget -O wgcf https://github.com/ViRb3/wgcf/releases/download/v2.2.8/wgcf_2.2.8_linux_amd64
chmod +x wgcf
./wgcf register

cat wgcf-account.toml 复制private_key = " " 里的内容

按照下图添加一个 Wireguard Interface. 刚才生成的privateKey 黏贴到Winbox中.
MTU为你实际网络环境的MTU减去80,并不是无脑设置成1280就完事...
6.png
添加 Warp 的 Peer:

Publickey 全地球都是一样的 : bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
Endpoint : 162.159.192.1 - 162.159.192.8 里面选一个你顺眼的
Port : 全部是 2408
Allowed Address : 一律 0.0.0.0/0
KeepAlive : 00:00:02

7.png
完事后给Wireguard添加内网IP地址 : 172.16.0.2/24 即可
之后我们到 Tool-Traceroute 验证一下 :
Interface 选之前Wireguard的连Warp的那个 . 网络如果不通可以尝试调整 Max Hops : 40 , Packet size : 60
依然没反应就说明你到 Warp之间的网络被阻断了或者之前参数有配置错误.
8.png

最后对Warp进行分流 :
RouterOS v7 设置 Routing Mark的方式与v6 不同.
需要先到 IP-Route-Tables里创建一个路由表.之后回到 Routes中选择这个Routing Table:
9.png
利用Mangle的分流方式参考上文即可.

在地狱级的使用环境中,NAT VPS那头可能是OpenVZ根本装不了RouterOS.
只能勉强在Linux下装一个Wireguard-GO.
那么只要写对配置也是可以用的:

[Interface]
Address = 内网IP/24
ListenPort = NAT可用端口范围内
PrivateKey = 
Table = off
PostUp = iptables -t nat -A POSTROUTING -o 公网网卡名 -j MASQUERADE


[Peer]
AllowedIPs = 0.0.0.0/0
PublicKey = 
PersistentKeepalive = 2

Table = off 不添加默认路由.
PostUp 为公网网卡设置src-nat为masquerade
Peer这里我们不写 Endpoint . 仅从另一头发起连接.
最后 sysctl 参数里需要添加一条 net.ipv4.ip_forward = 1 用于网卡转发.


场景3 : 无公网IP家宽 - 动态公网IP(Behind NAT)VPS

推荐方式 : L2TP over IPsec 或 WireGuard

显然你依然需要可以穿透 NAT的方式. 直接底层放GRE 隧道在这种情况下是不行的 .
动态拨号VPS的路由器大概率src-nat pppoe-interface , action 是 masquerade .
更换IP之后, 只要你的dst-addr不变, 它依然会使用pppoe更换前的IP作为src-addr .
这就会造成GRE隧道通不了的情况 .
大多数的路由器src-nat用masquerade就会这样. 毕竟VPS商家那边的路由器用户都是不可控的.你没办法远程强制给他更新一下src-nat...

家宽的MTU通常都的来说都是非常小的,低于1300就会导致部分程序不正常了.
这里我们要利用 L2TP的 MRRU功能解决这个问题.MRRU简单理解就是把一个太大的包一切二,送到对面再合并起来.
先在 PPP-Proflie 里创建一个配置文件 , 简单设定一下 本地和对端IP , Change TCP MSS 改为Yes.
再到 PPP-Secret 里创建一个密码文件 , Profile 选你之前创建的那个.
10.png
配置L2TP Server :
Enabled 打勾.
MTU 取2条宽带最低的那一头-50 , MRRU:1500 , Profile 选之前创建好的 .
Use IPsec : Yes , 并设置Ipsec 密码 .
11.png
Client 那头配置很简单 :
connet to 填服务器的 DDNS .
User 和 Password 按照刚才服务端PPP-Secret创建的填写.
Use IPsec打勾并填写Ipsec的密码.
Add Default Route 不要打勾 .
12.png

最后看到 PPP状态为"R"了 就说明一切OK了. 分流参考上文, 同样需要设置src-nat和routing mark.


场景4 : 动态/静态公网IP宽带(无NAT) - 动态公网IP(无NAT)或静态IP VPS

推荐方式 :GRE/IPIP over IPsec over GRE/IPIP

你的网络环境很好.可以挑战一下高难度.
使用最标准的套娃隧道, 性能最好, 也是最不容易被干扰的方式.
方法可以参考第一期文章即可:https://blog.boom.si/index.php/archives/14/


最后你表示对Biu Mike草鸡复合软路由表示不服.
毅然决定用一台3.5刀的AWS lightsail打造成一个单RouterOS系统的全功能软路由.

7.1 rc3加入了docker和 veth interface之后 winbox 和 webconfig都会崩溃...
所以几乎全程都需要在 Cli中配置 , 需要一定的姿势水平.
之后即可用Docker来添加一切RouterOS本体无法实现的功能, 让它成为全功能路由.

RouterOS 运行 Docker 简介

首先...Docker的包是独立的 , 你需要根据自己的平台自行下载 Extra Package , 并将container.npk 上传到routeros , 重启自动会安装好 .

官方说明的详解 :
https://forum.mikrotik.com/viewtopic.php?f=1&t=178342

第1步 : 找台linux虚拟机把容器保存为tar格式拉回来 并上传到 RouterOS .
比如 : docker save xxxxx/xxxx -o /root/666.tar
第2-4步 : 配网络环境
docker与routeros本体通讯实际上是用桥接实现的.

/interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1
/interface/bridge/add name=docker
/ip/address/add address=172.17.0.1/24 interface=docker
/interface/bridge/port add bridge=docker interface=veth1
/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24
/ip/firewall/nat/add chain=dstnat action=dst-nat to-addresses=172.17.0.2 to-ports=19376 protocol=tcp dst-port=19376
/ip/firewall/nat/add chain=dstnat action=dst-nat to-addresses=172.17.0.2 to-ports=19376 protocol=udp dst-port=19376

以上Cli的详解 :
1 先配置veth1 ,添加一个桥接并设置一个gateway (这一步就和传统RouterOS添加Interface,再添加IP,最后配路由分开进行的方式有区别了.一步到位一条命令就完成了)
2 添加一个桥接
3 给桥接配一个和veth同一个网段内的IP地址.
4 为veth配置src-nat
5&6 把 公网19376端口通过dst-nat转发到容器内

第5步 : 将参数传递到docker
也就是docker 运行参数 -e .
在routeros上运行先要做一个 list .

我们平时在linux 里运行 docker并配置参数的方法:

docker run -d --name=xxxx -e MYSQLHOST=114.5.1.4 -e MYSQLDBNAME=assass -e MYSQLUSR=assass -e MYSQLPASSWD=12345678 -e MYSQLPORT=3306

那么上面的代码转换成RouterOS的写法就是:

/container/envs/add list=xxxx name=MYSQLHOST value=114.5.1.4
/container/envs/add list=xxxx name=MYSQLDBNAME value=assass
/container/envs/add list=xxxx name=MYSQLUSR value=assass
/container/envs/add list=xxxx name=MYSQLPASSWD value=12345678
/container/envs/add list=xxxx name=MYSQLPORT value=3306

第6步 : 将外部文件传递到 container内
这一步按照我的理解需要到 /system/disks给RouterOS挂载额外磁盘. 应该是不能直接放在RouterOS默认文件目录下 .
所以尽量找那些只需env参数,无需挂载目录的项目使用 .

第7步 : 配置这个container

/container/add file=666.tar interface=veth1 envlist=xxxx

实际上就是把网络配置和环境配置附加到这个容器上.
第8-9步 : 验证并运行
参考官方案例简单易懂.


熟练掌握以上内容后...
恭喜恁已达到B(Boom)C(Experiment Center)I(Internet)E(Expert)认证水平...(たぶん~

BakaCai
2021/9/10
V1.1

#如无特别声明,该文章均为 BakaCai 原创,转载请遵循 署名-非商业性使用 4.0 国际(CC BY-NC 4.0) 协议,即转载请注明文章来源。
#最后编辑时间为: 2022 年 06 月 19 日





关于 DreamCat

主题名称:DreamCat | 版本:2.8.221001(LTS)

主题开发:HanFengA7 | TeddyNight | Dev-Leo | CornWorld | WhiteBearcn | DFFZMXJ

Designed by HanFengA7 Power by Typecho

Copyright © 2015-2024 by LychApe All rights reserved!

加我的QQ
加我的微博
加我的支付宝
加我的微信