Здравствуйте всем!Помогите пожалуйтса разобраться с iptables, тема конечно не новая, но всё чего нашёл на опеннет и в Инете у меня не работает.
топология такая есть сервер (GW_IP) (но он не gateway по умолчанию) с одним eth0 и public_IP на нём, и есть внутренний web-сервер(WEB_IP) c private_IP, к которому необходимо обращаться с наружи через GW_IP. Соответственно друг друга они видят.
необходимо что бы при обращении с наружи к GW_IP:1234 запросы уходили на WEB:80 и соответственно возвращались тем же путём. Что сделал - на GW_IP прописалiptables -t nat -A PREROUTING -i eth0 -p tcp --dst GW_IP --dport 1234 -j DNAT --to-destination WEB_IP:80
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dst WEB_IP --dport 80 -j SNAT --to-source GW_IP:1234
при попытке обратиться с наружи на GW_IP:1234 браузер пытается перейти на WEB_IP:80 ну и соответствеено ни разу туда не попадает, собссно и не должен. При просмотре tcpdump`ом все запросы и ответы идут правильно те сначала отрабатывает PREROUTING подмненяя destintion на WEB_IP затем POSTROUTING подменяет src на GW_IP, а сам GW отдаёт уже клиентскому браузеру наверное пакеты с src=WEB_IP почему не происходит трансляции? какое ещё правило нужно или мож эти не правильные?
Правильно ли я понимаю, что у вас всего один интерфейс на машине и при этом GW_IP и WEB_IP в одной подсети? Или на eth0 висит алиас для подсети в которой WEB_IP?
На обоих серверах по одному интерфейсу и у GW IP реальный а у WEB private, но на маршрутизаторе, через который они видят друг друга прописан частный маршрут что бы эти адреса друг друга видели
Ну то есть адреса на серверах из разных подсетей
Видно не судьба ...
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dst WEB_IP --dport 80 -j SNAT --to-source GW_IP(без порта)показали бы лучше ifconfig, route -n и iptables-save с машин, скрыв часть белых адресов, но так чтобы разные адреса отличались
без порта эффект то же что и с портомне совсем понял зачем нужен ifconfig но вот привожу для GW server
ifconfig
eth0 Link encap:Ethernet HWaddr GW_MAC
inet addr:GW_IP Bcast:GW_BROADCAST Mask:255.255.255.240
inet6 addr: GW_MAC Scope:Global
inet6 addr: GW_MAC Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:839935200 errors:0 dropped:0 overruns:0 frame:0
TX packets:822960608 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:493050075 (470.2 MiB) TX bytes:559739347 (533.8 MiB)
Interrupt:10 Memory:f8000000-f8012100lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:20033470 errors:0 dropped:0 overruns:0 frame:0
TX packets:20033470 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1583804771 (1.4 GiB) TX bytes:1583804771 (1.4 GiB)
тоже самое для будет для WEB server с единственной разницей что там Ip-шники из внутренней сетиroute -n
тоже не очень информативен так как у каждой из двух машин (GW и WEB) свои (разные) шлюзы, а с маршрутизатора к сожалению не могу route показать - нет доступа туда.Но там, повторюсь, частный маршрут прописан - типа если GW захочет сходить к WEBу то ходить ему нуно через такой то адрес-шлюз ну и может быть тоже самое для WEB прописано, хотя наверное хватит и того что для GW.
а вот что говорит iptables -t nat --list -vn (только nat тк других правил нет)Chain PREROUTING (policy ACCEPT 210K packets, 22M bytes)
pkts bytes target prot opt in out source destination
8 384 DNAT tcp -- eth0 * 0.0.0.0/0 GW_IP tcp dpt:GW_PORT to:WEB_IP:80Chain POSTROUTING (policy ACCEPT 1037K packets, 89M bytes)
pkts bytes target prot opt in out source destination
1 48 SNAT tcp -- * eth0 0.0.0.0/0 WEB_IP tcp dpt:80 to:GW_IPChain OUTPUT (policy ACCEPT 1039K packets, 89M bytes)
pkts bytes target prot opt in out source destinationна WEB сервере iptables соответственно не задействован
да, вам явно нужен телепат>route -n
>
>тоже не очень информативен так как у каждой из двух машин (GW и WEB) свои (разные) шлюзы, >а с маршрутизатора к сожалениюошибаетесь, эта информация не лишняя, ну бог сней, если это засекречено
ответте
то,что вы называете маршрутизатором, является для вас шлюзом?
то,что вы называете маршрутизатором, является для WEB шлюзом?GW и WEB находятся на одной физической линии или подключены к разным интерфейсам на маршрутизаторе
на GW можно получить информацию с WEB, т.е. в браузере что нибудь плезное отображается?
мир о WEB ни чего не знает?
чуть незабыл, на GW forward разрешён?
"то,что вы называете маршрутизатором, является для вас шлюзом?" - является шлюзом для GW (ну вообще оно для всех шлюзом является)
"то,что вы называете маршрутизатором, является для WEB шлюзом?" - является шлюзом для WEB"GW и WEB находятся на одной физической линии или подключены к разным интерфейсам на маршрутизаторе?" к разным интерфейсам маршрутизатора
"на GW можно получить информацию с WEB, т.е. в браузере что нибудь плезное отображается?" - да можно, отображается всё что там есть
"мир о WEB ни чего не знает?" - нет конечно, мир ничего не знает о WEB и WEBу (как в прочем и все кто в его сети) запрещено общаться с внешним миром, (запрещено маршрутизатором)
на GW forward разрешён?
"на GW forward разрешён?" - разрешён только не уверен, что это играет какую то роль, на сколько я понимаю (хотя могу ошибаться) форвард необходим когда задействованы два интерфейса на GW, что бы пакеты проходили с интерфейса на интерфейс и обратно, у меня то всего один if. Но повторюсь в любом случае cft ip_forward выдаёт 1
>"на GW forward разрешён?" - разрешён только не уверен, что это играет
>какую то роль, на сколько я понимаю (хотя могу ошибаться) форвард
>необходим когда задействованы два интерфейса на GW, что бы пакеты проходили
>с интерфейса на интерфейс и обратно, у меня то всего один
>if. Но повторюсь в любом случае cft ip_forward выдаёт 1
>правила прохождения пакетов ни кто не отменял и количество интерфейсов роли не играет
по идее все должно работать и судя по счетчикам пакеты бегают, не понятно следующее
>при попытке обратиться с наружи на GW_IP:1234 браузер пытается перейти на WEB_IP:80дело в том, что браузер не может знать о существовании WEB_IP:80 и не должен ни куда переходить, он должен получать ответы от GW
не знаю, что делается в FORWARD таблицы filter,если там всё в ACCEPT ?то должно работать, ну попробуй ещё упростить правило
>iptables -t nat -A POSTROUTING -o eth0 -p tcp --dst WEB_IP --dport 80 -j SNAT --to-source GW_IPдо банального маскарада
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
маскарадинг тож не помог.
Н асколько я вижу tcpdump`ом пакеты между серверами ходят верно те извне приходит запрос на GW_IP:GW_PORT который форвадиться на WEB_IP:80 с подменой DST_IP и потом WEB_IP:80 получив запрос отвечает на GW_IP:PORT, а вот тут видимо происходит что то не правильное потому что получается, что GW_IP:PORT получив ответ от WEB_IP:80 клиенту отдаёт пакет не подменяя SRC, ну то есть когда идёт ответ клиентскому браузеру то в этих пакетах SRC = WEB_IP:80 , а должен подменяться на GW_IP:PORT (по крайней мере в Опере видно, а вот эексплорер даж не пытается ничего сделать просто отсылает на Google поискать что такое GW_IP) жесть какая то
>маскарадинг тож не помог.
>Н асколько я вижу tcpdump`ом пакеты между серверами ходят верно те извне
>приходит запрос на GW_IP:GW_PORT который форвадиться на WEB_IP:80 с подменой DST_IP
>и потом WEB_IP:80 получив запрос отвечает на GW_IP:PORT, а вот
>тут видимо происходит что то не правильное потому что получается, что
>GW_IP:PORT получив ответ от WEB_IP:80 клиенту отдаёт пакет не подменяя SRC,
>ну то есть когда идёт ответ клиентскому браузеру то в этих
>пакетах SRC = WEB_IP:80 , а должен подменяться на GW_IP:PORT (по
>крайней мере в Опере видно,какаято хрень получается, при маскараде, в том виде как я написал, всё что уходит с eth0 должно подменяться SRC на GW_IP
что-то ты не так делаешь, не всё здесь говоришь
> а вот эексплорер даж не пытается
>ничего сделать просто отсылает на Google поискать что такое GW_IP)
>жесть какая тоне понял, т.е. клиент не видит GW, а простой пинг GW_IP на удаленном клиенте что говорит?
действительно какая-нибудь молочь вышла из поля зрения,
послушал tcpdump`ом PORT на GW_IP - все пакеты проходят правильно, те запрос идёт так CLIENT_IP -> GW_IP:PORT -> WEB_IP:80 , ответ такой
WEB_IP:80 -> GW_IP:PORT -> CLIENTиз Инета пинги от/до GW_IP ходят без вопросов
>действительно какая-нибудь молочь вышла из поля зрения,
>послушал tcpdump`ом PORT на GW_IP - все пакеты проходят правильно, те запрос идёт так CLIENT_IP -> GW_IP:PORT -> WEB_IP:80 , ответ такой
>WEB_IP:80 -> GW_IP:PORT -> CLIENT
>
>из Инета пинги от/до GW_IP ходят без вопросовпокажи tcpdump -i eth0
не совсем то, что просили, но это не хуже, и спасибо Вам за то, что тратите своё время и опыт на меня
tcpdump tcp -ni eth0 port GW_PORT00:25:39.108751 IP client_IP.2219 > GW_IP.PORT: S 3885310013:3885310013(0) win 16384 <mss 1352,nop,nop,sackOK>
00:25:39.108794 IP GW_IP.PORT > WEB_IP.80: S 3885310013:3885310013(0) win 16384 <mss 1352,nop,nop,sackOK>
00:25:39.110021 IP WEB_IP.80 > GW_IP.PORT: S 4252819869:4252819869(0) ack 3885310014 win 5840 <mss 1460,nop,nop,sackOK>
00:25:39.110030 IP GW_IP.PORT > client_IP.2219: S 4252819869:4252819869(0) ack 3885310014 win 5840 <mss 1460,nop,nop,sackOK>
00:25:39.116144 IP client_IP.2219 > GW_IP.PORT: . ack 1 win 17576
00:25:39.116155 IP GW_IP.PORT > WEB_IP.80: . ack 1 win 17576
00:25:39.182141 IP client_IP.2219 > GW_IP.PORT: P 1:406(405) ack 1 win 17576
00:25:39.182164 IP GW_IP.PORT > WEB_IP.80: P 1:406(405) ack 1 win 17576
00:25:39.182835 IP WEB_IP.80 > GW_IP.PORT: . ack 406 win 6432
00:25:39.182841 IP GW_IP.PORT > client_IP.2219: . ack 406 win 6432
00:25:39.183981 IP WEB_IP.80 > GW_IP.PORT: P 1:240(239) ack 406 win 6432
00:25:39.183987 IP GW_IP.PORT > client_IP.2219: P 1:240(239) ack 406 win 6432
00:25:39.306313 IP client_IP.2219 > GW_IP.PORT: . ack 240 win 17337
00:25:39.306339 IP GW_IP.PORT > WEB_IP.80: . ack 240 win 17337
>не совсем то, что просили, но это не хуже, и спасибо Вам
>за то, что тратите своё время и опыт на меня
>некогда анализировать, ухожу на работу,но
>tcpdump tcp -ni eth0 port GW_PORT
>
>00:25:39.108751 IP client_IP.2219 > GW_IP.PORT: S 3885310013:3885310013(0) win 16384 <mss 1352,nop,nop,sackOK>
>00:25:39.108794 IP GW_IP.PORT > WEB_IP.80: S 3885310013:3885310013(0) win 16384 <mss 1352,nop,nop,sackOK>
>00:25:39.110021 IP WEB_IP.80 > GW_IP.PORT: S 4252819869:4252819869(0) ack 3885310014 win 5840 <mss 1460,nop,nop,sackOK>здесь что-то не так
>[оверквотинг удален]
>00:25:39.116144 IP client_IP.2219 > GW_IP.PORT: . ack 1 win 17576
>00:25:39.116155 IP GW_IP.PORT > WEB_IP.80: . ack 1 win 17576
>00:25:39.182141 IP client_IP.2219 > GW_IP.PORT: P 1:406(405) ack 1 win 17576
>00:25:39.182164 IP GW_IP.PORT > WEB_IP.80: P 1:406(405) ack 1 win 17576
>00:25:39.182835 IP WEB_IP.80 > GW_IP.PORT: . ack 406 win 6432
>00:25:39.182841 IP GW_IP.PORT > client_IP.2219: . ack 406 win 6432
>00:25:39.183981 IP WEB_IP.80 > GW_IP.PORT: P 1:240(239) ack 406 win 6432
>00:25:39.183987 IP GW_IP.PORT > client_IP.2219: P 1:240(239) ack 406 win 6432
>00:25:39.306313 IP client_IP.2219 > GW_IP.PORT: . ack 240 win 17337
>00:25:39.306339 IP GW_IP.PORT > WEB_IP.80: . ack 240 win 17337посмотри внимательно правильноли делал замену ИП адресовна "WEB_IP.80 > GW_IP.PORT"
вечером приду отпишу как должно выглядеть
в том и дело, что по tcpdump`у всё правильно, нигде нет строки в которой клиент обращается напрямую к WEB или наоборот весь обмен через GW, кстати говоря PREROUTING вводил первым но с ключём -А (добавление в конец цепи, хоть там других и нет правил) а вот POSTROUTING с ключём -I те добавление в начало цепи, по другому пакеты до WEB не доходят и кстати в PREROUTING`е в правиле порт указываю иначе ответ идёт не на нужный порт GW а на всякие разные
iptables -t nat -D POSTROUTING -p tcp --src WEB_IP --sport 80 -j SNAT --to-source GW_IP:PORT
извиняюсь ключик в POSTROUTE конечно -I а не -D :)
>iptables -t nat -D POSTROUTING -p tcp --src WEB_IP --sport 80 -j
>SNAT --to-source GW_IP:PORTчто-то этого правила я не понял
у меня когда что-то не получается, начинаю идти от простого ...
попробуй сначала без трансляции порта, тебе нужны всего два правила
1. запросы приходящие к тебе на 80-тый порт перенаправить на WEB_IP
если у тебя на GW крутится веб можешь остановить на время теста, и такiptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination WEB_IP
все запросы на 80 порт перенаправляем на WEB_IP, для того, чтоб ответы вернулись к нам с WEB_IP , перенаправленный запрос посылаем от имени GW
iptables -t nat -I POSTROUTING -o eth0 -d WEB_IP -j MASQUERADE
все запросы на WEB_IP маскарадим и ни какой трансляции портов в этом правле т.к. мы не можем знать с какого порта придёт запрос
если в таком виде заработает в PREROUTING добавь трансляцию порта,
в POSTROUTING трансляции не должно быть, только подмена исходящего адреса
блин вот я тёмный, разобрался
как оказалось на WEB_IP страничка, к которой было обращение, была не в корне htdocs, а в отдельном каталоге, а в корне был index в котором была одна строчка Location http://WEB_IP/в_папку/нужной_странички (те редирект ссылка с абсолютным путём) - короче поправил редирект на относительный и всё заработало.
Спасибо Вам огромное - мир не без добрых людей!