Получение оригинального назначения ip в cherrypy

Я использую портал авторизации на сервере CherryPy и настроил правила iptables, которые ПЕРЕРАБОТАЮТ весь http-трафик с незарегистрированных MAC-адресов на портал. После того, как пользователь зарегистрировался у меня через заставку портала, я добавляю исключение iptables, чтобы пропустить его трафик.
Теперь я хочу перенаправить пользователя на страницу, на которую он изначально направлялся - до того, как его отправили на портал. Я знаю, что iptables устанавливает поле с исходной информацией назначения для всех пакетов TCP, и я знаю, что есть функция C, которая называется getsockopt, для чтения этого поля. Однако я не знаю, как получить доступ к сокету, связанному с запросом в cherrypy.

Кто-нибудь может мне помочь?:)

1 ответ

Решение

Я не эксперт в области низкоуровневых сетей и не знаю, как обычные открытые реализации авторизации Wi-Fi помечают своих клиентов. Но мне кажется верным то, что в модели OSI нижние уровни ничего не знают о верхних уровнях. Другими словами, IP не имеет представления о терминах HTTP и URL страницы.

Таким образом, имея под рукой ссылку на сокет, которую, я считаю, можно получить с помощью настройки CherryPy, вы получите максимум исходный IP-адрес, а не URL-адрес. Кроме того, смешение сетевых (IP) и прикладных (HTTP) уровней и общее управление одним объектом приложения в нескольких местах, вероятно, приведет к возникновению проблем всех видов. Например, работа с агентами, говорящими по HTTP, например, с прямыми и обратными прокси, которые не сохранят нюансы нижнего уровня.

Обновить

Итак, вы говорите, что у вас также есть URL-адрес запроса, вот как вы можете получить необработанный сокет. Как вы можете видеть, он глубоко скрыт и, по сути, является деталью реализации, на которую конечный пользователь не должен полагаться. Он не является частью договора и может быть изменен в любой следующей версии. Таким образом, у вас есть хороший шанс выстрелить себе в ногу.

#!/usr/bin/env python


import cherrypy


config = {
  'global' : {
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  },
}


class App:

  @cherrypy.expose
  def index(self):
    '''For caveats and details on the slippery slope, take a look at ws4py
    https://github.com/Lawouach/WebSocket-for-Python/blob/master/ws4py/server/cherrypyserver.py
    '''
    print(cherrypy.serving.request.rfile.rfile._sock)

    return 'Make sure you know what you are doing.'


if __name__ == '__main__':
  cherrypy.quickstart(App(), '/', config)
Другие вопросы по тегам