2015-05-10 31 views
0

對不起,模糊的標題,但我的問題是有點複雜的解釋。iptables/cherrypy重定向更改請求中處理

我已經爲cherrypy中的WLAN接入點寫了一個「強制門戶」,它只是一個服務器,它阻止MAC地址在某個頁面註冊之前訪問互聯網。爲此,我寫了重定向所有的HTTP流量給我一些iptables規則

sudo iptables -t mangle -N internet 
sudo iptables -t mangle -A PREROUTING -i $DEV_IN -p tcp -m tcp --dport 80 -j internet 
sudo iptables -t mangle -A internet -j MARK --set-mark 99 
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp -m mark --mark 99 -m tcp --dport 80 -j DNAT --to-destination 10.0.0.1 

(此設置的細節不是我的問題很重要,只是注意,「互聯網」鏈創建了重定向HTTP到接入點上的端口80)

在AP上的端口80處,cherrypy服務器提供一個帶有「註冊」按鈕的靜態登錄頁面,該按鈕向http://10.0.0.1/agree發出POST請求。爲了處理這個請求,我創建了這樣的方法:

@cherrypy.expose 
def agree(self, **kwargs): 

    #retrieve MAC address of client by checking ARP table 
    ip = cherrypy.request.remote.ip 
    mac = str(os.popen("arp -a " + str(ip) + " | awk '{ print $4 }' ").read()) 
    mac = mac.rstrip('\r\n') 

    #add an iptables rule to whitelist the client, rmtrack to remove previous connection information 
    os.popen("sudo iptables -I internet 1 -t mangle -m mac --mac-source %s -j RETURN" %mac) 
    os.popen("sudo rmtrack %s" %ip) 

    return open('welcome.html') 

那麼這種方法從ARP表中檢索客戶端的MAC地址,然後從「互聯網」鏈增加一個iptables例外刪除特定MAC那將流量重定向到門戶。

現在,當我測試這個設置時,會發生一些有趣的事情。在iptables中添加例外功能 - 即客戶端現在可以訪問網頁而不會被重定向到我。問題是初始請求沒有通過我的服務器,即頁面welcome.html從不打開 - 而是,在執行iptables和rmtrack調用之後,客戶端嘗試打開「同意」路徑在重定向到我的門戶之前他們請求的頁面。

例如,如果他們在地址欄中點擊「google.com」,然後被髮送到我的門戶並同意,他們現在將嘗試打開http://google.com/agree。結果,他們在一段時間後出現錯誤。看起來,iptables或rmtrack調用改變了請求去原始目的地它仍然在我的服務器上處理,這對我來說沒有任何意義。因此,在發出這些終端命令後,返回哪個靜態頁面或重定向哪個頁面並不重要 - 我的函數的返回值不被客戶端使用。

我該如何解決這個問題?每一塊有用的信息都是值得讚賞的。

+0

有沒有人有一個想法如何解決這個問題? – zinfandel

回答

0

今天我設法解決了我的問題,所以我會把解決方案放在這裏,儘管我有點懷疑有很多人遇到同樣的問題。

基本上,在強制門戶服務器上的請求處理期間,所需的全部內容都是絕對路徑重定向。例如,就我而言,索引頁上您同意我的T & C的表單正在調用操作/agree。這意味着客戶被認爲他在原始目標服務器上訪問這些路徑(例如google.com/agree)。 改爲使用絕對格式10.0.0.1/agree,客戶端將在iptables調用之後遵循正確的重定向。