|
本帖最后由 stevemorrislian 于 2019-3-15 17:02 编辑
基本设想是国外用移动线路优先,电信用电信出口优先,其他就随缘了
首先是下载2个路由表,一个国内IP地址表,一个电信地址表=>这里的关键是逻辑关系,想清楚与和非的关系,因为出口列表很难用两个 《非》来界定出口方向
GitHub的ChnRoutes路由表,以APNIC的独立系统号为标准,随时更新的
https://github.com/fivesheep/chnroutes/blob/master/chnroutes.py
是用python编写的,也可以直接下载读取的txt文件。或者rsc执行文件,可以放到ROS下去执行
在路由器中建立地址表Domestic,用ip->firewall->address list以后也可以添加这个表
IP -> routes下,修改0.0.0.0/0的移动出口网关,添加Routing Mark=CM
dst-address=0.0.0.0/0 gateway=192.168.100.1 gateway-status=192.168.100.1 reachable via pppoe-out1
distance=1 scope=30 target-scope=10 routing-mark=CM
也就是说这个标签的会走192.168.100.1这个出口。
然后在IP->firewall->mangle下,建立prerouting的chain,在advance下设置条件dest. address list为"非"Domestic,方框的"!“表示非,domestic是下载的地址表
chain=prerouting action=mark-routing new-routing-mark=CM passthrough=yes dst-address-list=!Domestic
其中prerouting的数据链表示在路由前作标记,这样不在Domestic的表中的目标IP,就打了标记CM,路由将选择移动出口
但是国内除了电信,还有联通。而去联通目标也是移动更好。
所以第二选择是电信,方法差不多,就是电信的标记TeleCom,目标地址不用非,也就是没“!”号。
如果有第三,第四出口,都不能用!的地址表
最后还是把不打标记的路由0.0.0.0/0加上,免得数据出不去,实际上考虑的是3出口状态,你懂的!
在nat的配置下,每个方向都要做masquerade,看上去差不多了。考虑到电信,移动的MTU,MSS不同change mss,取最小的值。虽然估计1480也够
chain=forward action=change-mss new-mss=1460 passthrough=yes tcp-flags=syn protocol=tcp log=no log-prefix=""
后面讲我自己遇到的问题
1,原来想只打telecom的标记,因为打标记的路由是优先的,如果打电信路由,国外的就没有标记,想出国的数据就会走到国内(是的。逻辑混乱,但请另外理解),最后没有标记的还是会经过移动出口的
2,想先打移动(移动不肯给公网IP,固定的私网)而不是电信,发现用非电信+非国内打标记,那么国内的标记就会出现2次都打标记的情况(国外也是非电信,与逻辑混乱一个意义),对路由器而言会占用CPU,关键是还会走错地方
3,手贱,选择了自己路由器PPPoE的电信出口,这样就有一个公网IP可以测试用途了(比如voip的电话通过l2tp用来从家里打电话)。这引起了LOG大爆发,赶紧开防火墙
规则:
0 chain=input action=drop src-address-list=BlockIPs log=no log-prefix=""
1 chain=forward action=drop src-address-list=BlockIPs log=no log-prefix=""
2 chain=output action=drop dst-address-list=BlockIPs log=no log-prefix=""
建立黑名单,进出遇到BlockIPs表里的IP地址全部封杀,用mangle,因为黑客也是不固定IP的,就停掉5天,免得地址表太大
chain=input action=add-src-to-address-list protocol=tcp src-address=!172.16.0.0/16 src-address-list=192.168.0.0/16 address-list=BlockIPs address-list-timeout=5d port=21-25 log=no log-prefix=""
原来只想input的可能,发现log内还有很多port=23的试探,加了prerouting,
chain=prerouting action=add-src-to-address-list protocol=tcp src-address=!192.168.0.0/16 src-address-list=!172.16.0.0/16 address-list=BlockIPs address-list-timeout=5d port=21-25 log=no log-prefix=""
对voip盗打电话我比较痛恨,关15天,地址表里也分得清情况
chain=prerouting action=add-src-to-address-list protocol=udp src-address=!192.168.0.0/16 src-address-list=!172.16.0.0/16 address-list=BlockIPs address-list-timeout=2w1d port=5060-5061 log=no log-prefix=""
三天有680个IP被加入BlockIPs,其中1/10来自盗打电话的试探。以后看connections再加规则
4,一个动态路由的测试,为了保障移动出口到国外的带宽,大部分还是走电信出口,但遇到特殊需求时走移动口
开了一个192.168.88.0/24的DHCP,这个地址段中如果访问推文(或者开着这个窗口不关),以后所有数据就去移动,平常即使国外也走电信出口
先建立钩子,一旦访问目标在ToWatch这个List里,就把源IP放进去国外的临时表SourceTemp(过期时间1分钟),这个list内就是自己常看的电视,比如skynet,Bloomberg,twitter这些IP
chain=prerouting action=add-src-to-address-list protocol=tcp src-address=192.168.88.0/24 dst-address-list=ToWatch address-list=SourceTemp address-list-timeout=1m log=no log-prefix=""
然后给源SourceTemp也打上第一个CM的标记就可以了,只要关掉相应的窗口,就回到最后不打标记的出口
5,路由器上同时做dns forward,这样路由器本身就要访问外网,并没有内网192.168.0.0/16作为源地址的连接。为了解决这个问题,另外建立chain=output,条件一样
同时又发现又有大量的dns访问,同样用mangle的input链,从PPPoE进来的外网IP都放入黑名单。
发现不能把forward的上线dns设置为8.8.8.8,因为它太著名,许多污染记录都是针对它,不如找个冷门的dns,只要不在国内,也不通过国内的接口去访问
6,终于找到了解决DNS的方法,不仅要躲在防火墙后,lookup也不能从正常的出口走。好在我本来就通过CAPsMAN管理着多个LAP,用LAP同步8.8.8.8
7,有些用了CDN的网站,被分流后无法正常访问,因为它本身就用了不同的IP,当来源属于不同的IP时就无法正常运作了。我看股票的网站就有这情况,解决方法就是先建立一个表,CDNSites,一旦访问这些IP,就把源IP加入NoCDN,对NoCDN的源暂时(30秒)不走打标记的路由。一旦手机把APP关掉,就恢复按目标IP分流,方法基本同4,只是反着来。
|
|