Здравствуйте! Возникла проблема публикации нескольких веб-серверов на одном 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 -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?
> SNAT?SNAT был добавлен, не работает. Сообщение исправил.
А разместить все на одном IP и разрулить средствами виртуал-хостов Веб-сервера (Апача) не проще? С одним DNAT и отсутствием шаманства со string. Все просто и элегантно.
> Имеются 3 веб-сервера: bug.local.ru, dev.local.ru, mail.local.ru.
> Как их можно опубликовать (высунуть наружу 80й порт) ?Все веб-сайты на одном физическом сервере?
Тогда смотрите в доке апача VirtualHost.Если все веб-сервера на разных тазиках, расскажите подробнее, как именно "не работает".
Как вариант на шлюзе поднять apache(nginx) настроить нужные virtualhost и через них проксирование в нутрь на нужные сервера.
MS ISA 2006 умеет так делать, публикацию веб-серверов.
Необходимо именно на шлюзе настроить так, что разные сервера публиковать, т.к. они разные физически и объединить в один их не получится.
Вариант с подыманием nginx и разруливанием на нем этих действий - сильно затратный.
Может можно это сделать штатными средствами?
> MS ISA 2006 умеет так делать, публикацию веб-серверов.
> Необходимо именно на шлюзе настроить так, что разные сервера публиковать, т.к. они
> разные физически и объединить в один их не получится.
> Вариант с подыманием nginx и разруливанием на нем этих действий - сильно
> затратный.
> Может можно это сделать штатными средствами?Хотите совет по iptables распишите схему вашей сети, от того что вы написали в первом посте очень смутн опредставить где у вас какой ip.
Чем затрано nginx?
> Хотите совет по 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, который публикацию поддерживает с коробки.
>[оверквотинг удален]
>> Чем затрано 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
>[оверквотинг удален]
>> - 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 ACCEPTupdate - не обязательно)
> ну еще нужно убрать --sport провекру
> iptables -A FORWARD -s 192.168.0.3/32 -i eth0 -o eth1 -p tcp -m
> tcp --sport 443 -j ACCEPT
> update - не обязательно)попробовал, все равно не работает. Может быть нужны еще какие-то правила?
>> ну еще нужно убрать --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
Да и правила для S(D)NAT у вас без указания цепочки nat (-t nat) - это просто на форуме так набрано или у вас реально такие правила?
> Да и правила для S(D)NAT у вас без указания цепочки nat (-t
> nat) - это просто на форуме так набрано или у вас
> реально такие правила?Нет, набрано конечно же с -nat, это вывод iptables-save
Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
Интерфейсы правильно. eth0 - local; eth1 - inet
>> Да и правила для S(D)NAT у вас без указания цепочки nat (-t
>> nat) - это просто на форуме так набрано или у вас
>> реально такие правила?
> Нет, набрано конечно же с -nat, это вывод iptables-save
> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
> Интерфейсы правильно. eth0 - local; eth1 - inetiptables -nvL -t nat.
>> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
> iptables -nvL -t nat.пишет ошибку iptables v1.4.8: multiple -n flags not allowed
Что требуется сделать, чтобы множественный флаг -n стал доступен?
> пишет ошибку iptables v1.4.8: multiple -n flags not allowed
> Что требуется сделать, чтобы множественный флаг -n стал доступен?Ну а просто iptables -nvL работает?
>>> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
>> iptables -nvL -t nat.
> пишет ошибку iptables v1.4.8: multiple -n flags not allowed
> Что требуется сделать, чтобы множественный флаг -n стал доступен?хм- только заметил у вас ошибку. в SNAT в вашем случае- указываеться сорцовый адрес( ключ -s), а не как у вас назначения (ключ -d).
Попробовал на своем железо- правило DNAT не отрабатывает.
По поводу множества ключей- а накой хрен вам их больше одного- я вам четко команду написал- изменили- вы ССЗБ.
включения логирования - посмотрите справку(-j LOG)- не задавайте мен банальных вопросов- помогаю потому что самому тема интересна, но нянкаться желания нет.
> хм- только заметил у вас ошибку. в 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
>[оверквотинг удален]
> -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
>и все равно не работает
>[оверквотинг удален]
>> --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 собственно и не передаеться.
Как правильно напистаь правило для это - не знаю.
>[оверквотинг удален]
>> --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( ну если всетаки хотите "продолжить"- то нужно еще использовать модуль conntrack- для отслеживания соединений на уровне http-сессий так как данные о сервере не будут передаваться в каждом пакете), но в любом случае- прежде чем мы поймем к какому серверу хочет обратиться клиент- должно подняться tcp соединение, а соединяться то клиенту на нашем сервере не с чем.
> и все равно не работаетПопробуйте убрать http. При HTTP-сессии имя сервера передается в хидере Host (типа, Host: www.site.ru). Собственно, на этом и основана логика работы виртуал-хостов Вэб-серверов.
>>> Как счетчики правил посмотреть? и включить логгирование. ОС Debian 6.
>> iptables -nvL -t nat.
> пишет ошибку iptables v1.4.8: multiple -n flags not allowed
> Что требуется сделать, чтобы множественный флаг -n стал доступен?ЫЫЫ, чет я совсем рассеяный.
естественно при SNAT - уберите --dport - вы его заранее знать никак не можете.
В общем, как я понял, IPTABLES такое не умеет.
Задачу эту я подвинул на потом. А потом буду смотреть в сторону nginx virtual-host proxy.
> В общем, как я понял, IPTABLES такое не умеет.
> Задачу эту я подвинул на потом. А потом буду смотреть в сторону
> nginx virtual-host proxy.iptables, возможно, это умеет. Как Вам верно сказали - не в каждом пакете будет передаваться адрес хоста. НО! Есть возможность пометить конкретное соединение средствами iptables. Курим в сторону CONNMARK target и -m connmark.
Не могу надыбать спецификацию на протокол http, как же там происходит установка соединения. Может, кто подкинет? Задача-то интересная)
>> В общем, как я понял, 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;
}
}
>[оверквотинг удален]
>> Не могу надыбать спецификацию на протокол 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; - необходим для отключения циклического редиректа, если есть редирект на внутреннем сервере.