LINUX.ORG.RU
решено ФорумAdmin

squid, iptables, destination


0

0

В общем, проблема вот такая. Имеется локальная сеть.В ее центре сервер (192.168.0.1), все запросы ходят через этот сервер. На сервере маскарадинг (правила iptables приведу ниже). Так же на сервере есть squid, висящий на 3128 порту. Вот сетевые интерфейсы:

[code]ppp0 (someaddr) — pppoe в интернет eth0 (anotheraddr) — путь в локалку прова br0 (192.168.0.0/24) — моя домашняя локалка[/code]

В iptables есть правило, заворачивающее все запросы, проходящие через сервер для 80 порта на порт 3128 (прозрачный прокси). Вот оно:

[code]B="iptables" A="ACCEPT"

LAN="br0" LAN_ADDR="192.168.0.1" WAN_ADDR="myserveraddr"

SQUID_EXCLUDE=( "$LAN_ADDR" "$WAN_ADDR" "127.0.0.1" )

for ADDR in ${SQUID_EXCLUDE[@]}; do $B -t nat -A PREROUTING -p tcp -i $LAN --dport http ! -d $ADDR -j REDIRECT --to-ports squid_proxy; done $B -A INPUT -i $LAN -p tcp --dport squid_proxy -j $A[/code]

Проблема в том, что этом же сервере на 80-ом порту крутится apache. Когда заходишь на него, то трафик, несмотря на "! -d $ADDR", все равно заворачивается на 3128 порт. Что я делаю не так, ребята?

Вот все правила iptables: http://dpaste.com/94194/

Лор блин испортил текст :(

cheerfulboy
() автор топика

Надо не так

# Если что-то идет не на первый адрес из спикса — редиректим
# Если что-то идет не на второй адрес из спикса — редиректим
# ...
for ADDR in ${SQUID_EXCLUDE[@]}; do $B -t nat -A PREROUTING -p tcp -i $LAN --dport http ! -d $ADDR -j REDIRECT --to-ports squid_proxy; done
а так
# Если что-то идет на первый адрес из списка — выходим
# Если что-то идет на второй адрес из списка — выходим
# ...
for ADDR in ${SQUID_EXCLUDE[@]}; do $B -t nat -I PREROUTING -p tcp -i $LAN --dport http -d $ADDR -j RETURN; done
# Все, что осталось — редиректим
$B -t nat -A PREROUTING -p tcp -i $LAN --dport http -j REDIRECT --to-ports squid_proxy

Из литературы я бы посоветовал учебник логики ;)

nnz ★★★★
()
Ответ на: комментарий от nnz

спасибо за помощь, все работает! :) но вот только я все равно не воткнул, почему мой вариант не работает :(

cheerfulboy
() автор топика
Ответ на: комментарий от cheerfulboy

>но вот только я все равно не воткнул, почему мой вариант не работает

Допустим, у тебя первым в списке идет айпишник 127.0.0.1, а клиент обращается по внутреннему. В первом же правиле прописано: редиректить все, что идет не на 127.0.0.1. Ну, клиента и редиректит. А при обращении на 127.0.0.1 сработает второе правило, потому что айпишник там другой. Простая логика.

nnz ★★★★
()
Ответ на: комментарий от cheerfulboy

>хорошо. а можно ли как-то все переделать не для ip-адресов, а для ifaces? в prerouting нельзя пихать --out-interface. :(

Когда пакет попадает в цепочку PREROUTING, система еще не знает, предназначен он конкретно этому хосту или пойдет дальше. Собственно, это в ней и можно изменить. Выходной интерфейс определяется в том числе и на основании правил, заданных в этой цепочке. Поэтому информация о выходном интерфейсе на данном этапе отсутствует.

Но более простой вариант сделать можно.
$B -t nat -A PREROUTING -p tcp -i $LAN --dport http -m addrtype ! --dst-type LOCAL -j REDIRECT --to-ports squid_proxy

nnz ★★★★
()
Ответ на: комментарий от nnz

бесконечно благодарю. все прекрасно работает :)

cheerfulboy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.