iptables + php 上网计费实现

最近有一个香港的酒店提出需求,要到酒店业内的商务中心实行计费上网, 提供了如下技术方案:

1、设一台CENTOS5的机器做为路由,把需要计费的机器都设为用此服务器做网关。

2、服务器开启IPTABLE,通过IPTABLE控制能不能使用互联网。

 

记录下以下技术要点:

一、 php可以通过shell_exec来执行shell指令,但iptables的指令是root才有权限执行的,所在需要借助sudo.

具体做法如下:

1. 执行visudo, 注释掉 Default requiretty 一行

2. 在文件最后,加入apache ALL = NOPASSWD: /sbin/iptables

3. 用php  shell_exec("/usr/bin/sudo /sbin/iptables -I FORWARD -s  xxx.xxx.xxx.xxx  -j DROP")实现断网

4. 用php  shell_exec("/usr/bin/sudo /sbin/iptables -I FORWARD -s  xxx.xxx.xxx.xxx  -j ACCEPT")实现开通

二、CENTOS开启路由功能:

1、nano /etc/sysctl.conf,找到其中net.ipv4.ip_forward,设为1,保存后退出。
2、sysctl -p /etc/sysctl.conf让修改生效。

 

三、/etc/sysconfig/iptables内容:

 

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i eth0 -j ACCEPT
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state -m tcp --dport 1404 --state NEW -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state -m tcp --dport 80 --state NEW -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state -m tcp --dport 10000 --state NEW -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.100.254 -o eth0 -j MASQUERADE
COMMIT
# Completed

# Generated by webmin
*mangle
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed

 

以上是我在公司局域网存在其它路由器,且这台服务器是单网卡的情况下使用的。如果是linux服务器二张网卡,通过ADSL共享的方式,配置文件需做相应修改。

 

四、因为使用php实现计费,所以前端用javascript倒数给用户看,后端还需要用mysql的event来实现计时。

CREATE EVENT sec_counter
ON SCHEDULE EVERY 1 SECOND
DO
update IACS.t_ticket set secs_usage = secs_usage + 1 where ticket_status='R' and secs_total>secs_usage;

 

五、另做一个php文件,使用cronjob来每分钟执行一次,把secs_total<=secs_usage的机器断开。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值