對不起,模糊的標題,但我的問題是有點複雜的解釋。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調用改變了請求去原始目的地而它仍然在我的服務器上處理,這對我來說沒有任何意義。因此,在發出這些終端命令後,返回哪個靜態頁面或重定向哪個頁面並不重要 - 我的函數的返回值不被客戶端使用。
我該如何解決這個問題?每一塊有用的信息都是值得讚賞的。
有沒有人有一個想法如何解決這個問題? – zinfandel