The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (Apache, http-серверы)
Изначальное сообщение [ Отслеживать ]

"Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 08-Июн-06, 11:52 
Есть Апач на сервере с двумя сетевыми интерфейсами (один в инет, другой в локалку), на них разные IP адреса.
На одном внешнем несколько алиасов.

На машине имеем некоторое количество виртуальных хостов с разными IP адрессами.
Так вот, не зависимо с какого виртуального хоста скрипт на PHP выполняет запрос fopen(), всегда в логах стороннего сервера светится основной IP.

Так вот вопрос: Как заставить Apache ходить в инет с IP виртуальных хостов?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от Асен Тотин email on 08-Июн-06, 21:19 
Привет,

Боюсь, что fopen() так и работает (если это у вас PHP, зачем сваливать все на Apache?). Адрес источника ставится автоматически сообразно тому, через какой интерфейс уйдет пакет. Если ван нужен иной source address, то учимся работать с raw sockets.

WWell,


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 09-Июн-06, 07:25 
>Боюсь, что fopen() так и работает

А все остальные функции и библиотеки PERL
и Curl от PHP ведут себя так же? Подставляют IP интерфейса?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от Асен Тотин email on 09-Июн-06, 13:09 
Привет,

>А все остальные функции и библиотеки PERL
>и Curl от PHP ведут себя так же? Подставляют IP интерфейса?

Нет, не все. Посмотрите, например, man IO::Socket на предмет метода bind.

WWell,


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 13-Июн-06, 07:31 
>Если ван нужен иной source address, то
>учимся работать с raw sockets.

Если я правильно понял, используя RawSockets, и не отключая функцию fopen() можно правилами IPFW запретить коннект к внешним адресам и разрешить коннектиться только к локальным? Я правильно понял?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

5. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от vvvua (??) on 10-Июл-06, 17:54 
>>Если ван нужен иной source address, то
>>учимся работать с raw sockets.
>
>Если я правильно понял, используя RawSockets, и не отключая функцию fopen() можно
>правилами IPFW запретить коннект к внешним адресам и разрешить коннектиться только
>к локальным? Я правильно понял?

Думаю, что не правильно.
Подставить чужойадрес можно (читай: другой). Вот только соединение не откроется, если адрес источника не доступен по маршрутизации с точки назначения по fopen().

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 11-Июл-06, 08:00 
>Думаю, что не правильно.
>Подставить чужойадрес можно (читай: другой). Вот только соединение не откроется, если адрес
>источника не доступен по маршрутизации с точки назначения по fopen().

А зачем мне чужие ИПы? У нас на сетевой висит 5 ИПов. И различные виртуальные хосты висят на том или иной ИПе. Соответственно если хост на aaa.bbb.ccc.ddd то и ходить ему в инет с этим ИПом, а не под ИПом сервера.

Для этого случая подойдет?


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от vvvua (??) on 11-Июл-06, 15:38 
У меня это сделано с policy routing.
на каждый ip - своя таблица маршрутизации

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 12-Июл-06, 14:29 
>У меня это сделано с policy routing.
>на каждый ip - своя таблица маршрутизации

Хм, что-то я не совсем понял.
Но исходя из того, что написано здесь: http://www.opennet.ru/base/net/bsd_pbr_route.txt.html

Это немного другое. И не для нашего случая :(
У нас один канал во внешку, один сервак, один шлюз провайдеровский.
Один IP на интерфейсе и 5 алиасов к нему с виртуальными хостами на апаче.


Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от vvvua (??) on 12-Июл-06, 17:22 
>Хм, что-то я не совсем понял.
>Но исходя из того, что написано здесь: http://www.opennet.ru/base/net/bsd_pbr_route.txt.html
>
>Это немного другое. И не для нашего случая :(
Что там написано - возможно, что не для вас - надо подробнее смотреть.

Оговорюсь, что у меня Linux. Там маршрутизация более продвинутая, чем в FreeBSD.

>У нас один канал во внешку, один сервак, один шлюз провайдеровский.
>Один IP на интерфейсе и 5 алиасов к нему с виртуальными хостами
>на апаче.

Ну? Всё правильно. Какая разница?
Конечно, пров мог нарушить правила и дать так:
сетка 1.1.1.0/29
пров 1.1.1.1/29
вы1 1.1.1.2/29
вы2 1.1.1.3/29
вы3 1.1.1.4/29

И т.д.
Но Обычно, это делают сетями по 4 адреса. т.е. /30
первая сетка 1.1.1.0/30
пров 1.1.1.1/30
вы 1.1.1.2/30 gateway 1.1.1.1

вторая сетка 1.1.4.0/30
пров 1.1.4.1/30
вы 1.1.1.4/30 gateway 1.1.4.1

и т.д.

в системе прописан только один шлюз - gateway 1.1.1.1

Таким образом, я полиси строю так:
если коннект на 1.1.1.2 - то юзать шлюз 1.1.1.1
если коннект на 1.1.4.2 - то юзать шлюз 1.1.4.1

И, наконец, если всё так плохо - выход: использовать jail. Там вообще каждому свое.


Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 13-Июл-06, 07:51 
>
>Оговорюсь, что у меня Linux. Там маршрутизация более продвинутая, чем в FreeBSD.
>

Это все правильно, все логично.
Но мне не это нужно.

Когда скрипт на PHP с виртуального хоста с IP aaa.bbb.ccc.dd1 открывает соединение с другим сервером по 80 порту ( fopen('http://www.opennet.ru', 'r'); )

То в логах на сервере opennet.ru будет IP не виртуального хоста, а IP сервера aaa.bbb.ccc.ddd.

Когда другой скрипт на PHP с виртуального хоста с IP aaa.bbb.ccc.dd2 открывает соединение с другим сервером по 80 порту ( fopen('http://www.opennet.ru', 'r'); )

То опять же в логах на сервере opennet.ru будет IP не виртуального хоста, а IP сервера aaa.bbb.ccc.ddd.

А нужно чтобы там в логах были IP aaa.bbb.ccc.dd1 и aaa.bbb.ccc.dd2. Как это сделать?

Иными словами скриптам на виртуальных хостах с IP aaa.bbb.ccc.dd1(!) и aaa.bbb.ccc.dd2(!) нужно запретить соединения на внешние адреса по порту 80.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от Xela (ok) on 13-Июл-06, 11:16 
Какую версию PHP используете?

В любом случае, что бы не дать в PHP возможность использовать fopen с обертками для URL надо в конфигурации PHP этого вируального хоста установить опцию PHP allow_url_fopen в FALSE.

В версии PHP 5.0 поддерживаются контексты, и тогда, для того что бы fopen коннектился с определенного(алиасного IP например) надо сделать что-то типа:

// connect to the internet using the '192.168.0.100' IP
$opts = array('socket' =>
           array('bindto' => '192.168.0.100:0'));
// create the context...
$context = stream_context_create($opts);

// ...and use it to fetch the data
echo file_get_contents('http://www.example.com', false, $context);

Более подробно смотрите в документации по PHP

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 13-Июл-06, 11:52 
Идея сработала, ура :))
Это уже ближе и интереснее.

Версии PHP 4.4.2 (Server API Apache) и 5.1.2 (Server API CGI)

Только, вот так сразу использовать и не получится.
Нужно получается, сделать так:

1) На файерволе запретить все исходящие коннекты от IP сервера на внешние хосты по всем портам (это бред)
2) Разрешить fopen()
3) Разрешить на файерволе исходящие коннекты на локальные IP для пользователиских скриптов по порту 80.
4) Перевести пользователей на PHP5 (переписать скрипты).

Что не совсем подходит. Может есть еще варианты?

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от Xela (ok) on 13-Июл-06, 12:09 
>Что не совсем подходит. Может есть еще варианты?

Боюсь что нет. Беглый анализ документации по четвертой версии PHP не выявил таких возможностей. Возможно это можно решить более тонкой настройкой Апача, но я таких методов не знаю.

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter email(ok) on 13-Июл-06, 12:25 
>Боюсь что нет.

Спасибо и на этом

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "Как заставить Apache ходить в инет с IP виртуальных хостов?"  +/
Сообщение от zeiter (ok) on 14-Янв-11, 11:20 

> Боюсь что нет. Беглый анализ документации по четвертой версии PHP не выявил
> таких возможностей. Возможно это можно решить более тонкой настройкой Апача, но
> я таких методов не знаю.

Хм, в ветке 5.2.x и 5.2.x в этом плане так же никаких изменений за все это время так и не произошло?

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру