cspm333 发表于 2016-8-19 00:19:36

本帖最后由 cspm333 于 2016-8-19 00:56 编辑

zh1000000 發表於 2016-8-18 02:36
還是幫我改回監測running狀態吧,掉線切不了,要等pppoe自己斷開了才有效。看來您原來的想法是對的,runn ...
花了點時間整理思緒:)
從所有pppoe找出最多3組running,並經過ping驗證的pppoe.

就算pppoe剩1組或2組也沒關係,總之pcc最大定義即3組 ;剩餘未利用的標記則disable(關閉)

{
:local pppoe [:len ]
:local ppp ""
:local num 1
:local count 0
:while (!($num=($pppoe+1) || $count=3)) \
   do={
          :if () \
            do={
                     :if (www.baidu.com count=3 interface="pppoe-out$num"]>0) \
                         do={
                              :if ($ppp="") do={:set ppp $num} else={:set ppp "$ppp,$num"}
                              :set count ($count+1)
                               }
                  }
          :set num ($num+1)
         }

:foreach v,i in=[:toarray $ppp] \
   do={
          :local array

          :if (!="both-addresses:$count/$v" \
                   || !="L$i" \
                   || ) \

            do={/ip firewall mangle set $array disable=no new-routing-mark="L$i" \
                        per-connection-classifier="both-addresses:$count/$v"}
         }

:local pcc
:if (($count+1)<=$pcc) \
    do={
            :for i from=($count+1) to=$pcc \
               do={
                         :local array
                         :if (!) do={/ip firewall mangle disable $array}
                        }
          }
}


zh1000000 发表于 2016-8-19 05:42:33

cspm333 发表于 2016-8-19 00:19
花了點時間整理思緒
從所有pppoe找出最多3組running,並經過ping驗證的pppoe.



哇哦,这个好全面,把我前面所有的想法都总结进去了,太厉害了您。

我放进去测试一下,第一时间反馈。太棒了。

zh1000000 发表于 2016-8-19 05:45:44

本帖最后由 zh1000000 于 2016-8-19 05:49 编辑

应该也需要把4-6也标记comment对吧,原来没标记,只标记了光纤的。因为我分了两组pcc,就是不想光纤在用时AD也投入进来。还看不懂这段script里光纤恢复时怎么让光纤优先。望指点

zh1000000 发表于 2016-8-19 10:24:01

经过测试,不能修改,没有一项参数被改变,测试的时候正好遇到光纤又掉数据。我观察了一下,掉线的时候running的状态其实和status的状态是一样的,也就是还在拨号状态,都是数据已经断了。如果单纯用ping命令指定pppoe-out的形式不可行的话,要不要动用netwatch这个功能呢?

zh1000000 发表于 2016-8-19 13:26:46

cspm333 发表于 2016-8-19 00:19
花了點時間整理思緒
從所有pppoe找出最多3組running,並經過ping驗證的pppoe.



电信工程人员来看过,说了换了机房分光设备以后,有一些用户的终端设备有问题,导致光污染,目前已经上报了,等待处理。也许还是需要更换设备,但是在他们没换之前,我想对用户有个保障,其实也不属于我的工作范围,纯属友情帮处理的,因为当时是我在职时做的,一直稳定用了那么多年,口碑还在。正常排查的顺序还是走了好几遍才确认是外网问题的,内网确定是正常的。还是要感谢您一直以来的热心解答和帮助,非常的感谢。

我现在用回这个您原来的这个脚本
{
:local connect true
:for i from=1 to=3 \
    do={/interface pppoe-client monitor "pppoe-out$i" once \
               do={:set connect ($connect && $status="connected")}}

:if ($connect) \
    do={:for i from=1 to=3 \
            do={:set connect ($connect && www.baidu.com count=3 interface="pppoe-out$i"]>0)}}

:for i from=1 to=3 \
    do={:local array
            :if ($connect) \
                do={:if (!="L$i") \
                            do={/ip firewall mangle set $array new-routing-mark="L$i"}} \
                else={:if (!="L$($i+3)") \
                           do={/ip firewall mangle set $array new-routing-mark="L$($i+3)"}}}


就是能不能去掉监测status这段,好像您说过单纯监测ping是不行的,必须建立在running之下对吗。那按这个来说,不管是监测status还是running再ping都是和现在一样的效果。

还有就是最后这个脚本,我知道要改标注,要加pcc规则。但是确定了是断线后不能修改任何参数,不知道问题出在哪。

zh1000000 发表于 2016-8-19 13:40:12

我手动制造了光纤其中一条断线,在我添加了其他三组PCC参数还改好标注以后,手动在窗口试走了一下,提示如下。

{... :local pppoe [:len ]
{... :local ppp ""                                       
{... :local num 1
{... :local count 0
{... :while (!($num=($pppoe+1) || $count=3)) \
{\...    do={                                 
{{...         :if () \
{{\...               do={                                       
{{{...                      :if (www.baidu.com count=3 interface="pppoe-out
$num"]>0) \ \
{{{\...                        do={                                             
{{{{...                                 :if ($ppp="") do={:set ppp $num} else={:se
t ppp "$ppp,$num"}"}
{{{{...                                 :set count ($count+1)                     
{{{{...                              }                     
{{{...                     }            
{{...         :set num ($num+1)
{{...          }               
{...            
{... :foreach v,i in=[:toarray $ppp] \
expected end of command (line 19 column 11)
>    do={
expected end of command (line 1 column 6)
>         :local array [/ip firewall mangle
find comment="pcc$($v+1)"]"]
syntax error (line 1 column 65)
>
>         :if ([/ip firewall mangle get $arr
ay per-connection-classifier]!="both-addressescount/$v" \ \
syntax error (line 1 column 42)
>                  || [/ip firewall mangle g
et $array new-routing-mark]!="L$i" \ \
expected command name (line 1 column 20)
>                  || [/ip firewall mangle g
et $array disable]) \ \
expected command name (line 1 column 20)
>
>               do={/ip firewall mangle set $a
rray disable=no new-routing-mark="L$i" \ \
expected end of command (line 1 column 17)
>                         per-connection-class
ifier="both-addressescount/$v"}"}
syntax error (line 1 column 50)
>          }
>
> :local pcc [/ip firewall mangle find comment
~"^pcc"]"]
> :if (($count+1)<=$pcc) \
syntax error (line 1 column 8)
>   do={
expected end of command (line 1 column 7)
>             :for i from=($count+1) to=$pcc \
syntax error (line 1 column 27)
>                  do={
expected end of command (line 1 column 20)
>                        :local array [/ip f
irewall mangle find comment="pcc$i"]"]
syntax error (line 1 column 78)
>                        :if (![/ip firewall
mangle get $array disable]) do={/ip firewall mangle disable $array}y}
syntax error (line 1 column 58)

zh1000000 发表于 2016-8-20 02:16:03

cspm333 发表于 2016-8-19 00:19
花了點時間整理思緒
從所有pppoe找出最多3組running,並經過ping驗證的pppoe.



输入内容没有少复制,窗口的结果少复制而已,您说过一次,我不会犯同样的错误的。

> {
{... :local pppoe [:len ]
{... :local ppp ""                                       
{... :local num 1
{... :local count 0
{... :while (!($num=($pppoe+1) || $count=3)) \
{\...    do={                                 
{{...         :if () \
{{\...               do={                                       
{{{...                      :if (www.baidu.com count=3 interface="pppoe-out
$num"]>0) \
{{{\...                        do={                                             
{{{{...                                 :if ($ppp="") do={:set ppp $num} else={:se
t ppp "$ppp,$num"}
{{{{...                                 :set count ($count+1)                     
{{{{...                              }                     
{{{...                     }            
{{...         :set num ($num+1)
{{...          }               
{...            
{... :foreach v,i in=[:toarray $ppp] \
expected end of command (line 19 column 11)
>    do={
expected end of command (line 1 column 6)
>         :local array [/ip firewall mangle
find comment="pcc$($v+1)"]
syntax error (line 1 column 65)
>
>         :if ([/ip firewall mangle get $arr
ay per-connection-classifier]!="both-addressescount/$v" \
syntax error (line 1 column 42)
>                  || [/ip firewall mangle g
et $array new-routing-mark]!="L$i" \
expected command name (line 1 column 20)
>                  || [/ip firewall mangle g
et $array disable]) \
expected command name (line 1 column 20)
>
>               do={/ip firewall mangle set $a
rray disable=no new-routing-mark="L$i" \
expected end of command (line 1 column 17)
>                         per-connection-class
ifier="both-addressescount/$v"}
syntax error (line 1 column 50)
>          }
>
> :local pcc [/ip firewall mangle find comment
~"^pcc"]
> :if (($count+1)<=$pcc) \
syntax error (line 1 column 8)
>   do={
expected end of command (line 1 column 7)
>             :for i from=($count+1) to=$pcc \

syntax error (line 1 column 27)
>                  do={
expected end of command (line 1 column 20)
>                        :local array [/ip f
irewall mangle find comment="pcc$i"]
syntax error (line 1 column 78)
>                        :if (![/ip firewall
mangle get $array disable]) do={/ip firewall mangle disable $array}
syntax error (line 1 column 58)
>                         }
>         }
> }


cspm333 发表于 2016-8-20 02:59:58

本帖最后由 cspm333 于 2016-8-20 03:30 编辑

輸入內容沒有少複製,窗口的結果少複製而已,您說過一次,我不會犯同樣的錯誤的。
從第19行第11個字元開始出錯,應該指是","號...後面的就不用看了,script只執行到19行.
但這語法是確定對的,應該是版本的問題,不知樓主的ROS版本是?


若真的因版本問題,不允許foreach同時宣告v和i ,
那也很容易解決,分開宣告就好了.
{
:local pppoe [:len ]
:local ppp ""
:local num 1
:local count 0
:while (!($num=($pppoe+1) || $count=3)) \
   do={
          :if () \
            do={
                     :if (www.baidu.com count=3 interface="pppoe-out$num"]>0) \
                         do={
                              :if ($ppp="") do={:set ppp $num} else={:set ppp "$ppp,$num"}
                              :set count ($count+1)
                               }
                  }
          :set num ($num+1)
         }

:local v 0
:foreach i in=[:toarray $ppp] \
   do={
          :local array
          :if (!="both-addresses:$count/$v" \
                   || !="L$i" \
                   || ) \

            do={/ip firewall mangle set $array disable=no new-routing-mark="L$i" \
                        per-connection-classifier="both-addresses:$count/$v"}

          :set v ($v+1)
         }

:local pcc
:if (($count+1)<=$pcc) \
    do={
            :for i from=($count+1) to=$pcc \
               do={
                         :local array
                         :if (!) do={/ip firewall mangle disable $array}
                        }
          }
}

注意頁面排版會吃掉字元,害死人!!
您應該看到script code有兩個:$吧 ,它其實是":$"兩個符號組合的.
若直接複製文字它內容是"addressescount" ,但這錯誤的...正確內容應該是"addresses:$count"
您複製下來,記得將"addressescount"還原成"addresses:$count" ,不然script永遠都是錯的!!

zh1000000 发表于 2016-8-20 09:11:57

那应该是这个原因了,我复制过去没见有表情就以为是正确复制的,我修改原来的看看。还有标记的问题您看看对不对,我多建立了三组pcc的规则总共6组来对应pppoe的1-6,原来没有标记的3组mark connection也加到6组同时添加了comment对应mark router的pcc1-6.我的理解是如果不标记mark connection,脚本如何修改per-connection-classifier参数,这样理解对吗?

zh1000000 发表于 2016-8-20 09:17:48

修改测试还是卡在你截图的那个字符那里,我的版本是5.26,X86的。用分开的测试就没有错误。

http://218.93.250.30:11880/data/attachment/forum/201608/20/024510o1zsleisxcs890zc.png

zh1000000 发表于 2016-8-20 09:30:38

脚本用窗口测试没问题,貌似修改不了任何参数。

cspm333 发表于 2016-8-20 11:07:11

zh1000000 发表于 2016-8-20 09:30
脚本用窗口测试没问题,貌似修改不了任何参数。

小弟不知道您標記(mangle)是怎麼安排,
如果是小弟做pcc負載均衡,是不會併做new-mark-connection與new-mark-routing

因為直接在把pcc放在new-mark-routing就可以看到成果,
在new-mark-routing之前在設個new-mark-connection感覺是多餘.

所以小弟寫的script ,也是尋找new-mark-routing裡的pcc參數.

若您的pcc比值是放在new-mark-connection ,這樣script就會搜尋不到內容無法作用.
即使您comment已標明了"pcc?"也一樣.
----------------------------------------
所以請您把comment擺在new-mark-routing ,切勿是new-mark-connection
new-mark-connection內的pcc參數也請移植到new-routing-mark

另外new-routing-mark內的connection-mark要關閉,因為不再使用了.

若您擔心修改會造成無法還原,那建議您建新的new-routing-mark ,把comment標在上面;
至於過去舊使用的先disable關閉,另外comment請移除,免的影響script操作.

----------------------------------------
題外話:

若是做nth負載均衡,new-mark-connection就真的不能省.
script內容也得跟著換血.

zh1000000 发表于 2016-8-20 11:46:57

cspm333 发表于 2016-8-20 11:07
小弟不知道您標記(mangle)是怎麼安排,
如果是小弟做pcc負載均衡,是不會併做new-mark-connection與new-ma ...

是早期的PCC做法,依照论坛某位坛友发布的脚本做的。没事,今天是周末,网络没人用,随便我怎么调试。依您所说。我修改了参数,手动制造故障,完美达到您脚本的预期效果。pcc参数和mark routing完美切换。要等到光纤假死估计需要运气了,我朋友昨天也收到了电信公司发来的短信,确实是要更换PON终端。至于为什么要标记mark connection,我记得应该是多ISP线路应用的区分还是为了限速的目的吧,小弟不才,只能依葫芦画瓢,在论坛里看到的就放到机子上看看能实现什么功能,在这个论坛学到很多东西,当然是建立在兴趣上的,ROS的多元化和稳定性让我一直在用它,家里也用官方的现成路由。一般设置没什么难的了,但是唯独脚本让我这种小白摸不着头脑,从脚本里看不懂的东西去网上搜索也是学到些皮毛,大概能猜测到脚本每句的意思和用途,遇到像您写得这些,真的是第一次看到,包括script当中一些表达的命令。

哪怕这个脚本没用多久,线路又恢复正常了,但是通过这段时间跟您的交流,实在让人刮目相看,很是敬仰,除了言谢也不知道能做些什么。要是现实的生活圈子中您一定会是一位良师益友,如果缘分有的话,哈。

小弟在广西南宁,有缘的话欢迎来做客。:)

cspm333 发表于 2016-8-21 02:16:11

zh1000000 发表于 2016-8-20 11:46
是早期的PCC做法,依照论坛某位坛友发布的脚本做的。没事,今天是周末,网络没人用,随便我怎么调试。依 ...

PCC:
    /ip firewall mangle
    add action=mark-routing chain=prerouting new-routing-mark=Gateway_1 \
    per-connection-classifier=src-address-and-port:3/0

    add action=mark-routing chain=prerouting new-routing-mark=Gateway_2 \
    per-connection-classifier=src-address-and-port:3/1

    add action=mark-routing chain=prerouting new-routing-mark=Gateway_3 \
    per-connection-classifier=src-address-and-port:3/2
PCC是進行除法運算,用餘數來決定路由方向.
http://i.imgur.com/UqQ0FbR.png
如:
src:192.168.88.100:44117 dst:64.233.189.188:80
範例指定pcc用src-address和src-port計算 ,所以(192+168+88+100+44117)/3=14888.333333

.3333代表沒整除,餘數為1 ,所以此connection的最後mark是Gateway_2

因是餘數計算,所以只有3/0(代表整除) ,不可能有3/3 (餘數和除數等同,這是什鬼東西)

因是餘算運算,所以連線數量太少有時會固定落在幾條Gatway
如:
src:192.168.88.100:44117 與src:192.168.88.104:1003 因餘數皆為1,所以會固定落在Gateway_2

所以要不讓連線固定落在幾條Gateway ,
可在pcc加入更多變數,如:dst-address 或dst-port ,甚至both全混入計算,讓餘數有更多的變化~
--------------------------------------

new-routing-mark=Gateway_1 per-connection-classifier=src-address-and-port:3/0
new-routing-mark=Gateway_2 per-connection-classifier=src-address-and-port:3/1
new-routing-mark=Gateway_3 per-connection-classifier=src-address-and-port:3/2

PCC非得這樣等份排列嗎? 不...
--------------------------------------
範例1:
new-routing-mark=Gateway_1 per-connection-classifier=src-address-and-port:2/0
new-routing-mark=Gateway_2 per-connection-classifier=src-address-and-port:2/0
new-routing-mark=Gateway_3 per-connection-classifier=src-address-and-port:2/1

這樣代表Gateway1先分得總流量的1/2 ,所以剩1/2

到了Gateway2時 ,將剩下1/2的流量再切成1/2 (也就是Gateway2只分得總流量的1/2 x 1/2 = 1/4)

Gateway3接收另1/4 ,這樣懂吧;P
--------------------------------------
範例2:
new-routing-mark=Gateway_1 per-connection-classifier=src-address-and-port:4/0
new-routing-mark=Gateway_2 per-connection-classifier=src-address-and-port:3/0
new-routing-mark=Gateway_3

這樣代表Gateway1先分得總流量的1/4 ,所以剩3/4

到了Gateway2時 ,將剩下3/4的流量再切成1/3 (Gateway2分得總流量的3/4 x 1/3 = 3/12 = 1/4)

您有發現Gateway3沒標per-connection-classifier嗎?
也就是無論先前Gateway1與Gateway2分了多少,剩下的Gateway3全收了.

這樣不難理解吧;P
--------------------------------------
PCC的v/i

重點永遠擺在v ,是v在決定等份.

而i 只是取決等份中的那份 ,就如同蛋糕4等份中,您要取那塊.
但這4塊大小其實是一樣的 ,並不會影響機率 ,也都同屬1/4內.

未何會特別提PCC機率呢?
您同時有光纖與ADSL ,光纖的頻寬一定比ADSL大...

假設光纖40M, ADSL只有20M.
用1:1的比例分配PCC自然不均 ; 但用2:1的比例配PCC這就沒爭議吧.呵~


zh1000000 发表于 2016-8-21 15:06:28

原来还可以这样,受教了。原先的理解比较死板,也就是用你打的比方来说吧,光纤40M,AD20M,就只会把光纤分为两份,然后建立3/X的PCC参数,线路多了又不能整除就纠结了,比方两条50M光纤然后4条12M的AD,就开始算平均分后的份额再建立对应条数的PCC规则,就开始纠结50/12以后那点带宽的余量。;P;P;P

所以说一个好的老师教出来的学生要比普通学生优秀很多,因为在起跑线上就已经落后了。虽然最终都达到了效果,但是理解不一样,到以后现实应用起来就不能很好的变通。
页: 1 2 3 [4] 5
查看完整版本: PCC断线自动修改脚本遇到问题,寻找解决的方法。