找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 33314|回复: 97

[脚本] PCC断线自动修改脚本遇到问题,寻找解决的方法。

[复制链接]
发表于 2016-7-29 13:09:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
一直用论坛的PCC自动修改脚本,多年来都没什么问题,今天有客人说上不了网。打开马上就发现问题所在。所有pppoe链接正常,个别线路没有数据通过。先不管是机房还是线路问题吧。这样脚本检测就失效了。默认还是链接状态,所以没有修改PCC参数。导致断流或者上不了网。

有没有不检测PPPOE状态的切换方法或者脚本呢?
routeros
发表于 2016-7-29 14:21:09 | 显示全部楼层
你需的是检修线路 脚本
routeros
回复

使用道具 举报

发表于 2016-7-29 20:45:12 | 显示全部楼层
script多加個ping值判斷即可,
不只pppoe的狀態要running ,而且透過router ping向指定的遠端時也要能通暢.
(ping可以用interface這參數指定出口)

script運作時,即使pppoe的running=yes ,但ping的輸出等於0 ,也得判定pppoe是無效的.
這樣的script就不會再出包了
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-4 18:21:57 | 显示全部楼层
感谢楼上的朋友的热心回复。当时想过用Watchdog来检测线路状态。由于时间太忙就没深究。

线路状况是这样的。3条20M光纤做PCC,3条ADSL的8M做PCC备用,平时不开的。用防断线脚本自动改PCC参数脚本,因为光纤线路稳定些,而且线路带宽不一样跟AD混着做没必要,基本上都没出过问题。
近段时间出现光纤线路的PPPOE状态都是connected状态,但是没有数据流量。手动拨号就会发现全部不能拨号状态,单独试过错误代码是651。这些应该是机房的问题了。所以我就想把备用的AD用上,在光纤不能正常拨号的时候自动切换到AD的PCC。
可能表达的不是很清楚,毕竟也是略懂而已。所以脚本那些语句我是不会写的,是不是在PCC检测脚本里加一句类似:set a [/ping 114.114.114.114 count=100  interval=0.1 interface=$i]这类的?

还望赐教,最好能帮写完整的句柄。感谢
routeros
回复

使用道具 举报

发表于 2016-8-4 22:06:12 | 显示全部楼层
本帖最后由 cspm333 于 2016-8-5 02:11 编辑
zh1000000 發表於 2016-8-4 18:21
感謝樓上的朋友的熱心回覆。當時想過用Watchdog來檢測線路狀態。由於時間太忙就沒深究。

線路狀況是這樣 ...

每個人的設定環境都不一樣 ,小弟先假設您匯出環境是這樣的:
/interface pppoe-client
#光纖
add ac-name="" add-default-route=no allow=pap dial-on-demand=no disabled=no interface=vrrp1 keepalive-timeout=60 \
      max-mru=1480 max-mtu=1480 mrru=disabled name=pppoe-out1 password=??? profile=default service-name="" use-peer-dns=no user=???
add ac-name="" add-default-route=no allow=pap dial-on-demand=no disabled=no interface=vrrp2 keepalive-timeout=60 \
      max-mru=1480 max-mtu=1480 mrru=disabled name=pppoe-out2 password=??? profile=default service-name="" use-peer-dns=no user=???
add ac-name="" add-default-route=no allow=pap dial-on-demand=no disabled=no interface=vrrp3 keepalive-timeout=60 \
      max-mru=1480 max-mtu=1480 mrru=disabled name=pppoe-out3 password=??? profile=default service-name="" use-peer-dns=no user=???

#ADSL
add ac-name="" add-default-route=no allow=pap dial-on-demand=no disabled=no interface=vrrp4 keepalive-timeout=60 \
      max-mru=1480 max-mtu=1480 mrru=disabled name=pppoe-out4 password=??? profile=default service-name="" use-peer-dns=no user=???
add ac-name="" add-default-route=no allow=pap dial-on-demand=no disabled=no interface=vrrp5 keepalive-timeout=60 \
      max-mru=1480 max-mtu=1480 mrru=disabled name=pppoe-out5 password=??? profile=default service-name="" use-peer-dns=no user=???
add ac-name="" add-default-route=no allow=pap dial-on-demand=no disabled=no interface=vrrp6 keepalive-timeout=60 \
      max-mru=1480 max-mtu=1480 mrru=disabled name=pppoe-out6 password=??? profile=default service-name="" use-peer-dns=no user=???

/ip firewall mangle
add action=mark-routing chain=prerouting disabled=no comment=pcc1 new-routing-mark=to_pppoe1 passthrough=no \
      src-address=192.168.1.0/24 per-connection-classifier=both-ports:3/0
add action=mark-routing chain=prerouting disabled=no comment=pcc2 new-routing-mark=to_pppoe2 passthrough=no \
      src-address=192.168.1.0/24 per-connection-classifier=both-ports:3/1
add action=mark-routing chain=prerouting disabled=no comment=pcc3 new-routing-mark=to_pppoe3 passthrough=no \
      src-address=192.168.1.0/24 per-connection-classifier=both-ports:3/2
=================================================================
script:

:for i from=1 to=3 \
    do={
            :local array [/ip firewall mangle find comment="pcc$i"]
            :if ([/ping www.baidu.com count=3 interface="pppoe-out$i"]>0) \
                do={:if ([/ip firewall mangle get $array new-routing-mark]!="to_pppoe$i") \
                            do={/ip firewall mangle set $array new-routing-mark="to_pppoe$i"}} \
                else={:if ([/ip firewall mangle get $array new-routing-mark]!=("to_pppoe".($i+3))) \
                             do={/ip firewall mangle set $array new-routing-mark=("to_pppoe".($i+3))}}
           }


routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 01:41:06 | 显示全部楼层
cspm333 发表于 2016-8-4 22:06
每個人的設定環境都不一樣 ,小弟先假設您匯出環境是這樣的:
/interface pppoe-client
#光纖

首先非常感谢这位朋友的热心帮助。大致看懂了些,师傅点一点,脑子直接通了一大截。我理解为这样您看对不对。

通过ping和检测拨号的running状态来侦测光纤拨号是否正常,如果不是,就改变每组PCC的new-routing-mark值,让其指定AD对应的线路,是这样吗?


那还有个问题就是,如果光纤线路恢复正常了,会跳回原来的PCC值吗?

点评

小弟只是起個頭,若光纖處不正常狀態.您還需透過script讓光纖進行重撥. 不然光纖ping檢測一直沒過,script是不會應允從adsl換回光纖的.  发表于 2016-8-5 02:35
我後來把檢查pppoe是否running給移除了,因為指定pppoe往百度ping ,ping的通代表interface可用,根本無需再驗證pppoe是否處在running或connected  发表于 2016-8-5 02:14
沒有變動到pcc值,只是將new-routing-mark換對象.光纖可用就繼續用光纖,不行的話就暫換成ADSL  发表于 2016-8-5 02:08
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 02:49:55 | 显示全部楼层
试了试你的脚本,发现了问题,手动制造了个故障,发现只有PCC1能修改为AD1的mark值,2和3还是光纤线路的mark值没变,看看是不是哪里错了?

点评

您把script文字一次全部貼到文字視窗,視窗會run流程給您看.有錯誤文字視窗會顯示出來  发表于 2016-8-5 02:58
應該是您沒將rule的comment分別標pcc1與pcc2與pcc3  发表于 2016-8-5 02:56
routeros
回复

使用道具 举报

发表于 2016-8-5 02:58:52 | 显示全部楼层
本帖最后由 cspm333 于 2016-8-5 13:20 编辑

要加上光纖自動重撥,其實不難.
因為透過script將光纖換成adsl ,即代表光纖是無效的.
您只要將光纖換成adsl的同時,也要求光纖重撥一次,就這麼簡單:
:for i from=1 to=3 \
    do={
            :local array [/ip firewall mangle find comment="pcc$i"]
            :if ([/ping www.baidu.com count=3 interface="pppoe-out$i"]>0) \
                do={:if ([/ip firewall mangle get $array new-routing-mark]!="to_pppoe$i") \
                            do={/ip firewall mangle set $array new-routing-mark="to_pppoe$i"}} \
                else={:if ([/ip firewall mangle get $array new-routing-mark]!=("to_pppoe".($i+3))) \
                             do={/ip firewall mangle set $array new-routing-mark=("to_pppoe".($i+3))}
                          /interface enable "pppoe-out$i"}
           }

如上描束,將pppoe再enable一次,pppoe就重新撥號了.
假如重撥後沒用,下次檢查再使用adsl的同時,又會再重撥光纖一次.

唯有new-routing-mark使用光纖時,光纖才不會重撥.
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 03:01:11 | 显示全部楼层
我认为重拨就不用再麻烦script了,因为断网以后,哪怕还是假连接,迟早都会断开,那么光纤线路就一直处于拨号状态,直到线路恢复正常,pppoe正常拨上。

还有就是,已经切换为AD以后,script还是一直在ping百度吧,这样是否不妥当。如果光纤线路一直正常工作,一直ping百度会不会被drop掉IP呢。这样会误动作的。

点评

count=3 即代表ping 3個封包就停止 ,3個pppoe只會ping 9個封包.  发表于 2016-8-5 03:03
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 03:07:44 | 显示全部楼层
zh1000000 发表于 2016-8-5 02:49
试了试你的脚本,发现了问题,手动制造了个故障,发现只有PCC1能修改为AD1的mark值,2和3还是光纤线路的mar ...

标注好了的,确实只切换了pcc1的

点评

請您將script貼到文字視窗檢視,否則小弟無法debug  发表于 2016-8-5 03:14
routeros
回复

使用道具 举报

发表于 2016-8-5 03:09:06 | 显示全部楼层
本帖最后由 cspm333 于 2016-8-5 03:11 编辑


                               
登录/注册后可看大图
Snap1.png
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 03:21:54 | 显示全部楼层
明白的,但PCC2和3确实没有切换,是不是脚本认为已经切换pcc1就完成了?

万全一点的办法能不能这样,因为pppoe_out1到3是同一根光纤进来的。就单单指定pppoe_out1为监测对象,当百度ping不通是直接切换MARK为AD123,当光纤正常时再切回来。

具体该怎么改script?

点评

3次迴圈即代表比對了3次,您覺得第2和3迴圈有問題. 您可以跑2 2 只看2的結果;或者是2 3, 從2開始,3結束  发表于 2016-8-5 03:49
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 03:24:43 | 显示全部楼层
不知道怎么截图。我直接复制好了,我图方便改了你写的to_pppoe为L。

> :for i from=1 to=3 \
\...     do={                                             
{...             :local array [/ip firewall mangle find comment="pcc$i"]
{...             :if ([/ping www.baidu.com count=3 interface="pppoe-out$i"]>0 && [/interface pppoe-client get "
pppoe-out$i" running]) \
{\...                 do={:if ([/ip firewall mangle get $array new-routing-mark]!="L$i") \                     
{{\...                             do={/ip firewall mangle set $array new-routing-mark="L$i"}} \
{\...                 else={:if ([/ip firewall mangle get $array new-routing-mark]!=("L".($i+3))) \
{{\...                              do={/ip firewall mangle set $array new-routing-mark=("L".($i+3))}}
{...            }                                                                                    
HOST                                     SIZE TTL TIME  STATUS                                                
14.215.177.38                              56  56 19ms
14.215.177.38                              56  56 14ms
14.215.177.38                              56  56 13ms
    sent=3 received=3 packet-loss=0% min-rtt=13ms avg-rtt=15ms max-rtt=19ms
HOST                                     SIZE TTL TIME  STATUS                                                

HOST                                     SIZE TTL TIME  STATUS                                                
14.215.177.37                              56  56 16ms
14.215.177.37                              56  56 16ms
14.215.177.37                              56  56 15ms
    sent=3 received=3 packet-loss=0% min-rtt=15ms avg-rtt=15ms max-rtt=16ms
HOST                                     SIZE TTL TIME  STATUS                                                

HOST                                     SIZE TTL TIME  STATUS                                                
14.215.177.38                              56  56 16ms
14.215.177.38                              56  56 16ms
14.215.177.38                              56  56 14ms
    sent=3 received=3 packet-loss=0% min-rtt=14ms avg-rtt=15ms max-rtt=16ms
HOST                                     SIZE TTL TIME  STATUS

点评

依您貼的內文,script沒顯示錯誤喔,有run 3次迴圈共ping9次...而且沒任何錯別字或語法上警告喔  发表于 2016-8-5 03:39
routeros
回复

使用道具 举报

 楼主| 发表于 2016-8-5 03:46:01 | 显示全部楼层
本帖最后由 zh1000000 于 2016-8-5 03:47 编辑

是没提示错误的,三次ping都正常。但为什么不修改第二第三的PCC呢,而且pcc1也是脚本运行了很多次才转换的,我手动断开光纤,脚本运行了6,7次才切换。我设置脚本运行时间为10秒。是怎么回事啊,一头雾水了。
routeros
回复

使用道具 举报

发表于 2016-8-5 03:58:05 | 显示全部楼层
本帖最后由 cspm333 于 2016-8-5 13:19 编辑

傻瓜script ,總沒道理錯誤吧

:if ([/ping www.baidu.com count=3 interface=pppoe-out1]>0) \
         do={:if ([/ip firewall mangle get [find comment=pcc1] new-routing-mark]!="to_pppoe1") \
                     do={/ip firewall mangle set [find comment=pcc1] new-routing-mark=to_pppoe1}} \
         else={:if ([/ip firewall mangle get [find comment=pcc1] new-routing-mark]!="to_pppoe4") \
                       do={/ip firewall mangle set [find comment=pcc1] new-routing-mark=to_pppoe4}
                   /interface enable pppoe-out1}

:if ([/ping www.baidu.com count=3 interface=pppoe-out2]>0) \
         do={:if ([/ip firewall mangle get [find comment=pcc2] new-routing-mark]!="to_pppoe2") \
                     do={/ip firewall mangle set [find comment=pcc2] new-routing-mark=to_pppoe2}} \
         else={:if ([/ip firewall mangle get [find comment=pcc2] new-routing-mark]!="to_pppoe5") \
                       do={/ip firewall mangle set [find comment=pcc2] new-routing-mark=to_pppoe5}
                   /interface enable pppoe-out2}

:if ([/ping www.baidu.com count=3 interface=pppoe-out3]>0) \
         do={:if ([/ip firewall mangle get [find comment=pcc3] new-routing-mark]!="to_pppoe3") \
                     do={/ip firewall mangle set [find comment=pcc3] new-routing-mark=to_pppoe3}} \
         else={:if ([/ip firewall mangle get [find comment=pcc3] new-routing-mark]!="to_pppoe6") \
                       do={/ip firewall mangle set [find comment=pcc3] new-routing-mark=to_pppoe6}
                   /interface enable pppoe-out3}
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-4-27 04:17 , Processed in 0.082675 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

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