URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 4156
[ Назад ]

Исходное сообщение
"Как заставить Apache ходить в инет с IP виртуальных хостов?"

Отправлено zeiter , 08-Июн-06 11:52 
Есть Апач на сервере с двумя сетевыми интерфейсами (один в инет, другой в локалку), на них разные IP адреса.
На одном внешнем несколько алиасов.

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

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


Содержание

Сообщения в этом обсуждении
"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено Асен Тотин , 08-Июн-06 21:19 
Привет,

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

WWell,



"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 09-Июн-06 07:25 
>Боюсь, что fopen() так и работает

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


"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено Асен Тотин , 09-Июн-06 13:09 
Привет,

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

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

WWell,



"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 13-Июн-06 07:31 
>Если ван нужен иной source address, то
>учимся работать с raw sockets.

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


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

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


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

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

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



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


"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 12-Июл-06 14:29 
>У меня это сделано с policy routing.
>на каждый ip - своя таблица маршрутизации

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

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



"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено vvvua , 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. Там вообще каждому свое.



"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 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.


"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено Xela , 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


"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 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 (переписать скрипты).

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


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

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


"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 13-Июл-06 12:25 
>Боюсь что нет.

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


"Как заставить Apache ходить в инет с IP виртуальных хостов?"
Отправлено zeiter , 14-Янв-11 11:20 

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

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