马上注册成为ROSABC会员,随时发帖回复。
您需要 登录 才可以下载或查看,没有账号?会员注册
x
關於PPPOE拨号自动推送续费和停网提醒問題!
這裡主要實現WEB頁面通知PPPOE用戶網絡使用時間剩餘情況,並到期停用PPPOE用戶;
由於我根據網易博客大河的一篇文章來分析,在操作中出現了一些問題,其中包括腳本無法自動根據PPPOE用戶的備註日期來修改profile項,其profile有三項,分正常、通告、過期三個池;另外mangle標記有點問題;
下面貼出我的操作步驟,裡面有些地方是錯的,所以請各位指出錯的地方加以修正!
PPPOE用戶:
# NAME SERVICE CALLER-ID PASSWORD PROFILE REMOTE-ADDRESS
0 ;;; admin
manger pppoe ******** default-encryption
1 ;;; 2011/11/18
users1 pppoe ******** notice (通知profile,對應一個池)
2 ;;; 2011/12/3
users2 pppoe ******** normal (正常profile,對應一個池)
3 ;;; 2011/12/30
users3 pppoe ******** forbidden (停用profile,對應一個池)
這裡的profile是自己隨便定義,因為腳本會通過PPPOE用戶備註時間來修改PPPOE用戶的profile是屬於哪個profile項;
MANGLE標記:
0 chain=prerouting action=mark-connection new-connection-mark=HTTP passthrough=no connection-state=new
src-address-list=pppoelist dst-address-list=!accept in-interface=Wan1_ADSL1 content=www.
1 chain=prerouting action=add-src-to-address-list src-address-list=pppoelist dst-address-list=!accept
address-list=pppoefornotice address-list-timeout=4s connection-mark=HTTP
2 X chain=prerouting action=mark-connection new-connection-mark=notice_conn passthrough=yes
3 chain=prerouting action=add-src-to-address-list src-address-list=pppoe dst-address-list=!accept
address-list=pppoeforforbidden address-list-timeout=3s connection-mark=HTTP
根據大河的[PPPOE拨号自动推送续费和停网提醒]文章意思——
編號0是:
标记出要重定向到提醒页的访问外网时的连接(源为内部要发通知提醒的IP段,目标要排除本地网段,in interface要选择到外网访问时进的ROS软路由接口,只标记HTTP,标记连接状态选new,最好指定content=www.)
編號1是:
对先前做过标记的连接,执行add src to address list,只要第一步够精确,此处不需要附加条件,如果发现此处添加到地址列表里有不期望的,那就需要进一步在规则上筛选条件。src address地址选择要通知的网段且不在已通知列表noticelist中的地址,设置timeout为1-3秒,添加的此地址列表叫首次要执行提醒通知的地址列表。
編號2是:
如果想让重定向到提醒页面后等待几秒自动打开先前访问的网页,则需要在上述第二步后增加一条标记连接notice_conn,此标记连接的src.address为首次要提醒的地址列表。然后在计划任务里添加自动清除连接的脚本:
:foreach conn in [/ip firewall connection find connection-mark="notice_conn"] do={/ip firewall connection remove $conn}
要执行上述清除连接的脚本的原因是,当用户打开网页重定向后,此连接及NAT映射关系已经存在。如果不关闭浏览器,则是同一个会话,因此不会重定向到需要打开的外网网页
編號3是:
对先前做过标记的连接,执行add src to address list,只要第一步够精确,此处不需要附加条件,如果发现此处添加到地址列表里有不期望的,那就需要进一步在规则上筛选条件。设置的timeout值为第一次通知后到再次通知的时间间隔。此地址列表叫已经通知过的地址列表。
NAT :
4 ;;; pppoefornormal
chain=srcnat action=masquerade src-address-list=pppoefornormal
5 ;;; pppoefornotice
chain=dstnat action=dst-nat to-addresses=192.168.41.102 to-ports=8081 protocol=tcp src-address-list=pppoefornotice
dst-port=80
6 ;;; pppoeforforbidden
chain=dstnat action=dst-nat to-addresses=192.168.41.104 to-ports=8082 protocol=tcp
src-address-list=pppoeforforbidden dst-port=80
說明:192.168.41.102 是預告通知WEB服務器,192.168.41.104 是停用通知WEB服務器;
編號4.5.6是:
对在首次通知列表里的地址的HTTP访问做DST-NAT,将访问转向内部的HTTP页面,注意服务器回程包要能走ROS软路由,也就是DST-NAT的到内部服务器的包经LAN时要SRC-NAT。(最後一句說要注意回程包,這裡我有點含糊!)
下面腳本是進行分析PPPOE用戶的備註時間是否到期,如果到期則發送WEB通知PPPOE用戶,如果在規定時間內到期則發送WEB預先通知PPPOE用戶;到期的PPPOE用戶則停用PPPOE帳戶,停用後續費的PPPOE帳戶再自動檢測開通該帳戶;
下面腳本應該不需要做任何修改,腳本如下:
#daysofnoticebeforeend为提前发送到期通知的天数
#profilefornormal为正常状态下的模版
#profilefornotice为提前发送到期通知的模板
#profileforforbidden为提前发送到期通知的模板
#daysaferendtoforbidden为到期后几天停用用户账号,0为到期即停机
:local daysofnoticebeforeend
:local profilefornormal
:local profilefornotice
:local profileforforbidden
:local daysafterendtoforbidden
:set daysofnoticebeforeend 4
:set profilefornormal normal
:set profilefornotice notice
:set profileforforbidden forbidden
:set daysafterendtoforbidden 0
#获取系统年月日
:local nyr [/system clock get date]
#将月份month转换为数字形式
:local month ([:find jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec [:pick $nyr 0 3]]+1)
#月份小于10时前面补零
:if ($month=$nyr && ($numcomment - $nyr)=$nyr && ($numcomment - $nyr)>$daysofnoticebeforeend && $oneprofile!=$profilefornormal) do={
/ppp secret set [/ppp secret find name=$onename] profile=$profilefornormal;
:log warning ("用户【" . $onename . "】恢复上网!")
};
:if ($nyr>$numcomment && ($nyr - $numcomment)>$daysafterendtoforbidden && $oneprofile!=$profileforforbidden) do={
:if ([:len [/ppp active find name=$onename]]>0) do={/ppp active remove [/ppp active find name=$onename]}
/ppp secret set [/ppp secret find name=$onename] profile=$profileforforbidden;:set ii ($ii - 1)
:log error ("用户【" . $onename . "】已过期停用并强制下线!")
};
} else={:log error ("用户【" . $onename . "】的备注【" . $onecomment . "】格式有误,请重新备注!")};
}
:log warning ("有效用户数【" . $ii . "】")
上面就是我的整個操作過程,不過出了點狀況;第一個是腳本並沒有自動修改profile項,腳本是運行的;第二個是mangle標記那裡有點問題;第三個是NAT重定向上出了點問題,應該是回程出了狀況;有時間的朋友或懂的朋友請指出我錯的地方,我再加以修改,這次課題成功後我再貼出完整內容給大家做參考,共同學習,共同進步!
嘿嘿,各位!不好意思,繁体字可能让各位阅读有点吃力,这里说声"sorry!";另外,我会12小时对该贴进行更新和修改,更新和修改的地方会用蓝色字进行标识,尽量不要误导大家!,也希望大家多指出错误的地方,加以纠正!
各位,經過一段時間的周折,走了不少歪路!庆幸的是已經把問題解決了,今天2011-12-20號,我已經通過博客發表出來,有興趣的朋友可以去參考,有個人想法或提議的請留言和QQ!下面是我個人博客:Http
: //
blog.163.com/szy8706@yeah/blog/static/627131852011111744238453/ |