Redirect iptables/cherrypy重定向更改请求中间处理

Redirect iptables/cherrypy重定向更改请求中间处理,redirect,iptables,cherrypy,Redirect,Iptables,Cherrypy,很抱歉标题含糊不清,但我的问题解释起来有点复杂 我在cherrypy中为WLAN接入点编写了一个“捕获门户”,它只是一个服务器,在MAC地址在某个页面注册之前阻止其访问internet。为此,我编写了一些iptables规则,将所有HTTP流量重定向到我 sudo iptables -t mangle -N internet sudo iptables -t mangle -A PREROUTING -i $DEV_IN -p tcp -m tcp --dport 80 -j internet

很抱歉标题含糊不清,但我的问题解释起来有点复杂

我在cherrypy中为WLAN接入点编写了一个“捕获门户”,它只是一个服务器,在MAC地址在某个页面注册之前阻止其访问internet。为此,我编写了一些iptables规则,将所有HTTP流量重定向到我

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
(这个设置的细节对于我的问题并不重要,只需注意创建了一个“internet”链,它将HTTP重定向到接入点上的端口80)

在AP上的端口80处,cherrypy服务器为静态登录页提供服务,该页面带有一个“注册”按钮,该按钮向用户发出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异常,以从“internet”链中删除该特定MAC,该链将流量重定向到门户

现在,当我测试这个设置时,发生了一些有趣的事情。在iptables中添加异常是可行的,即客户端现在可以访问网页而无需重定向到我。问题是,初始请求没有到达我的服务器,即,
欢迎.html
页面从未打开-相反,在执行iptables和rmtrack调用之后,客户端尝试在重定向到我的门户之前打开他们请求的页面上的“同意”路径

例如,如果他们在地址栏中点击“google.com”,然后被发送到我的门户并同意,他们现在将尝试打开。结果,他们在一段时间后得到一个错误。似乎iptables或rmtrack调用更改了前往原始目的地的请求,而仍在我的服务器上处理,这对我来说没有任何意义。因此,我返回哪个静态页面或在发出这些终端命令后进行哪些重定向并不重要——客户端不使用我函数的返回值


我如何解决这个问题?非常感谢每一条有用的信息。

今天我设法解决了我的问题,所以我将把解决方案放在这里,尽管我有点怀疑是否有很多人遇到了同样的问题

基本上,所需要的只是在捕获门户服务器上的请求处理过程中的某个地方进行绝对路径重定向。例如,在我的例子中,您同意我的T&C的索引页上的表单调用了action
/agree
。这意味着客户端认为他正在访问其原始目标服务器(例如google.com/agree)上的路径。
相反,使用绝对形式
10.0.0.1/agree
,客户端将在iptables调用后遵循正确的重定向。

有人知道如何解决这个问题吗?