第一步:在Web服務器上加一條跳轉命令,將全部客戶端瀏覽器80端口的全部請求都跳轉到web服務器首頁,命令以下:node
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.6.1:80 (root權限執行)web
這條命令將客戶端80端口的請求都跳轉到web服務器地址(192.168.6.1:80 具體根據本身web服務器的ip和端口)shell
另外,將指定ip跳轉到指定地址的命令以下:瀏覽器
iptables -t nat -A PREROUTING -s 192.168.6.102 -p tcp --dport 80 -j DNAT --to 192.168.6.1:80 (root權限執行)服務器
上面這條命令就至關於將ip爲192.168.6.102的客戶端跳轉到服務器地址首頁框架
第二步:經過網頁接口將客戶端ip放行dom
客戶端打開瀏覽器應該會被重定向到咱們的web首頁,這個時候點擊網頁首頁上的一個按鈕,將客戶端ip傳到服務器端,服務器接收到ip後執行放行命令,以下:tcp
var exec = require('child_process').exec; ui
router.get('/random', function(req, res, next){
var ip = req.ip.substring(7, req.ip.length);
exec('iptables -t nat -I PREROUTING 1 -s '+ip+' -j ACCEPT');
exec('iptables -t nat -I PREROUTING 1 -s '+ip+' -j RETURN');
log('jump', req.ip, 'surfing the internet');
res.success("ready to the internet!");
res.redirect('back');
});spa
固然,我這兒是用的nodejs框架,重要看兩個部分:
1. iptables -t nat -I PREROUTING 1 -s '+ip+' -j ACCEPT 這條命令會將客戶端地址爲ip的放行,至關於經過了認證,執行完這條命令後這個ip的客戶端就能夠正常上網了
固然,刪除命令:iptables -t nat -D PREROUTING '+ip+' -j ACCEPT
2. nodejs執行腳本的接口exec, 這裏經過var exec = require('child_process').exec; 建立了一個子進程,而後就能夠很方便地調用shell腳本了,十分方便。
這裏順便介紹一下nodejs子進程:
NodeJS 子進程提供了與系統交互的重要接口,其主要 API 有:
標準輸入、標準輸出及標準錯誤輸出的接口
child.stdin 獲取標準輸入
child.stdout 獲取標準輸出
child.stderr 獲取標準錯誤輸出
獲取子進程的PID:child.pid
提供生成子進程的重要方法:child_process.spawn(cmd, args=[], [options])
提供直接執行系統命令的重要方法:child_process.exec(cmd, [options], callback)
提供殺死進程的方法:child.kill(signal='SIGTERM')
實例一:利用子進程獲取系統內存使用狀況
建立文件test1.js 寫入以下代碼:
var spawn = require('child_process').spawn,
free = spawn('free', ['-m']);
// 捕獲標準輸出並將其打印到控制檯
free.stdout.on('data', function (data) {
console.log('標準輸出:\n' + data);
});
// 捕獲標準錯誤輸出並將其打印到控制檯
free.stderr.on('data', function (data) {
console.log('標準錯誤輸出:\n' + data);
});
// 註冊子進程關閉事件
free.on('exit', function (code, signal) {
console.log('子進程已退出,代碼:' + code);
});
保存後執行文件
$ node test1.js
標準輸出:
total used free shared buffers cached
Mem: 3949 1974 1974 0 135 959
-/+ buffers/cache: 879 3070
Swap: 3905 0 3905
子進程已退出,代碼:0
以上輸出至關與在命令行執行:free -m 命令。
實例一:利用子進程統計登錄次數
建立文件test2.js 寫入以下代碼:
var exec = require('child_process').exec,
last = exec('last | wc -l');
last.stdout.on('data', function (data) {
console.log('標準輸出:' + data);
});
last.on('exit', function (code) {
console.log('子進程已關閉,代碼:' + code);
});
保存後執行文件
$ node test2.js
標準輸出:203
子進程已關閉,代碼:0
其與直接在命令行輸入:last | wc -l 的結果是同樣的。
具體能夠參看文章:http://www.jb51.net/article/37951.htm