KoolShare

 找回密码
 立即注册
搜索
查看: 66332|回复: 1789

[教程] 华硕及梅林固件改版路由器双线路双拨策略分流方案v2.9.4

  [复制链接]

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
发表于 2018-8-19 03:54:00 | 显示全部楼层 |阅读模式
本帖最后由 妙妙呜 于 2019-1-15 03:41 编辑

新年快乐!

用途

方案主要目的为实现应用中网络带速叠加,也不能实现路由器多个出口链路网络或带宽的聚合,而是帮助大家在双线路双拨接入路由器的不同网络出口之间精准控制网络访问经由路径,提高路由器使用的稳定性、流畅性和带宽资源利用率,挖掘和发挥设备潜能和剩余价值,减少设备重复采购,改善电磁环境。避免因WiFi信号太多,经常为切换使用SSID而纠结,预防选择恐惧症。

脚本配置好系统路由服务后不驻留内存,只有网段数据集和路由匹配规则加载保存在系统及其策略路由数据库里。所配置的路由器内置服务只在数据上行时对目标地址自动进行判断和分流,系统开销很小,不会对下行数据进行任何处理……

“分流是有序的让每辆车按交通规则在事先规划好的路段上行驶,安全性、舒适性、流畅性更好,事故率低;带速叠加好比是给出两条路,随机分配多辆车路权,同时在道路上任意驰骋,无规则约束,可图一时之快野蛮驾驶,虽然短时间可以增加通过量,但无安全保障,易出事故并造成交通拥堵,双线路双拨负载均衡不使用脚本时就是这种情况。”

v2.6.2版起,在双线路通道不设置系统自动分配流量出口,不启用流量叠加效应的前提下,第一通道按目标网段分配流量;脚本通过运行时自动调整路由器主路由表中的负载均衡流量比例因子,使未分配出口的流量由系统负载均衡机制强制输出到第二通道。
在保证路由器使用的稳定性、流畅性和安全可靠性的基础上,针对路由器各通道网卡芯片特性和型号功用存在不同,导致双线路通道计算能力、I/O能力不均衡,此法可最大限度减少弱势通道分流计算和内存读写的运行载荷,提高网络报文数据包通过速率。
其他如自定义网段网址、SS线路、OpenVP-N Server,以及第二配置文件中自定义流向条目项等均按原有模式分流,方式不变。”

重大升级
当前版本:v2.9.4元禧通用版  发布日期:2019/1/15
  • 调整路由器主机内部应用访问外网及外网访问路由器出入口规则策略优先级执行顺序,防止内外部应用之间不按规矩乱抢路由器系统出口资源,严禁乱打架、打群架

v2.9.3元禧通用版  发布日期:2019/1/14
  • 优化系统的流畅度,提高系统的安全性和稳定性。
  • 补充脚本配置文件中的注释说明。
  • 元旦后发现网络运营商网段数据文件下载服务器主机发生地址迁移,且脚本用户访问量激增,运行工况产生变化,导致网络运营商网段数据定时自动更新经常失败。为保证脚本正常运行,强烈建议老用户将软件版本尽快升级到当前最新版本。由于网段数据更新频度不高,建议加大定时更新时间间隔,降低远程服务器访问压力,提高下载成功率。若经常下载失败,建议自行前往https://ispip.clang.cn/网站手工下载获取与脚本预置的8个网络运营商网段数据文件同名的最新CIDR网段数据(在 ISP IP CIDR 列表内点选TXT格式的数据文件,另存文件至本地),下载后直接上传路由器,粘贴覆盖/jffs/scripts/lz/data/目录内同名数据文件,重启脚本即刻生效。

v2.9.2元禧通用版  发布日期:2019/1/12
  • 优化网络运营商网段数据定时更新代码,降低远程服务器访问压力,提高下载成功率(失败后最多重试5次)。
  • 修改脚本配置文件中几处不准确描述。

v2.9.1元禧通用版  发布日期:2018/12/31
  • 发现并修复v2.9.0元禧通用版中一处影响优化SS服务干预代码执行效能的bug。
  • 2018年至此完美收官,不带走一片云彩,明天会更好吗?

v2.9.0元禧通用版  发布日期:2018/12/31
  • 新增网址/网段数据文件中添加注释说明功能,在网址/网段条目后添加“#”注释符号,后面可书写文字说明或助记符号。愿意的话,写首诗也是可以的
  • 在脚本配置文件中开放内置的网址/网段绑定流量出口列表数据处理模式转换条目数阈值配置项,便于用户系统调优。该阈值仅作用于用户自定义目标网址/网段流量出口数据文件及WAN口客户端及源网址/网段流量出口列表绑定数据文件,对WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定数据文件无影响。
  • 优化SS服务干预代码,阻止系统netfilter网络过滤模块对节点服务器线路的报文数据包进行连接跟踪和符号标记,提高传输性能,优化传输过程。

v2.8.9圣诞通用版  发布日期:2018/12/28
  • 新增WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定功能,类似于填写路由器负载均衡设置中的路由规则条目表,可完全取代直接使用IP策略路由命令手工绑定路由器流量出口,实现点对点、点对面、面对点和面对面的网络访问出口经由设定(“点”指某具体IP网址,“面”指某一网段)。与使用netfilter网络过滤匹配标记报文数据包分流方式不同,该功能直接使用系统策略路由分流机制,资源占用少,效率高,不会造成高带宽掉速。限于平台性能,尽管没有设置列表条目数量限制,但建议数量不宜过多,以免脚本启动时系统策略路由库数据加载时间过长。一般几百条的加载时间尚可接受,具体还取决于所用路由器硬件和固件性能。

v2.8.8圣诞通用版  发布日期:2018/12/26
  • 取消WAN口客户端及源网址/网段流量出口列表绑定功能中的低资源占用选项,改为根据列表条目数自动切换分流方式,少于64条时采用命令自动绑定路由器出口,大于64条时使用系统内核的netfilter网络过滤模块分配出口,同时用户自定义目标网址/网段功能也采用相同处理方式。

v2.8.7圣诞通用版  发布日期:2018/12/26
  • WAN口客户端及源网址/网段流量出口列表绑定功能中增加低资源占用选项,不使用路由器系统内核的netfilter网络过滤模块,减少通道CPU及I/O资源运行开销,适用于列表条目<32条(推荐数目)的情况,脚本启动时间会有所延长。
  • 优化网段分流算法逻辑,提高边际运行状态的安全稳定性。
  • 将脚本配置文件中的功能划分为基础设置高级设置两大类,初始用户完成基础设置即可操作脚本正常运行。

v2.8.6圣诞通用版  发布日期:2018/12/24
  • 新增WAN口客户端及源网址/网段流量出口列表绑定功能。不擅长系统IP命令的用户可使用此功能,通过填写IPv4格式的网址/网段列表数据文件,实现对指定客户端设备的路由器流量出口绑定的简单设置。结合用户自定义目标网址/网段流量出口数据文件功能,可实现双向访问。此功能不支持源地址/网段至目标地址/网段单一具体经由的流量出口定义,若要实现此类复杂的流量出口需求,还需使用IP命令在lz_rule_func_config.sh脚本配置文件或自定义的外挂脚本文件中设置。
  • 进一步完善脚本配置文件中的功能注释说明。

重要提示
强烈建议使用你宽带运营商的DNS,许多第三方DNS由于商业等其他原因劫持用户流量,解析返回其指定路径路由的IP网络地址,导致用户不能获得预期路由器流量出口。另外也发现一些用户在路由器和终端上使用的插件或应用修改用户DNS设置,甚至被改成国外DNS,更有甚者以隐藏方式植入,明面上很难觉察。所以当发现流量出口与预期不符时,请检查一下路由器和终端的DNS设置是否正确,lz rule 脚本配置和启动的路由器内置服务只会按照设定方式及APNIC官方等网段数据执行既定逻辑路由流量。

v2.9.4元禧通用版zip完整包  发布日期:2019/1/15
下载地址链接:
lz_rule-v2.9.4.zip.pdf (90.15 KB, 下载次数: 4212)

评分

7

查看全部评分

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-20 04:41:08 | 显示全部楼层
本帖最后由 妙妙呜 于 2019-1-15 02:27 编辑

沙发啊!
板凳变沙发,自己顶!

v2.9.4 通用版 firewall-start 引导脚本代码:
  1. #!/bin/sh
  2. /jffs/scripts/lz/lz_rule.sh
复制代码

v2.9.4 通用版 lz_rule_config.sh 配置脚本代码:
  1. #!/bin/sh
  2. # lz_rule_config.sh v2.9.4
  3. # By LZ 妙妙呜(蛤蟆墩儿)

  4. # 本版本采用CIDR(无类别域间路由,Classless Inter-Domain Routing)技术
  5. # 是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配给客户。
  6. # CIDR将路由集中起来,使一个IP地址代表主要骨干提供商服务的几千个IP地址,从而减轻Internet路由器的负担。
  7. # ————百度百科

  8. #BEIGIN

  9. ## 技巧:上传编辑好的firewall-start文件和本代码至路由器后,开关防火墙即可启动本代码,不必重启路由器。
  10. ##       也可通过SSH命令行窗口直接输入命令运行。
  11. ##       启动/重启        /jffs/scripts/lz/lz_rule.sh
  12. ##       暂停运行         /jffs/scripts/lz/lz_rule.sh stop
  13. ##       终止运行         /jffs/scripts/lz/lz_rule.sh STOP
  14. ##       恢复缺省配置     /jffs/scripts/lz/lz_rule.sh default
  15. ##       模式1启动/重启   /jffs/scripts/lz/lz_rule.sh 1
  16. ##       模式2启动/重启   /jffs/scripts/lz/lz_rule.sh 2
  17. ##       模式3启动/重启   /jffs/scripts/lz/lz_rule.sh 3
  18. ## 提示:暂停命令仅是暂时关闭策略路由服务,重启路由器、线路接入或断开、WAN口IP改变、防火墙开关等事件都会导致本脚本
  19. ##       自启动重新运行。终止命令将彻底停止服务,需SSH命令行窗口手动启动方可运行。
  20. ##       若在Koolshare固件机型上启用过SS服务支持,脚本升级或删除本脚本前请运行停止命令,以清除程序自动
  21. ##       创建的接口文件,亦可手工去/koolshare/ss/postscripts/目录清除P99_lz_rule.sh文件。

  22. ## ----------------------------------------------------
  23. ## ----------------用户运行策略自定义区----------------
  24. ## 缺省设置:
  25. ##       1.去往联通、电信、国内其他ISP、国外ISP的网络访问流量走第一WAN口
  26. ##       2.去往移动、铁通、教育网、长城宽带/鹏博士的网络访问流量走第二WAN口
  27. ##       3.分流模式:模式3
  28. ##                   按目标访问网段匹配网络报文数据包分配出口输出流量
  29. ##                   未被网段数据覆盖的目标网址/网段访问由系统自动分配出口输出流量
  30. ##       4.不干预SS服务
  31. ##       5.OpenVP@NServer客户端访问互联网由系统自动分配出口
  32. ##       6.外网访问路由器使用第一WAN口
  33. ##       7.未启用定时更新ISP网络运营商CIDR网段数据
  34. ##       如有不同需求,请在自定义区修改下面的参数配置

  35. ## 策略规则优先级执行顺序:由高到低排列,系统抢先执行高优先级策略。
  36. ##       OpenVP@NServer客户端访问互联网流量出口分流出口规则
  37. ##       第一WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定出口规则
  38. ##       第二WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定出口规则
  39. ##       最高高优先级用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则
  40. ##       最高优先级用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则
  41. ##       第一WAN口客户端及源网址/网段高优先级流量出口列表绑定出口规则
  42. ##       第二WAN口客户端及源网址/网段高优先级流量出口列表绑定出口规则
  43. ##       SS服务线路绑定干预出口规则
  44. ##       端口分流出口规则
  45. ##       协议分流出口规则
  46. ##       高优先级用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则
  47. ##       用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则
  48. ##       第一WAN口客户端及源网址/网段流量出口列表绑定出口规则
  49. ##       第二WAN口客户端及源网址/网段流量出口列表绑定出口规则
  50. ##       目标网址/网段分流第一WAN口流量出口规则
  51. ##       目标网址/网段分流第二WAN口流量出口规则
  52. ##       国外运营商目标网段流量分流出口规则
  53. ##       路由器主机内部应用访问外网及外网访问路由器出入口规则
  54. ##       未被规则和已定义网址/网段数据覆盖的流量分流出口规则

  55. ## 本脚本将全宇宙所有互联网IPv4地址网段划分为如下8个国内外网络运营商目标网段数据集合,使用中首先将所接入网络
  56. ## 运营商网段对应至相应的路由器出口,其他运营商网段可根据使用需求、所属运营商网络跨网段访问品质、本地网络环
  57. ## 境等因素适当配置出口参数即可,以后可根据使用情况随时调整。


  58. ## 一、基础设置

  59. ## 定义待访问网络运营商目标网段的数据流量路由器出口
  60. ## 0--路由器接入宽带的第一WAN口;
  61. ## 1--路由器接入宽带的第二WAN口;
  62. ## >1--由系统自动分配流量出口,或不使用,或无此网址/网段数据。
  63. ## 注意:1.赋值命令的"="号两边不要有空格;
  64. ##       2.如需自定义客户端或外网特定地址访问的路由器网络出口,请在同目录下的lz_rule_func_config.sh脚本文件中设置。
  65. ##       3.所有网段数据文件均在/jffs/scripts/lz/data/目录中
  66. ##       4.第一次部署本版脚本,请重启路由器后运行。

  67. ## a.中国大陆之外所有运营商目标网段流量出口(网段数据文件:all_cn_cidr.txt,反向使用)
  68. ## 0:使用第一WAN口;
  69. ## 1:使用第二WAN口;
  70. ## >1:由系统自动分配流量出口,或表示不使用或无此网段数据,以下类推。
  71. all_foreign_wan_port=0

  72. ## b.中国电信目标网段流量出口(网段数据文件:chinatelecom_cidr.txt)
  73. chinatelecom_wan_port=0

  74. ## c.中国联通/网通目标网段流量出口(网段数据文件:unicom_cnc_cidr.txt)
  75. unicom_cnc_wan_port=0

  76. ## d.中国移动目标网段流量出口(网段数据文件:cmcc_cidr.txt)
  77. ## 1:表示对中国移动网段的访问使用第二AN口。
  78. cmcc_wan_port=1

  79. ## e.中国铁通目标网段流量出口(网段数据文件:crtc_cidr.txt)
  80. crtc_wan_port=1

  81. ## f.中国教育网目标网段流量出口(网段数据文件:cernet_cidr.txt)
  82. cernet_wan_port=1

  83. ## g.长城宽带/鹏博士目标网段流量出口(网段数据文件:gwbn_cidr.txt)
  84. gwbn_wan_port=1

  85. ## h.中国大陆其他运营商目标网段流量出口(网段数据文件:othernet_cidr.txt)
  86. othernet_wan_port=0

  87. ## 运行模式(双线路接通时)
  88. ## 0--模式1:第一WAN口接入带宽<第二WAN口接入带宽,任一带宽≥200Mbps;
  89. ##           第一WAN口按目标网段匹配网络报文数据包输出流量;
  90. ##           第二WAN口通过系统负载均衡强制输出流经第一WAN口之外的其余流量;
  91. ##           可避免第二WAN口通道200Mbps以上带宽时CPU占用率过高和掉速现象。
  92. ## 1--模式2:第一WAN口接入带宽>第二WAN口接入带宽,任一带宽≥200Mbps;
  93. ##           第一WAN口通过系统负载均衡强制输出流经第二WAN口之外的其余流量;
  94. ##           第二WAN口按目标网段匹配网络报文数据包输出流量;
  95. ##           可避免第一WAN口通道200Mbps以上带宽时CPU占用率过高和掉速现象。
  96. ## >1--模式3:第一WAN口、第二WAM口均按各自目标网段匹配网络报文数据包输出流量。
  97. policy_mode=5
  98. ## 模式1、模式2为高流量性能模式,模式3为精准分流模式。
  99. ## 模式1、模式2中,待访问任一运营商目标网段流量出口参数>1(由系统自动分配流量出口)时,将自动切换至模式3运行。
  100. ## 模式1、模式2可能有1/10的偏流率,但不影响使用中的稳定流畅。
  101. ## 模式3分流精准,高带宽时可能会遇到某一通道由于硬件平台非专用多线路多拨接入路由器的设计原因,不能充分发挥系
  102. ## 统连接跟踪模块I/O性能导致CPU占用率过高和掉速现象。

  103. ## 定时更新ISP网络运营商CIDR网段数据(0--启用;非0--禁用)
  104. regularly_update_ispip_data_enable=5

  105. ## 定时更新时间参数定义([*]表示未设置,每间隔多久用[*/数字]表示,建议在当天0:30后执行定时更新)
  106. ruid_min=*      ## 分钟(0-59)
  107. ruid_hour=*     ## 小时(0-24):"ruid_hour=3"表示每天凌晨3点
  108. ruid_day=*/3    ## 日期(1-31):"ruid_day=*/3"表示每隔3天
  109. ruid_month=*    ## 月份(1-12;或英文缩写Jan、Feb等)
  110. ruid_week=*     ## 周几(0-6,0为周日;或单词缩写Sun、Mon等)
  111. ## 网段数据变更不很频繁,建议加大更新间隔时间,减少存储擦写次数,延长路由器使用寿命,同时有助于降低远程下载
  112. ## 服务器的负荷压力。
  113. ## 下载任务失败后系统最多自动重试5次。若经常下载失败,建议自行前往https://ispip.clang.cn/网站手工下载获取与
  114. ## 上述8个网络运营商网段数据文件同名的最新CIDR网段数据,下载后直接粘贴覆盖/jffs/scripts/lz/data/目录内同名
  115. ## 数据文件,重启脚本即刻生效。


  116. ## 二、高级设置

  117. ## 用户自定义目标网址/网段(1)流量出口(0--第一WAN口;1--第二WAN口;2--由系统自动分配流量出口;>2--禁用)
  118. custom_data_wan_port_1=5

  119. ## 用户自定义目标网址/网段(1)流量出口数据文件
  120. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  121. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  122. custom_data_file_1="/jffs/scripts/lz/data/custom_data_1.txt"

  123. ## 用户自定义目标网址/网段(2)流量出口(0--第一WAN口;1--第二WAN口;2--由系统自动分配流量出口;>2--禁用)
  124. custom_data_wan_port_2=5

  125. ## 用户自定义目标网址/网段(2)流量出口数据文件
  126. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  127. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  128. custom_data_file_2="/jffs/scripts/lz/data/custom_data_2.txt"

  129. ## 第一WAN口客户端及源网址/网段流量出口列表绑定(0--启用;非0--禁用)
  130. wan_1_client_src_addr=5

  131. ## 第一WAN口客户端及源网址/网段流量出口列表绑定数据文件
  132. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  133. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  134. wan_1_client_src_addr_file="/jffs/scripts/lz/data/wan_1_client_src_addr.txt"

  135. ## 第二WAN口客户端及源网址/网段流量出口列表绑定(0--启用;非0--禁用)
  136. wan_2_client_src_addr=5

  137. ## 第二WAN口客户端及源网址/网段流量出口列表绑定数据文件
  138. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  139. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  140. wan_2_client_src_addr_file="/jffs/scripts/lz/data/wan_2_client_src_addr.txt"

  141. ## 第一WAN口客户端及源网址/网段高优先级流量出口列表绑定(0--启用;非0--禁用)
  142. high_wan_1_client_src_addr=5

  143. ## 第一WAN口客户端及源网址/网段高优先级流量出口列表绑定数据文件
  144. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  145. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  146. high_wan_1_client_src_addr_file="/jffs/scripts/lz/data/high_wan_1_client_src_addr.txt"

  147. ## 第二WAN口客户端及源网址/网段高优先级流量出口列表绑定(0--启用;非0--禁用)
  148. high_wan_2_client_src_addr=5

  149. ## 第二WAN口客户端及源网址/网段高优先级流量出口列表绑定数据文件
  150. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  151. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  152. high_wan_2_client_src_addr_file="/jffs/scripts/lz/data/high_wan_2_client_src_addr.txt"

  153. ## 第一WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定(0--启用;非0--禁用)
  154. wan_1_src_to_dst_addr=5

  155. ## 第一WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定数据文件
  156. ## (文本格式,每行的源网址/网段和目标网址/网段之间按顺序用空格隔开,文件路径、名称可自定义和修改)
  157. ## 可以用0.0.0.0/0表示所有未知IP地址。
  158. ## 建议列表条目数量不要多于128条,否则易导致脚本启动时系统策略路由库加载数据时间过长。
  159. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  160. wan_1_src_to_dst_addr_file="/jffs/scripts/lz/data/wan_1_src_to_dst_addr.txt"

  161. ## 第二WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定(0--启用;非0--禁用)
  162. wan_2_src_to_dst_addr=5

  163. ## 第二WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定数据文件
  164. ## (文本格式,每行的源网址/网段和目标网址/网段之间按顺序用空格隔开,文件路径、名称可自定义和修改)
  165. ## 可以用0.0.0.0/0表示所有未知IP地址。
  166. ## 建议列表条目数量不要多于128条,否则易导致脚本启动时系统策略路由库加载数据时间过长。
  167. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  168. wan_2_src_to_dst_addr_file="/jffs/scripts/lz/data/wan_2_src_to_dst_addr.txt"

  169. ## 本地客户端网址/网段流量出口列表绑定黑名单数据文件
  170. ## (文本格式,一个网址/网段一行,文件路径、名称可自定义和修改)
  171. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  172. ## 列入该名单列表的网址/网段不受按网段分流、协议分流和端口分流规则控制
  173. ## 表中的客户端访问外网时,模式1走第二WAN口,模式2走第一WAN口,模式3时由系统自动分配出口。
  174. local_ipsets_file="/jffs/scripts/lz/data/local_ipsets_data.txt"

  175. ## 协议分流(0--启用;非0--禁用)
  176. ## 该功能需要系统中有用于OSI模型第七层应用层控制的layer7模块,否则需重新编译和配置Linux内核,打netfilter
  177. ## 补丁和安装l7-protocals协议包。
  178. l7_protocols=5

  179. ## 协议分流流量出口网络应用层协议绑定列表文件(文件路径、名称可自定义和修改)
  180. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,建议更改文件名或文件存储路径。
  181. ## 文件中协议项取值:0--第一WAN口;1--第二WAN口;>1--禁用。
  182. l7_protocols_file="/jffs/scripts/lz/configs/lz_protocols.txt"

  183. ## 第一WAN口目标访问端口分流
  184. ## (最多可设置15个不连续的端口号埠,仅针对TCP、UDP、UDPLITE、SCTP四类协议端口;不设置且为空时--禁用)
  185. ## 例如,TCP协议端口:wan0_dest_tcp_port=80,443,6881:6889,25671
  186. ## 其中:6881:6889表示6881~6889的连续端口号,不连续的端口号埠之间用英文半角“,”逗号相隔,不要有多余空格。
  187. wan0_dest_tcp_port=
  188. wan0_dest_udp_port=
  189. wan0_dest_udplite_port=
  190. wan0_dest_sctp_port=

  191. ## 第二WAN口目标访问端口分流
  192. ## (最多可设置15个不连续的端口号埠,仅针对TCP、UDP、UDPLITE、SCTP四类协议端口;不设置且为空时--禁用)
  193. wan1_dest_tcp_port=
  194. wan1_dest_udp_port=
  195. wan1_dest_udplite_port=
  196. wan1_dest_sctp_port=

  197. ## SS服务使用路由器WAN口(0--第一WAN口;1--第二WAN口;>1--不干预SS服务)
  198. ## 适配koolshare merlin armv7l固件平台,固件版本7.2以上的科学上@网插件 shadow@socks v4.0.9+。
  199. ## 适配koolshare merlin aarch64固件平台的科学上@网插件 shadow@socks v1.4.2+。
  200. ss_wan_port=5

  201. ## OpenVP@NServer客户端访问互联网路由器出口(0--第一WAN口;1--第二WAN口;>1--由系统自动分配出口)
  202. ## 注意:外网客户端访问路由器内置OpenVP@NServer固定通过路由器第一WAN口。
  203. ovs_client_wan_port=5

  204. ## 路由器主机内部应用访问外网WAN口
  205. ## (0--第一WAN口;1--第二WAN口;2--按网段分流、协议分流和端口分流规则匹配出口;>2--由系统自动分配出口)
  206. ## 该端口也用于外网访问路由器Asuswrt管理界面及内网设备,正常应与DDNS出口保持一致,一般不建议更改缺省值。
  207. ## 大部分380及以下系列版本固件系统DDNS已内部绑定第一WAN口,更改或可导致访问失败。
  208. wan_access_port=0

  209. ## 网址/网段绑定流量出口列表数据处理模式转换条目数阈值(单位:条目数)
  210. ## 列表数据总条目数≤该阈值时,采用系统IP策略路由命令方式将列表中的网址/网段绑定至指定路由器出口。该方式
  211. ## 系统资源占用少,效率高,不会造成高带宽掉速;缺点是网址/网段条目数不能太多,否则会造成脚本启动时系统策
  212. ## 略路由库加载数据时间过长。
  213. ## 列表数据总条目数>该阈值时,采用系统内核的netfilter网络过滤模块标记报文数据包方式将列表中的网址/网段绑
  214. ## 定至指定路由器出口。该方式会增加网络通道CPU运算及I/O资源运行开销,但适合处理大数据量的网址/网段数据。
  215. ## 本阈值仅作用于用户自定义目标网址/网段流量出口数据文件及WAN口客户端及源网址/网段流量出口列表绑定数据文
  216. ## 件,对WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定数据文件无影响。
  217. list_mode_threshold=128

  218. ## 阻止网段分流时分流无效网络数据包(0--启用;非0--禁用)
  219. ## 缺省为禁用;一些网络应用会产生非正常状态网络数据包,若由此导致网络访问故障,请禁用此项。
  220. prevent_invalid_network_packets=5

  221. ## 网段分流时验证网络数据包校验和(0--启用;非0--禁用)
  222. ## 缺省为启用;禁用可减少路由器部分系统运算和I/O操作开销,稍许提高网络吞吐能力,有安全风险。
  223. network_packets_checksum=0

  224. ## 路由表缓存(0--启用;非0--禁用)
  225. ## 缺省为启用。
  226. route_cache=0

  227. ## 外挂用户自定义配置脚本(0--执行,随脚本初始化时启动执行;非0--禁用)
  228. custom_config_scripts=5

  229. ## 外挂用户自定义配置脚本文件全路径文件名(文件路径、名称可自定义和修改)
  230. ## 可在其中加入自定义全局变量并初始化,也可加入随系统启动自动执行的其他自定义脚本代码。
  231. custom_config_scripts_filename="/jffs/scripts/lz/custom_config.sh"

  232. ## 外挂用户自定义双线路脚本(0--执行,仅在双线路同时接通WAN口网络条件下执行;非0--禁用)
  233. custom_dualwan_scripts=5

  234. ## 外挂用户自定义双线路脚本文件全路径文件名(文件路径、名称可自定义和修改)
  235. custom_dualwan_scripts_filename="/jffs/scripts/lz/custom_dualwan_scripts.sh"

  236. ## 外挂用户自定义清理资源脚本(0--执行;非0--禁用)
  237. custom_clear_scripts=5

  238. ## 外挂用户自定义清理资源脚本文件全路径文件名(文件路径、名称可自定义和修改)
  239. custom_clear_scripts_filename="/jffs/scripts/lz/custom_clear_scripts.sh"


  240. ## --------------用户运行策略自定义区结束--------------
  241. ## ----------------------------------------------------

  242. #END
复制代码

v2.9.4 通用版 lz_rule_func_config.sh 配置脚本代码:
  1. #!/bin/sh
  2. # lz_rule_func_config.sh v2.9.4
  3. # By LZ 妙妙呜(蛤蟆墩儿)

  4. # 本版本采用CIDR(无类别域间路由,Classless Inter-Domain Routing)技术
  5. # 是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配给客户。
  6. # CIDR将路由集中起来,使一个IP地址代表主要骨干提供商服务的几千个IP地址,从而减轻Internet路由器的负担。
  7. # ————百度百科

  8. #BEIGIN

  9. ## 技巧:上传编辑好的firewall-start文件和本代码至路由器后,开关防火墙即可启动本代码,不必重启路由器。
  10. ##       也可通过SSH命令行窗口直接输入命令运行。
  11. ##       启动/重启        /jffs/scripts/lz/lz_rule.sh
  12. ##       暂停运行         /jffs/scripts/lz/lz_rule.sh stop
  13. ##       终止运行         /jffs/scripts/lz/lz_rule.sh STOP
  14. ##       恢复缺省配置     /jffs/scripts/lz/lz_rule.sh default
  15. ##       模式1启动/重启   /jffs/scripts/lz/lz_rule.sh 1
  16. ##       模式2启动/重启   /jffs/scripts/lz/lz_rule.sh 2
  17. ##       模式3启动/重启   /jffs/scripts/lz/lz_rule.sh 3
  18. ## 提示:暂停命令仅是暂时关闭策略路由服务,重启路由器、线路接入或断开、WAN口IP改变、防火墙开关等事件都会导致本脚本
  19. ##       自启动重新运行。终止命令将彻底停止服务,需SSH命令行窗口手动启动方可运行。
  20. ##       若在Koolshare固件机型上启用过SS服务支持,脚本升级或删除本脚本前请运行停止命令,以清除程序自动
  21. ##       创建的接口文件,亦可手工去/koolshare/ss/postscripts/目录清除P99_lz_rule.sh文件。

  22. ## ----------------------------------------------------
  23. ## -------客户端或指定网址访问路由器出口自定义区-------

  24. ## 策略规则优先级执行顺序:由高到低排列,系统抢先执行高优先级策略。
  25. ##       OpenVP@NServer客户端访问互联网流量出口分流出口规则
  26. ##       第一WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定出口规则
  27. ##       第二WAN口用户自定义源网址/网段至目标网址/网段流量出口列表绑定出口规则
  28. ##       最高高优先级用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则--优先级ID:IP_RULE_PRIO_CUSTOM_TOP_HIGH
  29. ##       最高优先级用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则--优先级ID:IP_RULE_PRIO_CUSTOM_TOP
  30. ##       第一WAN口客户端及源网址/网段高优先级流量出口列表绑定出口规则
  31. ##       第二WAN口客户端及源网址/网段高优先级流量出口列表绑定出口规则
  32. ##       SS服务线路绑定干预出口规则
  33. ##       端口分流出口规则
  34. ##       协议分流出口规则
  35. ##       高优先级用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则--优先级ID:IP_RULE_PRIO_CUSTOM_HIGH
  36. ##       用户自定义客户端或特定网址/网段流量出口命令绑定分流出口规则--优先级ID:IP_RULE_PRIO_CUSTOM
  37. ##       第一WAN口客户端及源网址/网段流量出口列表绑定出口规则
  38. ##       第二WAN口客户端及源网址/网段流量出口列表绑定出口规则
  39. ##       目标网址/网段分流第一WAN口流量出口规则
  40. ##       目标网址/网段分流第二WAN口流量出口规则
  41. ##       国外运营商目标网段流量分流出口规则
  42. ##       路由器主机内部应用访问外网及外网访问路由器出入口规则
  43. ##       未被规则和已定义网址/网段数据覆盖的流量分流出口规则


  44. ## 自定义客户端或指定特定网址/网段访问的路由器网络出口
  45. ## 提示:可定义一些内网网址/绑定使用指定WAN口访问外网,实际中可随时根据需要将终端IP切换到这些网址,从而
  46. ##       使用指定的WAN口访问外网。现实中有些网站会将访问请求跨网段跳转到另一处,同时会验证你的出口是否
  47. ##       唯一,这时你可能需要这段时间内走固定WAN口出游,这些预定义内网网址/网段就很有用了。
  48. ##       此外,还可在此设定访问某些外网地址使用指定的路由器WAN口。
  49. ##       为提高传输性能,使用命令方式将客户端绑定路由器网络出口后,建议同时将客户端本地网址/网段填入
  50. ##       local_ipsets_data.txt(本地客户端网址/网段流量出口列表绑定黑名单数据文件)中,阻止路由器对该客户
  51. ##       端设备进行额外的网址/网段分流、协议分流及端口分流计算。
  52. ##       此功能也可使用网址/网段列表数据文件方式,通过lz_rule_config.sh中的路由器WAN口客户端及源网址/网段
  53. ##       列表绑定功能或用户自定义目标网址/网段功能来替代,或使用WAN口用户自定义源网址/网段至目标网址/网段
  54. ##       流量出口列表绑定功能替代下述命令方式,该类方式无需填写本地客户端网址/网段流量出口列表绑定黑名单
  55. ##       数据文件,脚本已含内置的自动处理机制。

  56. ## 命令格式:
  57. ##       第一WAN口:ip add [ from 源IP地址/ip网段/all ] [ to 目标IP地址/ip网段/all ] table $WAN0 prio $[优先级]
  58. ##       第二WAN口:ip add [ from 源IP地址/ip网段/all ] [ to 目标IP地址/ip网段/all ] table $WAN1 prio $[优先级]
  59. ##       说明:[...] 为可选项,但前两个[...] 必留其一,且两个[...] 中的IP地址/ip网段/all不能相同;
  60. ##             使用网段表示法时,务必用ip地址计算器(网上找)验算,得到的地址范围内的地址是否是需要的网络地址;
  61. ##             [优先级]为必选项,按照上面的策略优先级执行顺序选择。

  62. ## 为避免脚本升级更新或重新安装导致配置重置为缺省状态,需要重新录入自定义代码,强烈建议将代码放入lz_rule_config.sh中定义的
  63. ## 外挂用户自定义双线路脚本文件中,今后不需要在此文件中重复添加和编辑代码。或可将此文件复制并重命名为上述外挂用户自定义双线
  64. ## 路脚本文件,并在lz_rule_config.sh中设置为可执行状态。另外,切不可在外挂用户自定义双线路脚本文件与本文件中保存相同的可执
  65. ## 行的自定义脚本命令代码。

  66. ## 第二WAN口:路由表ID号为 WAN1
  67. ## 指定如下地址的客户端绑定使用WAN1口访问外网,优先级优先级按上述策略优先级执行顺序选择,条目可添加、减少或删除;
  68. ## 如下命令条目为示例,请根据实际需求修改,不需要可删除(初始处于注释状态,不影响脚本正常运行);
  69. ## 若直接修改下述示例条目命令使用,请删除行首处"#"号注释符。
  70. #ip rule add from 10.0.0.63 table $WAN1 prio $IP_RULE_PRIO_CUSTOM_TOP_HIGH        ## 我的移动机顶盒,必须走第二WAN口的移动宽带才能播放视频
  71. #ip rule add from 10.0.0.234/31 table $WAN1 prio $IP_RULE_PRIO_CUSTOM_HIGH        ## 为我手机和其他设备10.0.0.234~235两个地址预留使用第二WAN口

  72. ## 第一WAN口:路由表ID号为 WAN0
  73. ## 指定如下地址的客户端绑定使用WAN0口访问外网,优先级:优先级按上述策略优先级执行顺序选择,条目可添加、减少或删除;
  74. ## 如下命令条目为示例,请根据实际需求修改,不需要可删除(初始处于注释状态,不影响脚本正常运行);
  75. ## 若直接修改下述示例条目命令使用,请删除行首处"#"号注释符。
  76. #ip rule add from all to 10.0.0.8 table $WAN0 prio $IP_RULE_PRIO_CUSTOM_TOP_HIGH        ## 我的网盘,WAN口应与外网访问路由器WAN口一致
  77. #ip rule add from 10.0.0.8 table $WAN0 prio $IP_RULE_PRIO_CUSTOM_TOP_HIGH        ## 我的网盘,WAN口应与外网访问路由器WAN口一致
  78. #ip rule add from all to 60.12.67.92 table $WAN0 prio $IP_RULE_PRIO_CUSTOM_TOP        ## 使用高优先级通过第一WAN口访问该网址(www.asus.com.cn)
  79. #ip rule add from all to 103.10.4.108 table $WAN0 prio $IP_RULE_PRIO_CUSTOM_TOP_HIGH        ## 使用高优先级通过第一WAN口访问该网址(www.asuscomm.com)
  80. #ip rule add from 10.0.0.76 table $WAN0 prio $IP_RULE_PRIO_CUSTOM        ## 我的 MacBook Air 笔记本,要运行某联通应用,必须使用第一WAN口
  81. #ip rule add from 10.0.0.210 table $WAN0 prio $IP_RULE_PRIO_CUSTOM_TOP_HIGH        ## 我的智能平板电视,需使用固定WAN口访问被ISP绑定的视频
  82. #ip rule add from 10.0.0.228/30 table $WAN0 prio $IP_RULE_PRIO_CUSTOM_TOP        ## 为我手机和其他设备10.0.0.228~229两个地址预留使用第一WAN口


  83. ## 其他自定义脚本代码(仅在双线路同时接通广域网络条件下执行)
  84. ## 若需设置和初始化自定义全局变量请在同目录的lz_rule_config.sh文件内添加相应代码
  85. ## 若需启动或停止服务时清理相关数据和释放占用的系统资源,请在/jffs/scripts/lz/func目录中的lz_clear_custom_scripts_data.sh文件内嵌入相应脚本代码
  86. <<EOF
  87. if [ -f "/目录名/自定义脚本文件名.sh" ]; then
  88.         chmod +x "/目录名/自定义脚本文件名.sh" > /dev/null 2>&1
  89.         /bin/sh /目录名/自定义脚本文件名.sh
  90. fi
  91. EOF


  92. ## -----客户端或指定网址访问路由器出口自定义区结束-----
  93. ## ----------------------------------------------------

  94. #END
复制代码

v2.9.4 通用版 lz_rule.sh 主执行脚本代码:
  1. #!/bin/sh
  2. # lz_rule.sh v2.9.4
  3. # By LZ 妙妙呜(蛤蟆墩儿)

  4. # 本版本采用CIDR(无类别域间路由,Classless Inter-Domain Routing)技术
  5. # 是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配给客户。
  6. # CIDR将路由集中起来,使一个IP地址代表主要骨干提供商服务的几千个IP地址,从而减轻Internet路由器的负担。
  7. # ————百度百科

  8. #BEIGIN

  9. ## 技巧:上传编辑好的firewall-start文件和本代码至路由器后,开关防火墙即可启动本代码,不必重启路由器。
  10. ##       也可通过SSH命令行窗口直接输入命令运行。
  11. ##       启动/重启        /jffs/scripts/lz/lz_rule.sh
  12. ##       暂停运行         /jffs/scripts/lz/lz_rule.sh stop
  13. ##       终止运行         /jffs/scripts/lz/lz_rule.sh STOP
  14. ##       恢复缺省配置     /jffs/scripts/lz/lz_rule.sh default
  15. ##       模式1启动/重启   /jffs/scripts/lz/lz_rule.sh 1
  16. ##       模式2启动/重启   /jffs/scripts/lz/lz_rule.sh 2
  17. ##       模式3启动/重启   /jffs/scripts/lz/lz_rule.sh 3
  18. ## 提示:暂停命令仅是暂时关闭策略路由服务,重启路由器、线路接入或断开、WAN口IP改变、防火墙开关等事件都会导致本脚本
  19. ##       自启动重新运行。终止命令将彻底停止服务,需SSH命令行窗口手动启动方可运行。
  20. ##       若在Koolshare固件机型上启用过SS服务支持,脚本升级或删除本脚本前请运行停止命令,以清除程序自动
  21. ##       创建的接口文件,亦可手工去/koolshare/ss/postscripts/目录清除P99_lz_rule.sh文件。

  22. ## ----------------------------------------------------
  23. ## -------------全局数据定义及初始化-------------------

  24. ## 版本号
  25. LZ_VERSION=v2.9.4

  26. ## 项目文件部署路径
  27. PATH_BASE=/jffs/scripts
  28. PATH_LZ=${PATH_BASE}/lz
  29. PATH_CONFIGS=${PATH_LZ}/configs
  30. PATH_FUNC=${PATH_LZ}/func
  31. PATH_DATA=${PATH_LZ}/data

  32. ## 同步锁文件路径
  33. PATH_LOCK=/var/lock

  34. ## 文件同步锁全路径文件名
  35. LOCK_FILE=${PATH_LOCK}/lz_rule.lock

  36. ## 同步锁文件ID
  37. LOCK_FILE_ID=555

  38. ## 设置文件同步锁
  39. [ ! -d ${PATH_LOCK} ] && {
  40.         mkdir -p ${PATH_LOCK}
  41.         chmod 777 ${PATH_LOCK}
  42. }
  43. exec 555>"${LOCK_FILE}"
  44. flock -x 555

  45. ## 使项目文件部署路径、配置脚本、功能脚本和数据文件处于可运行状态
  46. [ ! -d ${PATH_LZ} ] && mkdir -p ${PATH_LZ}
  47. chmod 775 ${PATH_LZ}
  48. [ ! -d ${PATH_CONFIGS} ] && mkdir -p ${PATH_CONFIGS}
  49. chmod 775 ${PATH_CONFIGS}
  50. [ ! -d ${PATH_FUNC} ] && mkdir -p ${PATH_FUNC}
  51. chmod 775 ${PATH_FUNC}
  52. [ ! -d ${PATH_DATA} ] && mkdir -p ${PATH_DATA}
  53. chmod 775 ${PATH_DATA}
  54. cd ${PATH_FUNC}/
  55. chmod -R 775 *
  56. cd ${PATH_CONFIGS}/
  57. chmod -R 775 *
  58. cd ${PATH_DATA}/
  59. chmod -R 775 *
  60. cd ${PATH_LZ}/
  61. chmod -R 775 *

  62. ## 调用自定义配置子例程宏定义
  63. CALL_CONFIG_SUBROUTINE="source ${PATH_CONFIGS}"

  64. ## 调用功能子例程宏定义
  65. CALL_FUNC_SUBROUTINE="source ${PATH_FUNC}"

  66. ## 初始化脚本配置
  67. ## 输入项:
  68. ##     $1--主执行脚本运行输入参数
  69. ## 返回值:无
  70. ${CALL_FUNC_SUBROUTINE}/lz_initialize_config.sh $1

  71. ## 载入用户自定义配置
  72. ## 策略分流的用户自定义配置在/jffs/scripts/lz/configs/目录下的lz_rule_config.sh
  73. ## 和lz_rule_func_config.sh文件中
  74. ${CALL_CONFIG_SUBROUTINE}/lz_rule_config.sh

  75. ## 载入外挂用户自定义配置脚本文件
  76. if [ "$custom_config_scripts" = "0" -a ! -z "$custom_config_scripts_filename" ]; then
  77.         if [ -f "$custom_config_scripts_filename" ]; then
  78.                 chmod 775 "$custom_config_scripts_filename" > /dev/null 2>&1
  79.                 source "$custom_config_scripts_filename"
  80.         fi
  81. fi

  82. ## 全局常量、变量定义及初始化
  83. ## 输入项:
  84. ##     全局常量
  85. ## 返回值:无
  86. ${CALL_FUNC_SUBROUTINE}/lz_define_global_variables.sh

  87. ## 载入函数功能定义
  88. ${CALL_FUNC_SUBROUTINE}/lz_rule_func.sh

  89. ## ---------------------主执行脚本---------------------

  90. main(){

  91.         ## 启动延时5秒
  92.         sleep 5s

  93.         ## 获取路由器基本信息并输出至系统记录
  94.         ## 输入项:
  95.         ##     全局变量
  96.         ##         route_hardware_type--路由器硬件类型
  97.         ##         route_os_name--路由器操作系统名称
  98.         ##         policy_mode--分流模式
  99.         ## 返回值:
  100.         ##     MATCH_SET--iptables设置操作符宏变量,全局常量
  101.         ##     route_local_ip--路由器本地IP地址,全局变量
  102.         lz_get_route_info

  103.         echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules initializing! -------- >> /tmp/syslog.log

  104.         ## 处理系统负载均衡分流策略
  105.         ## 输入项:
  106.         ##     全局常量
  107.         ## 返回值:无
  108.         lz_sys_load_balance_control

  109.         ## 加载ipset组件:S大神的GT-AC5300_384_21140官改固件提供了自己的支持,不需要加载。
  110.         ## 输入项:无
  111.         ## 返回值:无
  112.         lz_load_ipset_module

  113.         ## 加载hashlimit组件
  114.         ## 输入项:无
  115.         ## 返回值:无
  116.         [ "$limit_client_download_speed" = "0" ] && lz_load_hashlimit_module

  117.         ## 数据清理
  118.         ## 输入项:
  119.         ##     $1--主执行脚本运行输入参数
  120.         ##     全局常量
  121.         ## 返回值:
  122.         ##     ip_rule_exist--删除后剩余条目数,正常为0,全局变量
  123.         lz_data_cleaning $1

  124.         echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules initialized! --------- >> /tmp/syslog.log

  125.         ## 接到停止运行命令
  126.         ## SSH中执行“/jffs/scripts/lz_rule.sh stop”或“/jffs/scripts/lz_rule.sh STOP”,都会立刻停止本脚本配
  127.         ## 置的策略路由服务,若“/jffs/firewall-start”中的“/jffs/scripts/lz_rule.sh”引导启动命令未清除,路
  128.         ## 由器重启、线路接入或断开、防火墙开关等事件都会导致自启动运行本脚本。
  129.         if [ "$1" = "stop" -o "$1" = "STOP" ]; then
  130.                 ## 输出当前分流规则每个优先级的条目数至系统记录
  131.                 ## 输入项:
  132.                 ##     $1--IP_RULE_PRIO_TOPEST--分流规则条目优先级上限数值(例如:IP_RULE_PRIO-19=24981)
  133.                 ##     $2--IP_RULE_PRIO--既有分流规则条目优先级下限数值(例如:IP_RULE_PRIO=25000)
  134.                 ## 返回值:无
  135.                 lz_ip_rule_output_syslog $IP_RULE_PRIO_TOPEST $IP_RULE_PRIO

  136.                 ## 清除接口脚本文件
  137.                 ## 输入项:
  138.                 ##     $1--主执行脚本运行输入参数
  139.                 ##     全局常量
  140.                 ## 返回值:无
  141.                 lz_clear_interface_scripts $1

  142.                 echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules stopped! ------------- >> /tmp/syslog.log

  143.                 return
  144.         fi

  145.         ## 创建firewall-start启动文件并添加脚本引导项
  146.         ## 输入项:
  147.         ##     全局常量
  148.         ## 返回值:无
  149.         lz_create_firewall_start_command

  150.         ## 创建更新ISP网络运营商CIDR网段数据的脚本文件及定时任务
  151.         ## 输入项:
  152.         ##     全局变量及常量
  153.         ## 返回值:无
  154.         lz_create_update_ispip_data_file

  155.         ## 流量路由策略部署
  156.         ## 脚本中先add的rule优先级低
  157.         ## 脚本使用 IP_RULE_PRIO+1 ~ IP_RULE_PRIO_TOPEST 21个优先级,数值越小,优先级越高,网络访问
  158.         ## 数据包优先匹配高优先级规则
  159.         ## 部署条件:双线接入成功,系统内成功自建wan0、wan1路由表,案中规则尚未部署
  160.         ## 重要说明:WAN0口指路由器接入宽带的第一WAN口,路由表为wan0;WAN1口指第二WAN口,路由表为wan1
  161.         ## 案例背景:第一WAN口接联通宽带,100M,响应快,稳定,上行带宽小
  162.         ##           第二WAN口接移动宽带,200M,有些low,承诺话费送的
  163.         ##           尽可能选品质好的宽带接第一WAN口
  164.         ##           若与本案例应用背景不同,可在/jffs/scripts/lz/configs/目录下的lz_rule_config.sh和
  165.         ##           lz_rule_func_config.sh文件中“用户运行策略自定义区”修改路由器策略路由配置

  166.         if [ $( ip route show table $WAN0 | grep -c "dev" ) -gt 0 -a \
  167.                 $( ip route show table $WAN1 | grep -c "dev" ) -gt 0 -a \
  168.                 $ip_rule_exist = 0 ]; then

  169.                 ## 部署流量路由策略
  170.                 ## 输入项:
  171.                 ##     $1--主执行脚本运行输入参数
  172.                 ##     全局常量及变量
  173.                 ## 返回值:无
  174.                 lz_deployment_routing_policy $1

  175.                 ## 输出当前分流规则每个优先级的条目数至系统记录
  176.                 ## 输入项:
  177.                 ##     $1--IP_RULE_PRIO_TOPEST--分流规则条目优先级上限数值(例如:IP_RULE_PRIO-19=24981)
  178.                 ##     $2--IP_RULE_PRIO--既有分流规则条目优先级下限数值(例如:IP_RULE_PRIO=25000)
  179.                 ## 返回值:无
  180.                 lz_ip_rule_output_syslog $IP_RULE_PRIO_TOPEST $IP_RULE_PRIO

  181.                 echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules run ok! -------------- >> /tmp/syslog.log

  182.         else

  183.                 ## 输出当前分流规则每个优先级的条目数至系统记录
  184.                 ## 输入项:
  185.                 ##     $1--IP_RULE_PRIO_TOPEST--分流规则条目优先级上限数值(例如:IP_RULE_PRIO-19=24981)
  186.                 ##     $2--IP_RULE_PRIO--既有分流规则条目优先级下限数值(例如:IP_RULE_PRIO=25000)
  187.                 ## 返回值:无
  188.                 lz_ip_rule_output_syslog $IP_RULE_PRIO_TOPEST $IP_RULE_PRIO

  189.                 ## 清除接口脚本文件
  190.                 ## 输入项:
  191.                 ##     $1--主执行脚本运行输入参数
  192.                 ##     全局常量
  193.                 ## 返回值:无
  194.                 lz_clear_interface_scripts $1

  195.                 echo $(date) [PVID: $]: -------- No LZ $LZ_VERSION rules run! -------------- >> /tmp/syslog.log
  196.         fi
  197. }

  198. echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules come here! ----------- >> /tmp/syslog.log

  199. ## 极限情况下文件锁偶有锁不住的情况发生,与S大神的预期不符,大概我学识浅薄,头脑愚钝,不明就里
  200. ## 还是土鳖办法有时更有效,安全第一,恢复回来了。利用系统自带的策略路由数据库做进程间的异步模式同步,
  201. ## 虽会降低些效率,代码也不好看,但作为同步过程中的二次防御手段还是很值得。一旦脚本执行过程中意外中断,
  202. ## 可通过手工删除垃圾规则条目或重启路由器清理策略路由库中的垃圾数据
  203. if [ $( ip rule show | grep -c "from 168.168.168.168 to 169.169.169.169" ) = 0 ]; then
  204.         ## 临时规则,用于进程间同步,防止启动时系统或其它应用同时调用和执行两个以上的lz脚本实例
  205.         ## 如与系统中现有规则冲突,可酌情修改;高手们会用更好的方法,请教教我,谢啦!
  206.         ip rule add from 168.168.168.168 to 169.169.169.169 table $WAN0

  207.         sleep 1s

  208.         if [ $( ip rule show | grep -c "from 168.168.168.168 to 169.169.169.169" ) -gt 1 ]; then
  209.                 ip rule del from 168.168.168.168 to 169.169.169.169 > /dev/null 2>&1

  210.                 ## 刷新系统cache,使上述命令立即生效
  211.                 ip route flush cache

  212.                 echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules running! ------------- >> /tmp/syslog.log

  213.                 if [ "$1" != "$SS_START" -a "$1" != "$SS_STOP" ]; then
  214.                         echo $(date) [PVID: $]: LZ $LZ_VERSION script commands executed!
  215.                 fi

  216.                 ## 解除文件同步锁
  217.                 flock -u 555
  218.                 rm -rf "${LOCK_FILE}"

  219.                 exit
  220.         fi

  221.         ## 执行主脚本
  222.         main $1

  223.         ## 删除进程间同步用临时规则,要与脚本开始时的添加命令一致
  224.         if [ $( ip rule show | grep -c "from 168.168.168.168 to 169.169.169.169" ) != 0 ]; then
  225.                 ip rule del from 168.168.168.168 to 169.169.169.169 > /dev/null 2>&1
  226.         fi

  227.         ## 刷新系统cache,使上述命令立即生效
  228.         ip route flush cache

  229. else

  230.         echo $(date) [PVID: $]: -------- LZ $LZ_VERSION rules running! ------------- >> /tmp/syslog.log
  231. fi

  232. if [ "$1" != "$SS_START" -a "$1" != "$SS_STOP" ]; then
  233.         echo $(date) [PVID: $]: LZ $LZ_VERSION script commands executed!
  234. fi

  235. ## 解除文件同步锁
  236. flock -u 555
  237. rm -rf "${LOCK_FILE}"

  238. #END
复制代码

主执行脚本精简后,限于篇幅,其它功能性脚本由于数量较多,请下载完整包后查看。

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-19 04:26:44 | 显示全部楼层
本帖最后由 妙妙呜 于 2018-10-13 13:25 编辑

华硕及梅林固件改版路由器双拨不同ISP之策略分流方案v2.2.7通用版
文件名:firewall-start,无后缀,该文件名不可更改,否则系统不认。请将该文件粘贴到路由器的/jffs/scripts/目录下,权限0777,可在WinSCP中查看文件及文件夹的属性并修改权限。注意:相对于初版,脚本中的路径、执行脚本文件名有修改
  1. #!/bin/sh
  2. # firewall-start
  3. cd /jffs/scripts/lz/
  4. ./lz_rule.sh
复制代码

文件名:lz_rule.sh,请将该文件及配套的网段数据文件一并粘贴到/jffs/scripts/lz/目录里,权限0775
请在/jffs/scripts/下建立lz命名的子目录,文件夹权限至少是0775。若要改此文件名(后缀“.sh”不可更改)、路径,需同时修改上面firewall-start文件中的原有路径。注意:相对于之前版本,脚本安装路径有重大改变。此处代码内容与主贴下载链接中完整包一致,为能发表,在敏感词中添加了@标记,复制使用中请注意删除此标记。建议还是用下载的完整包,这里主要用于浏览。
  1. #!/bin/sh
  2. # lz_rule.sh v2.2.7
  3. # By LZ

  4. # 本版本采用CIDR(无类别域间路由,Classless Inter-Domain Routing)技术
  5. # 是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配给客户。
  6. # CIDR将路由集中起来,使一个IP地址代表主要骨干提供商服务的几千个IP地址,从而减轻Internet路由器的负担。
  7. # ————百度百科

  8. #BEIGIN

  9. ## 技巧:上传编辑好的firewall-start文件和本代码至路由器后,开关防火墙即可启动本代码,不必重启路由器。
  10. ##       高手可通过SSH命令行窗口直接调用执行。
  11. ##       启动命令:/jffs/scripts/lz/lz_rule.sh
  12. ##       停止命令:/jffs/scripts/lz/lz_rule.sh stop
  13. ## 提示:停止命令仅是暂时关闭策略路由服务,重启路由器、线路接入或断开、防火墙开关等事件都会导致本脚本自启动重新运行

  14. ## ----------------------------------------------------
  15. ## ----------------用户运行策略自定义区----------------
  16. ## 缺省设置:
  17. ##       1.去往联通、电信、国外ISP的网络访问流量走第一WAN口
  18. ##       2.去往移动、铁通、教育网、长城宽带/鹏博士的网络访问流量走第二WAN口
  19. ##       3.不屏蔽系统负载均衡策略分流功能,去往国内其他ISP以及未被规则和网段数据覆盖的网络访问流量由系统自动分配出口
  20. ##       如有不同需求,请在自定义区修改下面的参数配置

  21. ## 用户策略执行优先级:由低到高排列;系统抢先执行高优先级策略。
  22. ##       未被规则和网段数据覆盖的网络访问--ISP服务器IP网段数据--自定义网址网段--客户端使用自定义函数--SS服务

  23. ## 定义待访问ISP服务器IP网段的路由器数据流量出口
  24. ## 0--访问路由器接入宽带的第一WAN口;1--访问路由器接入宽带的第二WAN口;
  25. ## 0与1之外的无符号整数--不使用或无此网段数据,或在不屏蔽系统负载均衡时由系统自动分配流量出口,在屏蔽系统负载
  26. ## 均衡策略分流功能后,对该ISP目标网段的访问将通过第一WAN口实现。
  27. ## 注意:1.赋值命令的"="号两边不要有空格;
  28. ##       2.如需指定客户端的外网出口,请编辑下面“用户客户端使用指定路由器出口访问外网自定义函数”中的内容。
  29. ##       3.第一次部署本版脚本,请重启路由器后运行。

  30. ## a.中国之外所有IP地址,所用网段数据文件:all_cn_cidr.txt
  31. ## 0:中国之外所有IP地址的访问使用第一WAN口;
  32. ## 1:使用第二WAN口;
  33. ## 大于1:表示不使用或无此网段数据,或在不屏蔽系统负载均衡时由系统自动分配流量出口,以下类推
  34. all_foreign_wan_no=0

  35. ## b.中国电信,所用网段数据文件:chinatelecom_cidr.txt
  36. chinatelecom_wan_no=0

  37. ## c.中国联通/网通,所用网段数据文件:unicom_cnc_cidr.txt
  38. unicom_cnc_wan_no=0

  39. ## d.中国移动,所用网段数据文件:cmcc_cidr.txt
  40. ## 1表示中国移动IP地址的访问使用第二AN口
  41. cmcc_wan_no=1

  42. ## e.中国铁通,所用网段数据文件:crtc_cidr.txt
  43. crtc_wan_no=1

  44. ## f.中国教育网,所用网段数据文件:cernet_cidr.txt
  45. cernet_wan_no=1

  46. ## g.长城宽带/鹏博士,所用网段数据文件:gwbn_cidr.txt
  47. gwbn_wan_no=1

  48. ## h.中国其他ISP
  49. othernet_wan_no_1=3        ## 所用网段数据文件:othernet_cidr.txt,包含数据比较多,必要时,可自主切分成三份分别控制使用
  50. othernet_wan_no_2=5        ## 所用网段数据文件:othernet2_cidr.txt,如不存在,请将该值设为0和1以外的无符号整数
  51. othernet_wan_no_3=5        ## 所用网段数据文件:othernet3_cidr.txt,如不存在,请将该值设为0和1以外的无符号整数

  52. ## i.用户自定义网址网段-1
  53. custom_data_wan_no_1=5

  54. ## 用户自定义网址网段数据文件,文本格式,结构参考前述网段数据文件结构,可自定义文件名,要求填入全路径文件名
  55. custom_data_file_1="/jffs/scripts/lz/custom_data_1.txt"

  56. ## j.用户自定义网址网段-2
  57. custom_data_wan_no_2=5

  58. ## 用户自定义网址网段数据文件,文本格式,结构参考前述网段数据文件结构,可自定义文件名,要求填入全路径文件名
  59. custom_data_file_2="/jffs/scripts/lz/custom_data_2.txt"

  60. ## SS服务使用路由器WAN口(0--第一WAN口;1--第二WAN口;0和1之外的无符号整数--不使用SS服务)
  61. ## 适配Merlin-Koolshare固件版本7.2以上的科学@上网@插件 sh@ado@wso@cks 4.0.9
  62. ss_wan_no=5

  63. ## 是否屏蔽使用系统负载均衡策略中的分流功能
  64. ## 不屏蔽时,脚本会自动降低系统负载均衡策略执行优先级,避免系统负载均衡策略先于用户策略执行。
  65. ## 若屏蔽可获得最佳性能,资源占用率最低,完全由自主掌控流量分流方式。
  66. ## 若不屏蔽,可将去往某ISP网段访问的出口号设为大于1的无符号整数,该网段及所有未被用户策略覆盖的网络访问,将由系统
  67. ## 原生的负载均衡机制自动进行分流控制,如在双拨同一ISP的情况下,若ISP没有限制和封堵,可实现带速叠加效应;若是不同
  68. ## ISP之间,由于网络品质等客观条件存在差异,带速叠加效果有达不到预期的可能。
  69. ## 0--不屏蔽,使用系统负载均衡;1--屏蔽,不使用系统负载均衡
  70. sys_load_balance_idle=0

  71. ## 用户客户端使用指定路由器出口访问外网自定义函数
  72. ## 注意:该函数内容可以为空,但不可删除该脚本函数定义框架
  73. function lz_ip_rule_from_localip_to_wan_outlet() {

  74.         ## 提示:可定义一些网址固定使用指定WAN口访问外网,实际中可根据随时需要将终端IP切换成这些网址,从而使用指定的WAN口外访。
  75.         ##       现实中有些网站会将访问请求跨网段跳转到另一处,同时会验证你的出口是否唯一,这时你可能需要这段时间内走固定WAN口
  76.         ##       出游,这些预定义内网网址就很有用了。

  77.         ## 命令格式:
  78.         ##       去往第一WAN口:ip add [ from 源IP地址/ip网段/all ] [ to 目标IP地址/ip网段/all ] table $WAN0 $IP_RULE_PRIO_0
  79.         ##       去往第二WAN口:ip add [ from 源IP地址/ip网段/all ] [ to 目标IP地址/ip网段/all ] table $WAN1 $IP_RULE_PRIO_1
  80.         ##       说明:[...] 表示可省略不书写,但两个[...] 必留其一;两个[...] 中的IP地址/ip网段/all不能相同;
  81.         ##             使用网段表示法时,务必用ip地址计算器(网上找)算一下,得到的地址范围内的地址是否是你要的那些具体地址

  82.         ## 第二WAN口:路由表ID号为 WAN1
  83.         ## 指定如下地址的客户端仅使用WAN1口访问外网,优先级:IP_RULE_PRIO_1,条目可添加、减少或删除;
  84.         ## 如下命令条目为案例,请根据实际需求修改,不需要可删除(初始处于注释状态,不影响脚本正常运行)。
  85. #        ip rule add from 10.0.0.63 table $WAN1 prio $IP_RULE_PRIO_1                ## 我的移动机顶盒,必须走第二WAN口的移动宽带才能播放视频
  86. #        ip rule add from 10.0.0.234/31 table $WAN1 prio $IP_RULE_PRIO_1        ## 为我手机和其他设备10.0.0.234~235两个地址预留使用第二WAN口

  87.         ## 第一WAN口:路由表ID号为 WAN0
  88.         ## 指定如下地址的客户端仅使用WAN0口访问外网,优先级:IP_RULE_PRIO_0,条目可添加、减少或删除;
  89.         ## 如下命令条目为案例,请根据实际需求修改,不需要可删除(初始处于注释状态,不影响脚本正常运行)。
  90. #        ip rule add from 10.0.0.76 table $WAN0 prio $IP_RULE_PRIO_0                ## 我的 MacBook Air 笔记本,要运行某联通应用,必须使用第一WAN口
  91. #        ip rule add from 10.0.0.210 table $WAN0 prio $IP_RULE_PRIO_0        ## 我的智能平板电视,需使用固定WAN口访问被ISP绑定的视频
  92. #        ip rule add from 10.0.0.228/30 table $WAN0 prio $IP_RULE_PRIO_0        ## 为我手机和其他设备10.0.0.228~229两个地址预留使用第一WAN口

  93.         return 0
  94. }

  95. ## --------------用户运行策略自定义区结束--------------
  96. ## ----------------------------------------------------


  97. ## -------------全局常量、变量定义及初始化-------------

  98. ## 第一WAN口路由表ID号
  99. WAN0=100

  100. ## 第二WAN口路由表ID号
  101. WAN1=200

  102. ## 第一WAN口报文数据包标记
  103. FWMARK0=0x9999

  104. ## 第二WAN口报文数据包标记
  105. FWMARK1=0x8888

  106. ## 用户自定义网址网段报文数据包标记-1
  107. CUSTOM_FWMARK_0=0x7777

  108. ## 用户自定义网址网段报文数据包标记-2
  109. CUSTOM_FWMARK_1=0x6666

  110. ## 策略规则基础优先级
  111. IP_RULE_PRIO=25000

  112. ## 第一WAN口自定义策略规则优先级
  113. IP_RULE_PRIO_0=$(( $IP_RULE_PRIO - 3 ))

  114. ## 第二WAN口自定义策略规则优先级
  115. IP_RULE_PRIO_1=$(( $IP_RULE_PRIO - 3 ))

  116. ## SS自定义策略规则优先级
  117. SS_RULE_FROM_PRIO=$(( $IP_RULE_PRIO - 5 ))
  118. SS_RULE_TO_PRIO=$(( $IP_RULE_PRIO - 4 ))

  119. ## SS服务支持的WAN口路由表ID号
  120. SS_WAN_ID=$WAN1
  121. [ $ss_wan_no = 0 ] && SS_WAN_ID=$WAN0
  122. [ $ss_wan_no = 1 ] && SS_WAN_ID=$WAN1

  123. ## iptables --match-set针对不同硬件类型选项宏变量
  124. MATCH_SET='--match-set'

  125. ## 第一WAN口报文数据包标记使用标志
  126. fwmark_0_used=0

  127. ## 第二WAN口报文数据包标记使用标志
  128. fwmark_1_used=0

  129. ## 用户自定义网址网段报文数据包标记-1使用标志
  130. custom_fwmark_0_used=0

  131. ## 用户自定义网址网段报文数据包标记-2使用标志
  132. custom_fwmark_1_used=0

  133. ## 路由器硬件类型
  134. route_hardware_type=$( uname -m )

  135. ## 路由器操作系统名称
  136. route_os_name=$( uname -o )


  137. ## ----------------------函数定义----------------------

  138. ## 获取路由器基本信息并输出至系统记录函数
  139. ## 输入项:无
  140. ## 返回值:路由器本地IP地址
  141. function lz_get_route_info() {

  142.         ## 输出显示路由器硬件类型及设置操作符
  143.         case $route_hardware_type in
  144.                 armv7l)
  145.                         MATCH_SET='--match-set'
  146.                 ;;
  147.                 mips)
  148.                         MATCH_SET='--set'
  149.                 ;;
  150.                 *)
  151.                         MATCH_SET='--match-set'
  152.                 ;;
  153.         esac
  154.         [ -z "$route_hardware_type" ] && route_hardware_type="Unknown"
  155.         echo $(date): LZ Hardware type:  $route_hardware_type >> /tmp/syslog.log

  156.         ## 输出显示路由器主机名
  157.         local route_hostname=$( uname -n )
  158.         [ -z "$route_hostname" ] && route_hostname="Unknown"
  159.         echo $(date): LZ Host Name:  $route_hostname >> /tmp/syslog.log

  160.         ## 输出显示路由器操作系统内核名称
  161.         local route_Kernel_name=$( uname )
  162.         [ -z "$route_Kernel_name" ] && route_Kernel_name="Unknown"
  163.         echo $(date): LZ Kernel Name:  $route_Kernel_name >> /tmp/syslog.log

  164.         ## 输出显示路由器操作系统内核发行编号
  165.         local route_kernel_release=$( uname -r )
  166.         [ -z "$route_kernel_release" ] && route_kernel_release="Unknown"
  167.         echo $(date): LZ Kernel Release:  $route_kernel_release >> /tmp/syslog.log

  168.         ## 输出显示路由器操作系统内核版本号
  169.         local route_kernel_version=$( uname -v )
  170.         [ -z "$route_kernel_version" ] && route_kernel_version="Unknown"
  171.         echo $(date): LZ Kernel Version:  $route_kernel_version >> /tmp/syslog.log

  172.         ## 输出显示路由器操作系统名称
  173.         [ -z "$route_os_name" ] && route_os_name="Unknown"
  174.         echo $(date): LZ OS Name:  $route_os_name >> /tmp/syslog.log

  175.         if [ "$route_os_name" = "Merlin-Koolshare" ]; then
  176.                 ## 输出显示路由器固件版本号
  177.                 local firmware_version=$( nvram get extendno | cut -d "X" -f2 | cut -d "-" -f1 | cut -d "_" -f1 )
  178.                 [ -z "$firmware_version" ] && firmware_version="Unknown"
  179.                 echo $(date): LZ Firmware Version:  $firmware_version >> /tmp/syslog.log
  180.         fi

  181.         ## 获取路由器本地网络信息
  182.         ## 由于不同系统中ifconfig返回信息的格式有一定差别,需分开处理
  183.         ## Linux的其他版本的格式暂不掌握,做框架性预留处理
  184.         local route_local_info=""
  185.         case $route_Kernel_name in
  186.                 Linux)
  187.                         route_local_info="$( /sbin/ifconfig br0 )"
  188.                 ;;
  189.                 FreeBSD|OpenBSD)
  190.                         route_local_info=""
  191.                 ;;
  192.                 SunOS)
  193.                         route_local_info=""
  194.                 ;;
  195.                 *)
  196.                         route_local_info=""
  197.                 ;;
  198.         esac

  199.         local route_local_link_status="Unknown"
  200.         local route_local_encap="Unknown"
  201.         local route_local_mac="Unknown"
  202.         local route_local_ip="Unknown"
  203.         local route_local_bcast_ip="Unknown"
  204.         local route_local_ip_mask="Unknown"

  205.         if [ ! -z "$route_local_info" ]; then
  206.                 ## 获取路由器本地网络连接状态
  207.                 route_local_link_status=$( echo $route_local_info | awk -F " " '{print $2}' )
  208.                 [ -z "$route_local_link_status" ] && route_local_link_status="Unknown"

  209.                 ## 获取路由器本地网络封装类型
  210.                 route_local_encap=$( echo $route_local_info | awk -F " " '{print $3}' | awk -F ":" '{print $2}' )
  211.                 [ -z "$route_local_encap" ] && route_local_encap="Unknown"

  212.                 ## 获取路由器本地网络MAC地址
  213.                 route_local_mac=$( echo $route_local_info | awk -F " " '{print $5}' )
  214.                 [ -z "$route_local_mac" ] && route_local_mac="Unknown"

  215.                 ## 获取路由器本地网络地址
  216.                 route_local_ip=$( echo $route_local_info | awk -F " " '{print $7}' | awk -F ":" '{print $2}' )
  217.                 [ -z "$route_local_ip" ] && route_local_ip="Unknown"

  218.                 ## 获取路由器本地广播地址
  219.                 route_local_bcast_ip=$( echo $route_local_info | awk -F " " '{print $8}' | awk -F ":" '{print $2}' )
  220.                 [ -z "$route_local_bcast_ip" ] && route_local_bcast_ip="Unknown"

  221.                 ## 获取路由器本地网络掩码
  222.                 route_local_ip_mask=$( echo $route_local_info | awk -F " " '{print $9}' | awk -F ":" '{print $2}' )
  223.                 [ -z "$route_local_ip_mask" ] && route_local_ip_mask="Unknown"
  224.         fi

  225.         ## 输出路由器网络状态基本信息至Asuswrt系统记录
  226.         [ -z "$route_local_info" ] && echo $(date): LZ Route Local Info:  Unknown >> /tmp/syslog.log
  227.         echo $(date): LZ Route Status:  $route_local_link_status >> /tmp/syslog.log
  228.         echo $(date): LZ Route Encap:  $route_local_encap >> /tmp/syslog.log
  229.         echo $(date): LZ Route HWaddr:  $route_local_mac >> /tmp/syslog.log
  230.         echo $(date): LZ Route Local IP Addr:  $route_local_ip >> /tmp/syslog.log
  231.         echo $(date): LZ Route Local Bcast:  $route_local_bcast_ip >> /tmp/syslog.log
  232.         echo $(date): LZ Route Local Mask:  $route_local_ip_mask >> /tmp/syslog.log

  233.         ## 返回路由器本地地址
  234.         echo $route_local_ip
  235. }

  236. ## 处理系统负载均衡分流策略函数
  237. ## 输入项:无
  238. ## 返回值:无
  239. function lz_sys_load_balance_control() {

  240.         ## 梅林官方384.6固件启动双线路负载均衡时,系统在防火墙过滤包时会将所有数据包分别打上0x80000000/0xf0000000、
  241.         ## 0x90000000/0xf0000000用于负载均衡控制的特殊标记,并在系统的策略路由库中自动添加如下两条对具有负载均标记
  242.         ## 的数据包进行分流控制的高优先级规则:
  243.         ##     150:        from all fwmark 0x80000000/0xf0000000 lookup wan0
  244.         ##     150:        from all fwmark 0x90000000/0xf0000000 lookup wan1
  245.         ## 这两条规则易导致策略分流脚本运行时的分流控制出现失效现象,如不能按指定路径访问外网,网络卡慢、断流,网站页
  246.         ## 面忽然打不开,IPTV、爱奇艺、腾讯视频等音视频应用不能正常播放等诸如此类现象。一旦退出负载均衡或某一路接入断
  247.         ## 开,系统会自动清除上述设置。其它版本的华硕、梅林及改版固件是否有类似问题尚待验证。
  248.         ## 解决方法如下:

  249.         ## a.对固件系统中第一WAN口的负载均衡分流策略采取主动控制措施
  250.         local sys_load_balance_wan0_exist=$( ip rule show | grep -c "from all fwmark 0x80000000/0xf0000000" )
  251.         if [ $sys_load_balance_wan0_exist -gt 0 ]; then
  252.                 ip rule del from all fwmark 0x80000000/0xf0000000 table $WAN0
  253.                 ## 不清除系统负载均衡策略中的分流功能,但降低其执行优先级,防止先于自定义分流规则执行
  254.                 ip rule add from all fwmark 0x80000000/0xf0000000 table $WAN0 prio $(( $IP_RULE_PRIO + 1 ))
  255.         fi

  256.         ## b.对固件系统中第二WAN口的负载均衡分流策略采取主动控制措施
  257.         local sys_load_balance_wan1_exist=$( ip rule show | grep -c "from all fwmark 0x90000000/0xf0000000" )
  258.         if [ $sys_load_balance_wan1_exist -gt 0 ]; then
  259.                 ip rule del from all fwmark 0x90000000/0xf0000000 table $WAN1
  260.                 ## 不清除系统负载均衡策略中的分流功能,但降低其执行优先级,防止先于自定义分流规则执行
  261.                 ip rule add from all fwmark 0x90000000/0xf0000000 table $WAN1 prio $(( $IP_RULE_PRIO + 1 ))
  262.         fi
  263. }

  264. ## 加载ipset组件函数
  265. ## 输入项:无
  266. ## 返回值:无
  267. function lz_load_ipset_module() {
  268. <<EOF
  269.         ## S大的GT-AC5300_384_21140官改固件提供了自己的支持,不需要加载。
  270.         ## 如有老版本出现兼容性问题,需要加载,可去掉注释符使用
  271.         modprobe xt_set > /dev/null 2>&1
  272.         lsmod | grep "xt_set" > /dev/null 2>&1 || \
  273.         for module in ip_set ip_set_hash_net ip_set_hash_ip xt_set
  274.         do
  275.                 insmod $module > /dev/null 2>&1
  276.         done
  277. EOF
  278.         xt=`lsmod | grep xt_set` > /dev/null 2>&1
  279.         OS=$( uname -r )
  280.         if [ -f /lib/modules/${OS}/kernel/net/netfilter/xt_set.ko ] && [ -z "$xt" ];then
  281.                 insmod /lib/modules/${OS}/kernel/net/netfilter/xt_set.ko
  282.         fi
  283. }

  284. ## 删除旧分流规则并输出旧分流规则每个优先级的条目数至系统记录函数
  285. ## 输入项:$1--旧分流规则条目优先级上限数值(例如:IP_RULE_PRIO - 6 = 24994)
  286. ##         $2--旧分流规则条目优先级下限数值(例如:IP_RULE_PRIO = 25000)
  287. ## 返回值:删除后剩余条目数,正常为0
  288. ## 严重注意:同时会删除该范围内系统中非本脚本建立的规则,如有冲突,请修改代码中所使用的优先级范围
  289. function lz_delete_ip_rule_output_syslog() {

  290.         local ip_rule_exist=0
  291.         local ip_rule_prio_no=$1
  292.         until [ $ip_rule_prio_no -gt $2 ]
  293.         do
  294.                 ip_rule_exist=$( ip rule show | grep -c "$ip_rule_prio_no:" )
  295.                 echo $(date): LZ ip_rule_prio_$ip_rule_prio_no = $ip_rule_exist >> /tmp/syslog.log
  296.                 if [ $ip_rule_exist -gt 0 ]; then
  297.                         until [ $ip_rule_exist = 0 ]
  298.                         do
  299.                                 ip rule del prio $ip_rule_prio_no
  300.                                 ip_rule_exist=$(( $ip_rule_exist - 1 ))
  301.                         done
  302.                 fi
  303.                 ip_rule_prio_no=$(( $ip_rule_prio_no + 1 ))
  304.         done

  305.         ## 返回删除后剩余条目数,正常为0
  306.         echo $ip_rule_exist
  307. }

  308. ## 删除标记数据包的防火墙过滤规则函数
  309. ## 输入项:$1--报文数据包标记
  310. ## 返回值:无
  311. function lz_delete_iptables_fwmark() {

  312.         for number in $( iptables -t mangle -L OUTPUT -v -n --line-numbers | grep "dst MARK set $1" | cut -d " " -f 1 | sort -nr )
  313.         do
  314.                 iptables -t mangle -D OUTPUT $number
  315.         done
  316.         for number in $( iptables -t mangle -L PREROUTING -v -n --line-numbers | grep "dst MARK set $1" | cut -d " " -f 1 | sort -nr )
  317.         do
  318.                 iptables -t mangle -D PREROUTING $number
  319.         done
  320. }

  321. ## 清理之前设置的标记数据包的防火墙过滤规则函数
  322. ## 输入项:无
  323. ## 返回值:无
  324. function lz_clear_iptables_fwmark() {

  325.         ## 清理标记 FWMARK1 数据包的防火墙过滤规则
  326.         lz_delete_iptables_fwmark $FWMARK1

  327.         ## 清理标记 FWMARK0 数据包的防火墙过滤规则
  328.         lz_delete_iptables_fwmark $FWMARK0

  329.         ## 清理标记 CUSTOM_FWMARK_0 数据包的防火墙过滤规则
  330.         lz_delete_iptables_fwmark $CUSTOM_FWMARK_0

  331.         ## 清理标记 CUSTOM_FWMARK_1 数据包的防火墙过滤规则
  332.         lz_delete_iptables_fwmark $CUSTOM_FWMARK_1
  333. }

  334. ## 清理目标访问服务器IP网段数据集函数
  335. ## 输入项:无
  336. ## 返回值:无
  337. function lz_destroy_ipset() {

  338.         ## a.中国所有IP地址
  339.         ipset -F -q all_cn        ## 清空数据集。若不清空,被系统内核占用无法释放时,再次创建会失败,导致后续无法读入数据
  340.         ipset -X -q all_cn        ## 若集合已被系统内核占用,则什么都不做,未被销毁属正常,重启路由器即可释放

  341.         ## b.中国电信
  342.         ipset -F -q chinatelecom
  343.         ipset -X -q chinatelecom

  344.         ## c.中国联通/网通
  345.         ipset -F -q unicom_cnc
  346.         ipset -X -q unicom_cnc

  347.         ## d.中国移动
  348.         ipset -F -q cmcc
  349.         ipset -X -q cmcc

  350.         ## e.中国铁通
  351.         ipset -F -q crtc
  352.         ipset -X -q crtc

  353.         ## f.中国教育网
  354.         ipset -F -q cernet
  355.         ipset -X -q cernet

  356.         ## g.长城宽带/鹏博士
  357.         ipset -F -q gwbn
  358.         ipset -X -q gwbn

  359.         ## h.中国其他ISP
  360.         ipset -F -q othernet_1
  361.         ipset -X -q othernet_1
  362.         ipset -F -q othernet_2
  363.         ipset -X -q othernet_2
  364.         ipset -F -q othernet_3
  365.         ipset -X -q othernet_3

  366.         ## i.用户自定义网址网段-1
  367.         ipset -F -q custom_data_1
  368.         ipset -X -q custom_data_1

  369.         ## j.用户自定义网址网段-2
  370.         ipset -F -q custom_data_2
  371.         ipset -X -q custom_data_2
  372. }

  373. ## 建立目标网段数据集并设置防火墙标记访问报文数据包过滤规则函数
  374. ## 输入项:$1--网段数据分流出口标号,0、1、大于1的无符号整数,参见自定义区注释说明
  375. ##         $2--是否屏蔽使用系统负载均衡策略中的分流功能。0:不屏蔽,使用系统负载均衡;1:屏蔽,不使用系统负载均衡
  376. ##         $3--全路径网段数据文件名
  377. ##         $4--网段数据集
  378. ##         $5--反向设置标志。0:正常设置;1:给该网段之外的访问报文数据包加标记
  379. ## 返回值:无
  380. function lz_setup_iptables_fwmark() {

  381.         ## 读取目标访问服务器IP网段数据文件并建立数据集
  382.         ## 在路由器通过WAN口转发和响应回复外网目标访问服务器的数据包上设置标记的防火墙过滤规则
  383.         ## 第一WAN口在屏蔽系统负载均衡策略中的分流功能情况下不做标记,且不加载对应的网段数据文件,以提高系统工作效率
  384.         ## FWMARK0--去往第一WAN口的自定义数据包标记;FWMARK1--去往第二WAN口的自定义的数据包标记
  385.         local wan_fwmark=0
  386.         if [ $1 = 1 ] || [ $1 = 0 -a $2 = 0 ]; then
  387.                 ipset -N -q $4 nethash --hashsize 65535
  388.                 sed -e "s/^/-A $4 &/g" $3 | awk '{print $0} END{print "COMMIT"}' | ipset -R
  389.                 [ $1 = 0 ] && wan_fwmark=$FWMARK0 && fwmark_0_used=1
  390.                 [ $1 = 1 ] && wan_fwmark=$FWMARK1 && fwmark_1_used=1
  391.                 [ "$4" = "custom_data_1" ] && wan_fwmark=$CUSTOM_FWMARK_0 && custom_fwmark_0_used=1
  392.                 [ "$4" = "custom_data_2" ] && wan_fwmark=$CUSTOM_FWMARK_1 && custom_fwmark_1_used=1
  393.                 if [ $5 = 0 ]; then
  394.                         iptables -t mangle -A PREROUTING -m set $MATCH_SET $4 dst -j MARK --set-mark $wan_fwmark
  395.                         iptables -t mangle -A OUTPUT -m set $MATCH_SET $4 dst -j MARK --set-mark $wan_fwmark
  396.                 elif [ $5 = 1 ]; then
  397.                         iptables -t mangle -A PREROUTING -m set ! $MATCH_SET $4 dst -j MARK --set-mark $wan_fwmark
  398.                         iptables -t mangle -A OUTPUT -m set ! $MATCH_SET $4 dst -j MARK --set-mark $wan_fwmark
  399.                 fi
  400.         fi
  401.         ## 此处sed和ipset命令的使用,网上很多代码有误,会导致未重启路由器时的运行重置,如操作防火墙、重新拨号后无法正常
  402.         ## 读入或恢复数据,尤其是在线更新新的网段数据文件时,实际并没有被读入,数据集中还是老数据。某我膜拜的大神2.0代码
  403.         ## 中用“ipset -N”重复创建数据集,按道理第二次创建会失败,没搞懂用意,水平有限怕露怯,也不好意思问,只好自己摸索。
  404.         ## 多有得罪,请多多海涵,其实很多代码都是从你那里直接拷贝粘贴过来的,连变量名和格式都没改,就是证明这里充满了剽窃。
  405.         ## 正因为如此,所以要将代码公布出来让跟多的人来剽窃,从而在未来出现更多、更伟大的成果,这也就是代码开源的崇高意义。
  406. }

  407. ## 初始化各目标网址网段数据访问路由策略函数
  408. ## 输入项:无
  409. ## 返回值:无
  410. function lz_initialize_ip_data_policy() {

  411.         ## a.中国之外所有IP地址
  412.         lz_setup_iptables_fwmark $all_foreign_wan_no $sys_load_balance_idle "/jffs/scripts/lz/all_cn_cidr.txt" all_cn 1

  413.         ## b.中国电信
  414.         lz_setup_iptables_fwmark $chinatelecom_wan_no $sys_load_balance_idle "/jffs/scripts/lz/chinatelecom_cidr.txt" chinatelecom 0

  415.         ## c.中国联通/网通
  416.         lz_setup_iptables_fwmark $unicom_cnc_wan_no $sys_load_balance_idle "/jffs/scripts/lz/unicom_cnc_cidr.txt" unicom_cnc 0

  417.         ## d.中国移动
  418.         lz_setup_iptables_fwmark $cmcc_wan_no $sys_load_balance_idle "/jffs/scripts/lz/cmcc_cidr.txt" cmcc 0

  419.         ## e.中国铁通
  420.         lz_setup_iptables_fwmark $crtc_wan_no $sys_load_balance_idle "/jffs/scripts/lz/crtc_cidr.txt" crtc 0

  421.         ## f.中国教育网
  422.         lz_setup_iptables_fwmark $cernet_wan_no $sys_load_balance_idle "/jffs/scripts/lz/cernet_cidr.txt" cernet 0

  423.         ## g.长城宽带/鹏博士
  424.         lz_setup_iptables_fwmark $gwbn_wan_no $sys_load_balance_idle "/jffs/scripts/lz/gwbn_cidr.txt" gwbn 0

  425.         ## h.中国其他ISP
  426.         lz_setup_iptables_fwmark $othernet_wan_no_1 $sys_load_balance_idle "/jffs/scripts/lz/othernet_cidr.txt" othernet_1 0
  427.         lz_setup_iptables_fwmark $othernet_wan_no_2 $sys_load_balance_idle "/jffs/scripts/lz/othernet2_cidr.txt" othernet_2 0
  428.         lz_setup_iptables_fwmark $othernet_wan_no_3 $sys_load_balance_idle "/jffs/scripts/lz/othernet3_cidr.txt" othernet_3 0

  429.         ## i.用户自定义网址网段-1
  430.         lz_setup_iptables_fwmark $custom_data_wan_no_1 $sys_load_balance_idle "$custom_data_file_1" custom_data_1 0

  431.         ## j.用户自定义网址网段-2
  432.         lz_setup_iptables_fwmark $custom_data_wan_no_2 $sys_load_balance_idle "$custom_data_file_2" custom_data_2 0
  433. }

  434. ## 清除firewall-start中脚本引导项函数
  435. ## 输入项:无
  436. ## 返回值:无
  437. function lz_clear_firewall_start_command() {

  438.         if [ -d /jffs/scripts ] && [ ! -f /jffs/scripts/firewall-start ]; then
  439.                 sed -i '/lz_rule/d' /jffs/scripts/firewall-start > /dev/null 2>&1
  440.         fi
  441. }

  442. ## 删除SS服务启停触发脚本文件函数
  443. ## 输入项:无
  444. ## 返回值:无
  445. function lz_clear_ss_start_command() {

  446.         if [ -d /koolshare/ss/postscripts ] && [ -f /koolshare/ss/postscripts/P99_lz_rule.sh ]; then
  447.                 rm /koolshare/ss/postscripts/P99_lz_rule.sh > /dev/null 2>&1
  448.         fi
  449. }

  450. ## 创建firewall-start启动文件并添加脚本引导项函数
  451. ## 输入项:无
  452. ## 返回值:无
  453. function lz_create_firewall_start_command() {

  454.         if [ ! -d /jffs/scripts ]; then
  455.                 mkdir -p /jffs/scripts
  456.         fi

  457.         if [ ! -f /jffs/scripts/firewall-start ]; then
  458.                 cat > /jffs/scripts/firewall-start <<EOF
  459. #!/bin/sh
  460. EOF
  461.         fi

  462.         local write_scripts=$( cat /jffs/scripts/firewall-start | grep "lz_rule" )
  463.         if [ -z "$write_scripts" ]; then
  464.                 sed -i '1a /jffs/scripts/lz/lz_rule.sh' /jffs/scripts/firewall-start
  465.                 chmod +x /jffs/scripts/firewall-start
  466.         fi
  467. }

  468. ## 创建SS服务启停触发脚本文件函数
  469. ## 脚本命名格式:P+数字+名字.sh
  470. ## 输入项:无
  471. ## 返回值:无
  472. function lz_create_ss_start_command() {

  473.         if [ ! -d /koolshare/ss/postscripts ]; then
  474.                 mkdir -p /koolshare/ss/postscripts
  475.         fi

  476.         if [ ! -f /koolshare/ss/postscripts/P99_lz_rule.sh ]; then
  477.                 cat > /koolshare/ss/postscripts/P99_lz_rule.sh <<EOF
  478. #!/bin/sh

  479. # sh@ado@wso@cks script for AM380 merlin firmware
  480. # by sadog (sadoneli@gmail.com) from koolshare.cn

  481. # 此脚本是一个示例,实际写法按照自己的方法来做
  482. # 更改此脚本的名字,保证此脚本的名字格式是: P+数字+名字.sh
  483. # 例如在/koolshare/ss/postscripts下放入两个脚本:P01V2ray.sh, P99Brook.sh
  484. # SS插件运行后货自动按照数字从小到大顺序运行 P01V2ray.sh start, P99Brook.sh start
  485. # SS插件关闭前会自动按照数字从大到小顺序运行 P99Brook.sh stop, P01V2ray.sh stop
  486. #------------------------------------------
  487. source /koolshare/scripts/base.sh
  488. # 读取SS配置
  489. eval \`dbus export ss\`
  490. # 保持打印日志时间格式和ss插件一致
  491. alias echo_date='echo 【\$(TZ=UTC-8 date -R +%Y年%m月%d日\ %X)】:'
  492. #------------------------------------------
  493. start_lz_rule() {
  494.         echo_date "Start lz_rule"
  495.         # do something here
  496.         if [ -d /jffs/scripts/lz ] && [ -f /jffs/scripts/lz/lz_rule.sh ] && \
  497.                 [ -r /jffs/scripts/lz/lz_rule.sh ] && [ -x /jffs/scripts/lz/lz_rule.sh ]; then
  498.                 echo \$(date): -------- LZ rules catching ss! --------- >> /tmp/syslog.log
  499.                 /jffs/scripts/lz/lz_rule.sh
  500.                 echo \$(date): -------- LZ rules locked ss! ----------- >> /tmp/syslog.log
  501.         fi
  502. }

  503. stop_lz_rule() {
  504.         echo_date "Stop lz_rule"
  505.         # do something here
  506.         if [ -d /jffs/scripts/lz ] && [ -f /jffs/scripts/lz/lz_rule.sh ] && \
  507.                 [ -r /jffs/scripts/lz/lz_rule.sh ] && [ -x /jffs/scripts/lz/lz_rule.sh ]; then
  508.                 echo \$(date): -------- LZ rules unlocking ss! -------- >> /tmp/syslog.log
  509.                 /jffs/scripts/lz/lz_rule.sh
  510.                 echo \$(date): -------- LZ rules released ss! --------- >> /tmp/syslog.log
  511.         fi
  512. }
  513. #------------------------------------------
  514. case \$1 in
  515.         start)
  516.                 start_lz_rule
  517.         ;;
  518.         stop)
  519.                 stop_lz_rule
  520.         ;;
  521. esac

  522. EOF
  523.                 chmod +x /koolshare/ss/postscripts/P99_lz_rule.sh
  524.         fi
  525. }

  526. ## SS服务支持(线路分流)函数
  527. ## 科学@上网@插件v4.0.9
  528. ## 输入项:无
  529. ## 返回值:无
  530. function lz_ss_support() {
  531.         
  532.         if [ $ss_wan_no = 0 ] || [ $ss_wan_no = 1 ]; then

  533.                 ## AM380 merlin firmware
  534.                 ## 适用于koolshare merlin armv7l固件平台,不支持X7.2以下的固件版本
  535.                 if [ "$route_os_name" = "Merlin-Koolshare" ] && [ "$route_hardware_type" = "armv7l" ]; then

  536.                         local firmware_version=$( nvram get extendno | cut -d "X" -f2 | cut -d "-" -f1 | cut -d "_" -f1 )
  537.                         local firmware_comp=$( versioncmp $firmware_version 7.2 )
  538.                         if [ "$firmware_comp" != "1" ]; then

  539.                                 ## 在dbus数据库加载环境数据
  540.                                 eval `dbus export ss`

  541.                                 ## 获取SS服务运行参数
  542.                                 local ss_enable=$( dbus get ss_basic_enable )
  543.                                 local ss_mode=$( dbus get ss_acl_default_mode )
  544.                                 local ss_server=$( dbus get ss_basic_server_ip )
  545.                                 [ "$ss_enable" == "0" ] && ss_mode=0

  546.                                 ## 创建SS服务启停触发脚本文件:P99_lz_rule.sh
  547.                                 lz_create_ss_start_command
  548.                                 
  549.                                 if [ ! -z "$ss_server" ] && [ $ss_mode != 0 ]; then
  550.                                         local nodes=$( dbus list ssconf_basic_server_ | cut -d "=" -f1 | cut -d "_" -f4 | sort -n )
  551.                                         for node in $nodes
  552.                                         do
  553.                                                 ss_server_ip=$( dbus get ssconf_basic_server_$node )
  554.                                                 if [ ! -z "$ss_server_ip" ]; then
  555.                                                         ip rule add from $ss_server_ip table $SS_WAN_ID prio $SS_RULE_FROM_PRIO
  556.                                                         ip rule add to $ss_server_ip table $SS_WAN_ID prio $SS_RULE_TO_PRIO
  557.                                                 fi
  558.                                         done
  559.                                 fi
  560.                         fi
  561.                 fi
  562.         fi
  563. }

  564. ## 输出当前分流规则每个优先级的条目数至系统记录函数
  565. ## 输入项:$1--当前分流规则条目优先级上限数值(例如:IP_RULE_PRIO - 6 = 24994)
  566. ##         $2--当前分流规则条目优先级下限数值(例如:IP_RULE_PRIO = 25000)
  567. ## 返回值:无
  568. function lz_ip_rule_output_syslog() {

  569.         ## 读取所有符合本方案所用优先级数值的规则条目数并输出至系统记录
  570.         local ip_rule_exist=0;
  571.         local ip_rule_prio_no=$1
  572.         until [ $ip_rule_prio_no -gt $2 ]
  573.         do
  574.                 ip_rule_exist=$( ip rule show | grep -c "$ip_rule_prio_no:" )
  575.                 echo $(date): LZ ip_rule_prio_$ip_rule_prio_no = $ip_rule_exist >> /tmp/syslog.log
  576.                 ip_rule_prio_no=$(( $ip_rule_prio_no + 1 ))
  577.         done
  578. }


  579. ## ---------------------主执行脚本---------------------

  580. echo $(date): -------- LZ rules come here! ----------- >> /tmp/syslog.log

  581. ## 启动延时10秒
  582. sleep 10s

  583. ## 获取路由器基本信息并输出至系统记录函数
  584. route_local_ip=$( lz_get_route_info )

  585. if [ $( ip rule show | grep -c "from 168.168.168.168 to 169.169.169.169" ) = 0 ]; then
  586.         ## 临时规则,用于进程间同步,防止启动时系统同时调用和执行两个以上的本脚本
  587.         ## 如与系统中现有规则冲突,可酌情修改;高手们会用更好的方法,请教教我,谢啦!
  588.         ip rule add from 168.168.168.168 to 169.169.169.169 table $WAN0

  589.         echo $(date): -------- LZ rules initializing! -------- >> /tmp/syslog.log

  590.         ## 处理系统负载均衡分流策略
  591.         lz_sys_load_balance_control

  592.         ## 加载ipset组件:S大的GT-AC5300_384_21140官改固件提供了自己的支持,不需要加载。
  593.         ## 初始处于注释状态,如有老版本出现兼容性问题,需要加载,可去掉注释符使用
  594.         lz_load_ipset_module

  595.         ## 删除旧规则和使用过的数据集,防止重置后再次添加
  596.         ## 删除旧分流规则并输出旧分流规则每个优先级的条目数至系统记录
  597.         ## 删除优先级 IP_RULE_PRIO - 5 ~ IP_RULE_PRIO 的旧规则
  598.         ## 严重注意:同时会删除该范围内系统中非本脚本建立的规则,如有冲突,请修改代码中所使用的优先级范围
  599.         ip_rule_exist=$( lz_delete_ip_rule_output_syslog $(( $IP_RULE_PRIO - 6 )) $IP_RULE_PRIO )

  600.         ## 清理之前设置的标记数据包的防火墙过滤规则
  601.         lz_clear_iptables_fwmark

  602.         ## 清理目标访问服务器IP网段数据集
  603.         lz_destroy_ipset

  604.         ## 删除SS服务启停触发脚本文件
  605. #        lz_clear_ss_start_command

  606.         ## 清除firewall-start中脚本引导项
  607. #        lz_clear_firewall_start_command

  608.         echo $(date): -------- LZ rules initialized! --------- >> /tmp/syslog.log

  609.         ## 接到停止运行命令
  610.         ## SSH中执行”/jffs/scripts/lz_rule.sh stop“或”/jffs/scripts/lz_rule.sh STOP“,都会立刻停止本脚本配置的
  611.         ## 策略路由服务,若”/jffs/firewall-start“中的”/jffs/scripts/lz_rule.sh“引导启动命令未清除,路由器重启、
  612.         ## 线路接入或断开、防火墙开关等事件都会导致自启动运行本脚本
  613.         if [ $1 = "stop" > /dev/null 2>&1 ] || [ $1 = "STOP" > /dev/null 2>&1 ]; then

  614.                 ## 输出当前分流规则每个优先级的条目数至系统记录,调试用,无需要可删除
  615.                 lz_ip_rule_output_syslog $(( $IP_RULE_PRIO - 6 )) $IP_RULE_PRIO

  616.                 ## 删除SS服务启停触发脚本文件
  617.                 lz_clear_ss_start_command

  618.                 echo $(date): -------- LZ rules stoped! -------------- >> /tmp/syslog.log

  619.                 ## 删除进程间同步用临时规则,要与脚本开始时的添加命令一致
  620.                 if [ $( ip rule show | grep -c "from 168.168.168.168 to 169.169.169.169" ) != 0 ]; then
  621.                         ip rule del from 168.168.168.168 to 169.169.169.169 table $WAN0
  622.                 fi

  623.                 ## 刷新系统cache,使上述命令立即生效
  624.                 ip route flush cache

  625.                 ## 停止并退出本脚本配置的策略路由服务
  626.                 echo $(date): The script commands executed!

  627.                 exit 0
  628.         fi

  629.         ## 创建firewall-start启动文件并添加脚本引导项
  630.         lz_create_firewall_start_command

  631.         ## 分流策略部署
  632.         ## 脚本中先add的rule优先级低
  633.         ## 脚本使用 IP_RULE_PRIO + 1 ~ IP_RULE_PRIO - 6 八个优先级,数值越小,优先级越高,网络访问数据包优先匹配高优先级规则
  634.         ## 部署条件:双线接入成功,系统内成功自建wan0、wan1路由表,案中规则尚未部署
  635.         ## 重要说明:WAN0口指路由器接入宽带的第一WAN口,路由表为wan0;WAN1口指第二WAN口,路由表为wan1
  636.         ## 案例背景:第一WAN口接联通宽带,100M,响应快,稳定,上行带宽小
  637.         ##           第二WAN口接移动宽带,200M,有些low,承诺话费送的
  638.         ##           尽可能选品质好的宽带接第一WAN口
  639.         ##           若与本案例应用背景不同,可至本代码开始处的“用户运行策略自定义区”修改路由器数据分流出口

  640.         if [ $( ip route show table $WAN0 | grep -c "dev" ) -gt 0 -a \
  641.                 $( ip route show table $WAN1 | grep -c "dev" ) -gt 0 -a \
  642.                 $ip_rule_exist = 0 ]; then

  643.                 ## 初始化各目标网址网段数据访问路由策略
  644.                 lz_initialize_ip_data_policy

  645.                 if [ $sys_load_balance_idle != 0 ]; then
  646.                         ## 所有不匹配规则或存在未被网段数据涵盖的外网目标IP地址访问时,客户端流量走WAN0口
  647.                         ## 屏蔽系统负载均衡策略中的分流功能,阻止路由器对客户端网络访问流量的负载均衡分流控制
  648.                         ## 也可根据需要将wan0改为wan1走WAN1口
  649.                         ip rule add to 0.0.0.0/0 table $WAN0 prio $IP_RULE_PRIO
  650.                 fi

  651.                 ## 添加访问各IP网段目标服务器的路由器出口规则,进行数据分流配置
  652.                 ## wan0--WAN0--第一WAN口;wan1--WAN1--第二WAN口
  653.                 ## 案例结合本地网络状况和本机系统调优情况,除对部分客户端指定网络访问出口外,移动、铁通、教育网、
  654.                 ## 长城宽带/鹏博士的网络访问走WAN1口,去往联通、电信、国外ISP的网络访问走WAN0口,去往国内其他ISP
  655.                 ## 以及未被规则和网段数据覆盖的网络访问由系统负载均衡自动分配出口

  656.                 ## 部署分流规则

  657.                 ## WAN1--200--第二WAN口:根据数据包标记,按目标网段分流,优先级:IP_RULE_PRIO - 1
  658.                 if [ $fwmark_1_used = 1 ]; then
  659.                         ip rule add fwmark $FWMARK1 table $WAN1 prio $(( $IP_RULE_PRIO - 1 ))
  660.                 fi

  661.                 ## WAN0--100--第一WAN口:根据数据包标记,按目标网段分流,优先级:IP_RULE_PRIO - 1
  662.                 if [ $fwmark_0_used = 1 ]; then
  663.                         ip rule add fwmark $FWMARK0 table $WAN0 prio $(( $IP_RULE_PRIO - 1 ))
  664.                 fi

  665.                 ## 用户自定义网址网段-1
  666.                 if [ $custom_fwmark_0_used = 1 ]; then
  667.                         if [ $custom_data_wan_no_1 = 1 ]; then
  668.                                 ip rule add fwmark $CUSTOM_FWMARK_0 table $WAN1 prio $(( $IP_RULE_PRIO - 2 ))
  669.                         elif [ $custom_data_wan_no_1 = 0 ]; then
  670.                                 ip rule add fwmark $CUSTOM_FWMARK_0 table $WAN0 prio $(( $IP_RULE_PRIO - 2 ))
  671.                         fi
  672.                 fi

  673.                 ## 用户自定义网址网段-2
  674.                 if [ $custom_fwmark_1_used = 1 ]; then
  675.                         if [ $custom_data_wan_no_2 = 1 ]; then
  676.                                 ip rule add fwmark $CUSTOM_FWMARK_1 table $WAN1 prio $(( $IP_RULE_PRIO - 2 ))
  677.                         elif [ $custom_data_wan_no_2 = 0 ]; then
  678.                                 ip rule add fwmark $CUSTOM_FWMARK_1 table $WAN0 prio $(( $IP_RULE_PRIO - 2 ))
  679.                         fi
  680.                 fi

  681.                 ## 自定义客户端使用指定路由器出口访问外网
  682.                 lz_ip_rule_from_localip_to_wan_outlet

  683.                 ## SS服务支持(线路分流)
  684.                 lz_ss_support

  685.                 if [ -z "$route_local_ip" ] || [ "$route_local_ip" = "Unknown" ]; then
  686.                         route_local_ip=192.168.50.1
  687.                 fi

  688.                 ## 互联网访问路由器管理页面及华硕路由器APP终端支持,优先级:IP_RULE_PRIO - 6
  689.                 ## 华硕DDNS:www.asuscomm.com [103.10.4.108] 各地实测值可能不同,存在变化的可能
  690.                 ## 应用中若连不上DDNS,可 ping www.asuscomm.com 取实测值修改此处
  691.                 ## 若该DDNS地址值总不能固定,无法稳定使用,请至代码开始处将国外IP网址访问改走WAN0口,即:all_foreign_wan_no=0
  692.                 ## 开启路由器DDNS客户端时,注意要用WAN0的外网动态/静态IP地址做外网访问路由器的指向
  693. #                ip rule add to 103.10.4.108 table $WAN0 prio $(( $IP_RULE_PRIO - 6 ))
  694.                 ip rule add from $route_local_ip table $WAN0 prio $(( $IP_RULE_PRIO - 6 ))

  695.                 ## 输出当前分流规则每个优先级的条目数至系统记录
  696.                 lz_ip_rule_output_syslog $(( $IP_RULE_PRIO - 6 )) $IP_RULE_PRIO

  697.                 echo $(date): -------- LZ rules run ok! -------------- >> /tmp/syslog.log

  698.         else

  699.                 ## 输出当前分流规则每个优先级的条目数至系统记录
  700.                 lz_ip_rule_output_syslog $(( $IP_RULE_PRIO - 6 )) $IP_RULE_PRIO

  701.                 echo $(date): -------- No LZ rules run! -------------- >> /tmp/syslog.log        
  702.         fi

  703.         ## 删除进程间同步用临时规则,要与脚本开始时的添加命令一致
  704.         if [ $( ip rule show | grep -c "from 168.168.168.168 to 169.169.169.169" ) != 0 ]; then
  705.                 ip rule del from 168.168.168.168 to 169.169.169.169 table $WAN0
  706.         fi

  707.         ## 刷新系统cache,使上述命令立即生效
  708.         ip route flush cache

  709. else

  710.         echo $(date): -------- LZ rules is runing! ------------ >> /tmp/syslog.log        
  711. fi

  712. echo $(date): The script commands executed!

  713. exit 0

  714. #END
复制代码



6

主题

52

帖子

554

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
527
魔法值
0
注册时间
2015-5-11
发表于 2018-8-20 14:40:01 | 显示全部楼层
顶~~~学习~~~~

13

主题

585

帖子

1004

积分

大魔法师

Rank: 5Rank: 5

精华
0
门户文章
0
魔力币
784
魔法值
0
注册时间
2015-5-17
发表于 2018-8-20 19:06:04 | 显示全部楼层
如果是电信单线双拨有办法解决这些问题又能叠加网速么

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-20 19:25:06 | 显示全部楼层
heeroyuyj 发表于 2018-8-20 19:06
如果是电信单线双拨有办法解决这些问题又能叠加网速么

取决于你的电信ISP是否真的支持,是否会限速等,如果都可以,理论上开启负载均衡即可

6

主题

169

帖子

403

积分

中级魔法师

Rank: 3Rank: 3

精华
0
门户文章
0
魔力币
358
魔法值
0
注册时间
2014-8-22
发表于 2018-8-21 12:40:34 | 显示全部楼层
感谢大神倾情奉献。现在的带宽基本上200M起步,双线接入的场景不多,除非商用。
反而是IPTV和外网这类场景相对的多了起来。大神可否编辑一个类似的规则,同样双线接入,WAN1外网,WAN2走IPTV,路由做组拨转发,翻WALL,看上去原理和你这个双线一致,可能具体IP需要调整,本人实属小白,没这个能力。

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-21 12:56:44 | 显示全部楼层
antren 发表于 2018-8-21 12:40
感谢大神倾情奉献。现在的带宽基本上200M起步,双线接入的场景不多,除非商用。
反而是IPTV和外网这类场景 ...

学习和研究之中,正逐步进化,谢谢支持!

837

主题

3436

帖子

1万

积分

大魔导师

Rank: 9Rank: 9Rank: 9

精华
0
门户文章
0
魔力币
12137
魔法值
0
注册时间
2017-5-9

R7000

发表于 2018-8-21 12:56:46 | 显示全部楼层
感谢楼主分享

9

主题

231

帖子

485

积分

中级魔法师

Rank: 3Rank: 3

精华
0
门户文章
0
魔力币
417
魔法值
0
注册时间
2016-5-18
发表于 2018-8-22 13:13:55 | 显示全部楼层
大侠辛苦了,有个基本的问题,您这最后联通,移动双叠加,到底什么效果。
suzuki

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-22 16:47:37 | 显示全部楼层
codej 发表于 2018-8-22 13:13
大侠辛苦了,有个基本的问题,您这最后联通,移动双叠加,到底什么效果。 ...

只是双拨分流,运行稳定流畅。
不考虑叠加,帖里已说的很明白。
这种路由器,固件里的负载均衡算法比较low,联通、移动宽带品质差异较大,负载均衡无法自动调整。感觉不同运营商之间做叠加效果都不太好,不能持久稳定。

8

主题

104

帖子

130

积分

初级魔法师

Rank: 2

精华
0
门户文章
0
魔力币
106
魔法值
0
注册时间
2017-8-14
发表于 2018-8-22 19:21:21 | 显示全部楼层
妙妙呜 发表于 2018-8-19 04:26
华硕及梅林固件改版路由器双拨不同ISP之策略分流方案V1.0进阶版文件名:firewall-start,无后缀,该文件名 ...

请教下,怎么上传文件到路由器中呀

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-22 20:28:01 | 显示全部楼层
allen840330 发表于 2018-8-22 19:21
请教下,怎么上传文件到路由器中呀

可以用WinSCP,网上有下

0

主题

14

帖子

115

积分

初级魔法师

Rank: 2

精华
0
门户文章
0
魔力币
113
魔法值
0
注册时间
2018-6-18
发表于 2018-8-22 21:12:10 | 显示全部楼层
gt5300官改能用不?

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-22 21:40:59 | 显示全部楼层
本帖最后由 妙妙呜 于 2018-8-22 21:51 编辑
six5206 发表于 2018-8-22 21:12
gt5300官改能用不?

华硕官方、梅林官方及改版原则上都可以,GT还未曾拥有,但你可以试试,不好就删掉,不会损坏机器。
刚获得来自APNIC的最新、最全、最准确,今晨零时的全国ISP服务器网段数据,分流将更加精准,正在做适配测试,很快就会有小版本升级,非常值得期待。

6

主题

85

帖子

166

积分

初级魔法师

Rank: 2

精华
0
门户文章
0
魔力币
147
魔法值
0
注册时间
2018-8-21
发表于 2018-8-23 07:39:25 | 显示全部楼层
非常有用的帖子,对小白帮助很大。

0

主题

14

帖子

115

积分

初级魔法师

Rank: 2

精华
0
门户文章
0
魔力币
113
魔法值
0
注册时间
2018-6-18
发表于 2018-8-23 09:41:17 | 显示全部楼层
妙妙呜 发表于 2018-8-22 21:40
华硕官方、梅林官方及改版原则上都可以,GT还未曾拥有,但你可以试试,不好就删掉,不会损坏机器。
刚获得 ...

关键我是小白,怎么装?

12

主题

1702

帖子

672

积分

高级魔法师

Rank: 4

精华
0
门户文章
0
魔力币
399
魔法值
0
注册时间
2018-7-15
 楼主| 发表于 2018-8-23 14:37:57 | 显示全部楼层
本帖最后由 妙妙呜 于 2018-8-23 18:08 编辑
six5206 发表于 2018-8-23 09:41
关键我是小白,怎么装?

主贴内已说明步骤,先用PC到网上百度下载安装最新中文版WinSCP,用无线或有线连上路由器,用WinSCP登录,然后如同用Windows的资源管理器,在图形界面中创建目录、粘贴、修改文件夹及文件属性。。。就可以了

8

主题

104

帖子

130

积分

初级魔法师

Rank: 2

精华
0
门户文章
0
魔力币
106
魔法值
0
注册时间
2017-8-14
发表于 2018-8-23 18:45:47 | 显示全部楼层
妙妙呜 发表于 2018-8-22 20:28
可以用WinSCP,网上有下


好的
我试试看
谢谢

8

主题

104

帖子

130

积分

初级魔法师

Rank: 2

精华
0
门户文章
0
魔力币
106
魔法值
0
注册时间
2017-8-14
发表于 2018-8-23 19:21:18 | 显示全部楼层
能用在电信加移动上吗?
我的路由器地址是192.168.50.1,需要在代码里修改吗?

联系我们|手机版|KoolShare ( 沪ICP备13045430号 )

GMT+8, 2019-1-16 12:18 , Processed in 0.098721 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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