Ткните носом... Есть линукс ASP 7.3 одним интерфейсом 213.227.206.32(eth0) смотрит в инет, другим 10.5.1.8 (eth1) в локалку.
Внутри локалки есть вебсервер 10.5.1.5. Он через DNAT выкинут наружу с адресом 213.227.206.30. При заходе из инета на адрес вебсервера, все ОК, но я хочу большего, а именно заходить на свой же вебсервер из той самой локальной сети, в которой находится вебсервер. Читаю ман по IPTables, гуглю и яндексю уже третий день, но, видимо, где-то зациклился.Привожу скрипт, которым делаю вышеперчисленные действия и сразу пишу, как я это понимаю, чтобы могли указать, где я неправ в своих размышлениях:
#!/bin/bash
#установка политики FORWARD по-умолчанию в DROP, т.е. все что не
#разрешено явно, то запрещено
/sbin/iptables -P FORWARD /
DROP
#я своей локалке доверяю, поэтому разрешаю прохождение пакетов из локалки
#без ограничений
/sbin/iptables -A FORWARD -i eth1 -o eth0 /
-j ACCEPT
#пропускаю внутрь локалки пакеты установленных
#соединений
/sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state /
ESTABLISHED,RELATED -j/
ACCEPT
#Я разрешаю прохождение всех пакетов, которые приходят на вебсервер с
#внешнего интерфейса файрвола на локальный интерфейс вебсервера.
/sbin/iptables -A FORWARD -d 10.5.1.5 -i eth0 -o eth1 -p tcp /
-m tcp --dport 80 /
-j/
allowed
#выкидываю все открытые порты машины в инет с адресом 213.227.206.30
/sbin/iptables -t nat -A PREROUTING -d 213.227.206.30 /
-i eth0 -p tcp -m tcp -j DNAT --to-destination /
10.5.1.5
#даю доступ в интернет приложениям моей машины с адреса 213.227.206.30
#т.е. переписываю адрес источника на внешний присвоенный адрес.
/sbin/iptables -t nat -A POSTROUTING -s 10.5.1.5 /
-o eth0 -j SNAT --to-source /
213.227.206.30
#теперь согласно написанного в мануале, мне надо сделать нижеприведенное,
#смысл которого я понимаю (надо переписать исходящий адрес с адреса
#клиента на адрес файрвола, чтобы вебсервер ответил файрволу,а не клиенту
#напрямую):
iptables -t nat -A POSTROUTING -p tcp --dst 10.5.1.5 --dport 80 -j SNAT \
--to-source 10.5.1.8Команда выполняется, но
- при попытке доступа из той же локальной сети соединение установить не удается
- все приложения, которые крутятся на вебсервере стали видеть $_SERVER['REMOTE_ADDRESS'] (адрес клиента) как внутренний адерс файрволаЯ подозреваю, что я
а. где-то не разрешил прохождение пакетов с адресом источника из локальной сети на внешний интерфейс, а потом обратно.
б. неправильно написал правила SNAT
>Ткните носом... Есть линукс ASP 7.3 одним интерфейсом 213.227.206.32(eth0) смотрит в инет,
>другим 10.5.1.8 (eth1) в локалку.
>Внутри локалки есть вебсервер 10.5.1.5. Он через DNAT выкинут наружу с адресом
>213.227.206.30. При заходе из инета на адрес вебсервера, все ОК, но
>я хочу большего, а именно заходить на свой же вебсервер из
>той самой локальной сети, в которой находится вебсервер. Читаю ман по
>IPTables, гуглю и яндексю уже третий день, но, видимо, где-то зациклился.
>
>
>Привожу скрипт, которым делаю вышеперчисленные действия и сразу пишу, как я это
>понимаю, чтобы могли указать, где я неправ в своих размышлениях:
>
>#!/bin/bash
>#установка политики FORWARD по-умолчанию в DROP, т.е. все что не
>#разрешено явно, то запрещено
>/sbin/iptables -P FORWARD /
>DROP
>#я своей локалке доверяю, поэтому разрешаю прохождение пакетов из локалки
>#без ограничений
>/sbin/iptables -A FORWARD -i eth1 -o eth0 /
>-j ACCEPT
>#пропускаю внутрь локалки пакеты установленных
>#соединений
>/sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state /
>ESTABLISHED,RELATED -j/
>ACCEPT
>#Я разрешаю прохождение всех пакетов, которые приходят на вебсервер с
>#внешнего интерфейса файрвола на локальный интерфейс вебсервера.
>/sbin/iptables -A FORWARD -d 10.5.1.5 -i eth0 -o eth1 -p tcp /
>
>-m tcp --dport 80 /
>-j/
>allowed
>#выкидываю все открытые порты машины в инет с адресом 213.227.206.30
>/sbin/iptables -t nat -A PREROUTING -d 213.227.206.30 /
>-i eth0 -p tcp -m tcp -j DNAT --to-destination /
>10.5.1.5
>#даю доступ в интернет приложениям моей машины с адреса 213.227.206.30
>#т.е. переписываю адрес источника на внешний присвоенный адрес.
>/sbin/iptables -t nat -A POSTROUTING -s 10.5.1.5 /
>-o eth0 -j SNAT --to-source /
>213.227.206.30
>#теперь согласно написанного в мануале, мне надо сделать нижеприведенное,
>#смысл которого я понимаю (надо переписать исходящий адрес с адреса
>#клиента на адрес файрвола, чтобы вебсервер ответил файрволу,а не клиенту
>#напрямую):
>iptables -t nat -A POSTROUTING -p tcp --dst 10.5.1.5 --dport 80 -j
>SNAT \
>--to-source 10.5.1.8
>
>Команда выполняется, но
>- при попытке доступа из той же локальной сети соединение установить не
>удается
>- все приложения, которые крутятся на вебсервере стали видеть $_SERVER['REMOTE_ADDRESS'] (адрес клиента)
>как внутренний адерс файрвола
>
>Я подозреваю, что я
>а. где-то не разрешил прохождение пакетов с адресом источника из локальной сети
>на внешний интерфейс, а потом обратно.
>б. неправильно написал правила SNATОдного немогу понять - нафига такой гемор творить, если все в одной локалке???
1. разреши к http серверу ходить по IP адресу, набираешь в строке адреса 10.5.1.5 и попадаешь на свой сервак...
2. или сделать чтобы твой DNS отдавал в локалку адрес 10.5.1.5 (или какой он там у тебя на серваке) о твоем серваке.а правило твое работать небудет, т.к. адреса из одной подсети, и при обращении с 10.5.1.х на 10.5.1.5 пакеты через твой шлюз НЕ ПРОХОДЯТ!
>а правило твое работать небудет, т.к. адреса из одной подсети, и при
>обращении с 10.5.1.х на 10.5.1.5 пакеты через твой шлюз НЕ ПРОХОДЯТ!
Можно хотя объяснить почему они не проходят через шлюз? Читаю мануал, там сказано, что проходят:
А теперь посмотрим, что произойдет, если запрос посылается с узла, расположенного в той же локальной сети. Для простоты изложения примем адрес клиента в локальной сети равным $LAN_BOX.Пакет покидает $LAN_BOX.
Поступает на брандмауэр.
Производится подстановка адреса назначения, однако адрес отправителя не подменяется, т.е. исходный адрес остается в пакете без изменения.
Пакет покидает брандмауэр и отправляется на HTTP сервер.
HTTP сервер, готовясь к отправке ответа, обнаруживает, что клиент находится в локальной сети (поскольку пакет запроса содержал оригинальный IP адрес, который теперь превратился в адрес назначения) и поэтому отправляет пакет непосредственно на $LAN_BOX.
Пакет поступает на $LAN_BOX. Клиент "путается", поскольку ответ пришел не с того узла, на который отправлялся запрос. Поэтому клиент "сбрасывает" пакет ответа и продолжает ждать "настоящий" ответ.
Проблема решается довольно просто с помощью SNAT. Ниже приводится правило, которое выполняет эту функцию. Это правило вынуждает HTTP сервер передавать ответы на наш брандмауэр, которые затем будут переданы клиенту.
И дальше написано:
Каждый должен понять, что эти правила предназначены только лишь для корректной обработки адресации пакетов. В дополнение к этим правилам вам может потребоваться написать дополнительные правила для цепочки FORWARD таблицы filter. Не забудьте при этом, что пакеты уже прошли цепочку PREROUTING и поэтому их адреса назначения уже изменены действием DNAT.
По хорошей сложившейся традиции тот, кто задал вопрос и решил сам проблему, выкладывает ее решение на форум, где задал вопрос. Переписывать долго, поэтому даю ссылку:
http://www.k31.kiev.ua/board/viewtopic.php?t=825&postdays=0&...
> По хорошей сложившейся традиции тот, кто задал вопрос и решил сам проблему,
> выкладывает ее решение на форум, где задал вопрос. Переписывать долго, поэтому
> даю ссылку:
> http://www.k31.kiev.ua/board/viewtopic.php?t=825&postdays=0&...Приветствую!
Решение видимо сгинуло куда-то, может быть можете его актуаизировать?
>> По хорошей сложившейся традиции тот, кто задал вопрос и решил сам проблему,
>> выкладывает ее решение на форум, где задал вопрос. Переписывать долго, поэтому
>> даю ссылку:
>> http://www.k31.kiev.ua/board/viewtopic.php?t=825&postdays=0&...
> Приветствую!
> Решение видимо сгинуло куда-то, может быть можете его актуализировать?Видимо так должно быть:
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 10.5.1.0/24 -d 10.5.1.5 --dport 80 -j SNAT --to-source 10.5.1.8
Когда компы в одной подсети, общаются они напрямую, без участия шлюзов...Читал, думал...
Сорри за категоричное сообщение по поводу правила,
я забыл что DNS вернет не IP из локалки, а IP реальный, все действительно побежит через шлюз...