Получение исходного IP-адреса назначения в cherrypy

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

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


person zinfandel    schedule 11.04.2015    source источник


Ответы (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)
person saaj    schedule 13.04.2015
comment
Спасибо за Ваш ответ. Я считаю, что то, что я хочу сделать, не противоречит принципам модели OSI. После перенаправления iptables, cherrypy получает путь к конкретной странице, которую запросил пользователь. Единственное, чего не хватает - из-за перенаправления - это IP-адрес хоста. Если я смогу получить IP-адрес из сокета, я смогу восстановить весь путь запроса. Если я правильно думаю, это будут только более высокие слои, читающие информацию от более низких. Вопрос для меня - как вы выразились - как получить ссылку на сокет. - person zinfandel; 13.04.2015
comment
Привет Саадж, спасибо за обновление. Через cherrypy.serving.request.rfile.rfile._sock и getsockopt (как описано здесь) я смог получить исходный IP. Тем не менее, я серьезно отношусь к вашим предупреждениям, и я каким-то образом вижу, что это не чистое решение, но современные порталы авторизации, которые я видел, определенно делают такое перенаправление. Я подумаю о лучшем решении, может быть, со стороны iptables, и обновлю свой пост, если что-нибудь придумаю... - person zinfandel; 13.04.2015