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

Исходное сообщение
"публикация веб-серверов в IPTABLES"

Отправлено dimawar , 27-Июн-11 14:42 
Здравствуйте! Возникла проблема публикации нескольких веб-серверов на одном IP-адресе.
Имеются 3 веб-сервера: bug.local.ru, dev.local.ru, mail.local.ru.
Как их можно опубликовать (высунуть наружу 80й порт) ?

я пробую так:


iptables -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "https://mail.local.ru" --algo kmp --to 65535 -m tcp --dport 443 -j DNAT --to-destination 192.168.0.3:443
iptables -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://bug.local.ru" --algo kmp --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
iptables -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://dev.local.ru" --algo kmp --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.7:80
iptables -A FORWARD -d 192.168.0.3/32 -i eth1 -o eth0 -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.0.3/32 -i eth0 -o eth1 -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A FORWARD -d 192.168.0.2/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.0.2/32 -i eth0 -o eth1 -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A FORWARD -d 192.168.0.7/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.0.7/32 -i eth0 -o eth1 -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A POSTROUTING -d 192.168.0.3/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 192.168.0.254
iptables -A POSTROUTING -d 192.168.0.3/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.254
iptables -A POSTROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.254

не работает


Содержание

Сообщения в этом обсуждении
"публикация веб-серверов в IPTABLES"
Отправлено dogonthesun , 27-Июн-11 14:53 
>[оверквотинг удален]
> iptables -A FORWARD -d 192.168.50.2/32 -i eth1 -o eth0 -p tcp -m
> tcp --dport 80 -j ACCEPT
> iptables -A FORWARD -s 192.168.50.2/32 -i eth0 -o eth1 -p tcp -m
> tcp --sport 80 -j ACCEPT
> iptables -A FORWARD -d 192.168.50.7/32 -i eth1 -o eth0 -p tcp -m
> tcp --dport 80 -j ACCEPT
> iptables -A FORWARD -s 192.168.50.7/32 -i eth0 -o eth1 -p tcp -m
> tcp --sport 80 -j ACCEPT
>

> не работает

SNAT?


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 14:57 

> SNAT?

SNAT был добавлен, не работает. Сообщение исправил.


"публикация веб-серверов в IPTABLES"
Отправлено Дядя_Федор , 27-Июн-11 15:10 
А разместить все на одном IP и разрулить средствами виртуал-хостов Веб-сервера (Апача) не проще? С одним DNAT и отсутствием шаманства со string. Все просто и элегантно.

"публикация веб-серверов в IPTABLES"
Отправлено cryo , 27-Июн-11 15:44 

> Имеются 3 веб-сервера: bug.local.ru, dev.local.ru, mail.local.ru.
> Как их можно опубликовать (высунуть наружу 80й порт) ?

Все веб-сайты на одном физическом сервере?
Тогда смотрите в доке апача VirtualHost.

Если все веб-сервера на разных тазиках, расскажите подробнее, как именно "не работает".


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 16:22 
Как вариант на шлюзе поднять apache(nginx) настроить нужные virtualhost и через них проксирование в нутрь на нужные сервера.

"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 17:14 
MS ISA 2006 умеет так делать, публикацию веб-серверов.
Необходимо именно на шлюзе настроить так, что разные сервера публиковать, т.к. они разные физически и объединить в один их не получится.
Вариант с подыманием nginx и разруливанием на нем этих действий - сильно затратный.
Может можно это сделать штатными средствами?



"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 17:19 
> MS ISA 2006 умеет так делать, публикацию веб-серверов.
> Необходимо именно на шлюзе настроить так, что разные сервера публиковать, т.к. они
> разные физически и объединить в один их не получится.
> Вариант с подыманием nginx и разруливанием на нем этих действий - сильно
> затратный.
> Может можно это сделать штатными средствами?

Хотите совет по iptables распишите схему вашей сети, от того что вы написали в первом посте очень смутн опредставить где у вас какой ip.
Чем затрано nginx?


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 18:28 
> Хотите совет по iptables распишите схему вашей сети, от того что вы
> написали в первом посте очень смутн опредставить где у вас какой
> ip.
> Чем затрано nginx?

nginx - дополнительная нагрузка на сервер.

схема сети простая: имеется шлюз на линуксе, у которого внешний интерфейс 1.1.1.1 , и внутренняя сеть 192.168.0.0/24.
Адрес шлюза, во внутренней сети 192.168.0.254
Имеются веб-серверы во внутренней сети:
- bug.local.ru = 192.168.0.2
- mail.local.ru = 192.168.0.3
- dev.local.ru = 192.168.0.7

До этого шлюзом являлся MS ISA 2006, который публикацию поддерживает с коробки.


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 18:39 
>[оверквотинг удален]
>> Чем затрано nginx?
> nginx - дополнительная нагрузка на сервер.
> схема сети простая: имеется шлюз на линуксе, у которого внешний интерфейс 1.1.1.1
> , и внутренняя сеть 192.168.0.0/24.
> Адрес шлюза, во внутренней сети 192.168.0.254
> Имеются веб-серверы во внутренней сети:
> - bug.local.ru = 192.168.0.2
> - mail.local.ru = 192.168.0.3
> - dev.local.ru = 192.168.0.7
> До этого шлюзом являлся MS ISA 2006, который публикацию поддерживает с коробки.

натить нужно на внешний ip, больше косяков воде не вижу.

iptables -A POSTROUTING -d 192.168.0.3/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 1.1.1.1
iptables -A POSTROUTING -d 192.168.0.3/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.1.1.1
iptables -A POSTROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 1.1.1.1


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 18:41 
>[оверквотинг удален]
>> - mail.local.ru = 192.168.0.3
>> - dev.local.ru = 192.168.0.7
>> До этого шлюзом являлся MS ISA 2006, который публикацию поддерживает с коробки.
> натить нужно на внешний ip, больше косяков воде не вижу.
> iptables -A POSTROUTING -d 192.168.0.3/32 -p tcp -m tcp --dport 443 -j
> SNAT --to-source 1.1.1.1
> iptables -A POSTROUTING -d 192.168.0.3/32 -p tcp -m tcp --dport 80 -j
> SNAT --to-source 1.1.1.1
> iptables -A POSTROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 80 -j
> SNAT --to-source 1.1.1.1

ну еще нужно убрать --sport провекру
iptables -A FORWARD -s 192.168.0.3/32 -i eth0 -o eth1 -p tcp -m tcp --sport 443 -j ACCEPT

update - не обязательно)


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 20:26 
> ну еще нужно убрать --sport провекру
> iptables -A FORWARD -s 192.168.0.3/32 -i eth0 -o eth1 -p tcp -m
> tcp --sport 443 -j ACCEPT
> update - не обязательно)

попробовал, все равно не работает. Может быть нужны еще какие-то правила?


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 20:31 
>> ну еще нужно убрать --sport провекру
>> iptables -A FORWARD -s 192.168.0.3/32 -i eth0 -o eth1 -p tcp -m
>> tcp --sport 443 -j ACCEPT
>> update - не обязательно)
> попробовал, все равно не работает. Может быть нужны еще какие-то правила?

eth1- в интернет смотрит, a eth0 в локалку?
счетчики по этим правилам в iptables вообще растут?
iptables -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "https://mail.local.ru" --algo kmp --to 65535 -m tcp --dport 443 -j DNAT --to-destination 192.168.0.3:443
iptables -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://bug.local.ru" --algo kmp --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
iptables -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://dev.local.ru" --algo kmp --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.7:80


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 20:40 
Да и правила для S(D)NAT у вас без указания цепочки nat (-t nat) - это просто на форуме так набрано или у вас реально такие правила?


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 20:48 
> Да и правила для S(D)NAT у вас без указания цепочки nat (-t
> nat) - это просто на форуме так набрано или у вас
> реально такие правила?

Нет, набрано конечно же с -nat, это вывод iptables-save

Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
Интерфейсы правильно. eth0 - local; eth1 - inet


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 20:54 
>> Да и правила для S(D)NAT у вас без указания цепочки nat (-t
>> nat) - это просто на форуме так набрано или у вас
>> реально такие правила?
> Нет, набрано конечно же с -nat, это вывод iptables-save
> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
> Интерфейсы правильно. eth0 - local; eth1 - inet

iptables -nvL -t nat.


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 21:17 

>> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
> iptables -nvL -t nat.

пишет ошибку iptables v1.4.8: multiple -n flags not allowed

Что требуется сделать, чтобы множественный флаг -n стал доступен?


"публикация веб-серверов в IPTABLES"
Отправлено Дядя_Федор , 27-Июн-11 21:27 
> пишет ошибку iptables v1.4.8: multiple -n flags not allowed
> Что требуется сделать, чтобы множественный флаг -n стал доступен?

Ну а просто iptables -nvL работает?


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 21:36 
>>> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
>> iptables -nvL -t nat.
> пишет ошибку iptables v1.4.8: multiple -n flags not allowed
> Что требуется сделать, чтобы множественный флаг -n стал доступен?

хм- только заметил у вас ошибку. в SNAT в вашем случае- указываеться сорцовый адрес( ключ -s), а не как у вас назначения (ключ -d).
Попробовал на своем железо- правило DNAT не отрабатывает.
По поводу множества ключей- а накой хрен вам их больше одного- я вам четко команду написал- изменили- вы ССЗБ.
включения логирования - посмотрите справку(-j LOG)- не задавайте мен банальных вопросов- помогаю потому что самому тема интересна, но нянкаться желания нет.



"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 21:55 
> хм- только заметил у вас ошибку. в SNAT в вашем случае- указываеться
> сорцовый адрес( ключ -s), а не как у вас назначения (ключ
> -d).
> Попробовал на своем железо- правило DNAT не отрабатывает.
> По поводу множества ключей- а накой хрен вам их больше одного- я
> вам четко команду написал- изменили- вы ССЗБ.
> включения логирования - посмотрите справку(-j LOG)- не задавайте мен банальных вопросов-
> помогаю потому что самому тема интересна, но нянкаться желания нет.

команда iptables -nvL -t nat заработал, неправильно вводил :)
сейчас правила выглядят так в таблице nat:


-A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "https://mail.local.ru" --algo kmp --to 65535 -m tcp --dport 443 -j DNAT --to-destination 192.168.0.3:443
-A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://bug.local.ru" --algo kmp --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
-A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://dev.local.ru" --algo kmp --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.7:80
-A POSTROUTING -s 192.168.0.3/32 -p tcp -j SNAT --to-source 1.1.1.1
-A POSTROUTING -s 192.168.0.2/32 -p tcp -j SNAT --to-source 1.1.1.1
-A POSTROUTING -s 192.168.0.7/32 -p tcp -j SNAT --to-source 1.1.1.1


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 27-Июн-11 21:55 
>[оверквотинг удален]
> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "https://mail.local.ru" --algo kmp
> --to 65535 -m tcp --dport 443 -j DNAT --to-destination 192.168.0.3:443
> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://bug.local.ru" --algo kmp
> --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://dev.local.ru" --algo kmp
> --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.7:80
> -A POSTROUTING -s 192.168.0.3/32 -p tcp -j SNAT --to-source 1.1.1.1
> -A POSTROUTING -s 192.168.0.2/32 -p tcp -j SNAT --to-source 1.1.1.1
> -A POSTROUTING -s 192.168.0.7/32 -p tcp -j SNAT --to-source 1.1.1.1
>

и все равно не работает


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 22:14 
>[оверквотинг удален]
>> --to 65535 -m tcp --dport 443 -j DNAT --to-destination 192.168.0.3:443
>> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://bug.local.ru" --algo kmp
>> --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
>> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://dev.local.ru" --algo kmp
>> --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.7:80
>> -A POSTROUTING -s 192.168.0.3/32 -p tcp -j SNAT --to-source 1.1.1.1
>> -A POSTROUTING -s 192.168.0.2/32 -p tcp -j SNAT --to-source 1.1.1.1
>> -A POSTROUTING -s 192.168.0.7/32 -p tcp -j SNAT --to-source 1.1.1.1
>>
> и все равно не работает

и не будет, то что мы обращаемся к именно bla.bla.ru передаеться только после установления tcp соединения, тобишь минимум идет 4 пакетом, а так как по вышеприведенным правилам мы ни счем соединиться не можем- следовательно, то  что мы хотим обратиться bla.bla.ru собственно и не передаеться.
Как правильно напистаь правило для это - не знаю.


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 22:18 
>[оверквотинг удален]
>> --to 65535 -m tcp --dport 443 -j DNAT --to-destination 192.168.0.3:443
>> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://bug.local.ru" --algo kmp
>> --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
>> -A PREROUTING -d 1.1.1.1/32 -p tcp -m string --string "http://dev.local.ru" --algo kmp
>> --to 65535 -m tcp --dport 80 -j DNAT --to-destination 192.168.0.7:80
>> -A POSTROUTING -s 192.168.0.3/32 -p tcp -j SNAT --to-source 1.1.1.1
>> -A POSTROUTING -s 192.168.0.2/32 -p tcp -j SNAT --to-source 1.1.1.1
>> -A POSTROUTING -s 192.168.0.7/32 -p tcp -j SNAT --to-source 1.1.1.1
>>
> и все равно не работает

Проще говоря в целом логика построения правил у вас "правильная"- но через наличие имени сервера впакете - так не разрулить, да и не будет оно в каждом пакете передаваться.


"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 22:40 
> и все равно не работает

В общем я не вижу способов решения данной проблемы через iptables( ну если всетаки хотите "продолжить"- то нужно еще использовать модуль conntrack- для отслеживания соединений на уровне http-сессий так как данные о сервере не будут передаваться в каждом пакете), но в любом случае- прежде чем мы поймем к какому серверу хочет обратиться клиент- должно подняться tcp соединение, а соединяться то клиенту на нашем сервере не с чем.



"публикация веб-серверов в IPTABLES"
Отправлено Дядя_Федор , 27-Июн-11 23:46 
> и все равно не работает

Попробуйте убрать http. При HTTP-сессии имя сервера передается в хидере Host (типа, Host: www.site.ru). Собственно, на этом и основана логика работы виртуал-хостов Вэб-серверов.



"публикация веб-серверов в IPTABLES"
Отправлено tuxic , 27-Июн-11 21:46 
>>> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
>> iptables -nvL -t nat.
> пишет ошибку iptables v1.4.8: multiple -n flags not allowed
> Что требуется сделать, чтобы множественный флаг -n стал доступен?

ЫЫЫ, чет я совсем рассеяный.
естественно при SNAT - уберите --dport - вы его заранее знать никак не можете.


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 28-Июн-11 12:14 
В общем, как я понял, IPTABLES такое не умеет.
Задачу эту я подвинул на потом. А потом буду смотреть в сторону nginx virtual-host proxy.

"публикация веб-серверов в IPTABLES"
Отправлено anonymous , 13-Июл-11 15:04 
> В общем, как я понял, IPTABLES такое не умеет.
> Задачу эту я подвинул на потом. А потом буду смотреть в сторону
> nginx virtual-host proxy.

iptables, возможно, это умеет. Как Вам верно сказали - не в каждом пакете будет передаваться адрес хоста. НО! Есть возможность пометить конкретное соединение средствами iptables. Курим в сторону CONNMARK target и -m connmark.
Не могу надыбать спецификацию на протокол http, как же там происходит установка соединения. Может, кто подкинет? Задача-то интересная)


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 24-Окт-11 15:31 
>> В общем, как я понял, IPTABLES такое не умеет.
>> Задачу эту я подвинул на потом. А потом буду смотреть в сторону
>> nginx virtual-host proxy.
> iptables, возможно, это умеет. Как Вам верно сказали - не в каждом
> пакете будет передаваться адрес хоста. НО! Есть возможность пометить конкретное соединение
> средствами iptables. Курим в сторону CONNMARK target и -m connmark.
> Не могу надыбать спецификацию на протокол http, как же там происходит установка
> соединения. Может, кто подкинет? Задача-то интересная)

Данную задачу я решил при помощи nginx.
Он умеет делать proxy_pass - т.е. перенаправлять запросы внутрь сети. Вот такой конфиг:

server {
    listen 192.168.1.1:80;
    server_name example.com www.example.com;
    ...
    
    location / {
        proxy_pass http://192.168.1.5:80/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


"публикация веб-серверов в IPTABLES"
Отправлено dimawar , 24-Окт-11 17:38 
>[оверквотинг удален]
>> Не могу надыбать спецификацию на протокол http, как же там происходит установка
>> соединения. Может, кто подкинет? Задача-то интересная)
> Данную задачу я решил при помощи nginx.
> Он умеет делать proxy_pass - т.е. перенаправлять запросы внутрь сети. Вот такой
> конфиг:
>
server { 
>     listen 192.168.1.1:80;
>     server_name example.com www.example.com;
>     ...
>     location / {

proxy_redirect off;
>         proxy_pass http://192.168.1.5:80/;
>  proxy_set_header Host $host;
>  proxy_set_header X-Real-IP $remote_addr;
>  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>     }
> }

proxy_redirect off; - необходим для отключения циклического редиректа, если есть редирект на внутреннем сервере.