squid transparent (не определяются domain names)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
darkloki
Сообщения: 20
ОС: Gentoo Linux

squid transparent

Сообщение darkloki »

Доброго времени суток!

Ситуация следующая:
Есть сервер смотрящий в интернет. Хочу сделать его шлюзом в интернет для локалки.

Поставил squid. squid.conf выглядит вот так:

Код: Выделить всё

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl purge method PURGE
acl CONNECT method CONNECT
acl pas src 170.254.200.49

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny to_localhost
http_access allow localhost
http_access allow pas
http_access deny all

htcp_access allow pas
htcp_access deny all

icp_access allow localhost
icp_access allow pas
icp_access deny all

miss_access allow localhost
miss_access allow pas
miss_access deny all

http_port 170.254.200.1:3128 transparent
icp_port 0

cache_mem 1024 MB
maximum_object_size_in_memory 1024 KB
cache_dir ufs /var/cache/squid 4000 16 256
maximum_object_size 4096 KB

access_log /var/log/squid/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern . 0 20% 4320
visible_hostname localhost


iptables отключил на время тестов.

Далее на строне клиента:
Добавляю в свойства сетевого подключения в качестве шлюза 170.254.200.1 и пару dns-серверов выданные провайдером.

Если указать в браузер прокси явно 170.254.200.1:3128, то сайты открываются прекрассно без лишних заморочек.

Если отключить прокси в браузере, то сайты открываются только по IP-ардесам. Если открывать их по доменным именам, то идет поиск имени узла и в итоге не может ресолвить.

Пинги с клиентских комьютеров (напр. ping google.com) тоже не идут, даже если так: ping 64.233.167.99. В первом случае долго думает и не может найти имя хоста, а во втором пакеты не доходят.

В итоге что делать и как быть, чтобы оно заработало? Честно гуглил сегодня полвечера и ничего похожего на мою ситуацию не нашел. :(

Заранее огромное спасибо!

P.S. То что 170.254.200.1 не серый, так в этом виноваты тот кто до меня сеть настраивал :)
Спасибо сказали:
VelloRibbo
Сообщения: 220
ОС: Фетровая

Re: squid transparent

Сообщение VelloRibbo »

Если у пользователей прописаны DNS прова то надо перекидывать их DNS запросы через маршрутизатор, для этого используй NAT в iptables. Пинги не идут по этой же причине. Читай про маршрутизацию и NAT.
Спасибо сказали:
Аватара пользователя
darkloki
Сообщения: 20
ОС: Gentoo Linux

Re: squid transparent

Сообщение darkloki »

Добавил следующее правило для iptables:

Код: Выделить всё

iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source $INET_IP

И ничего не изменилось :(
Спасибо сказали:
snoz
Сообщения: 40
ОС: slackware

Re: squid transparent

Сообщение snoz »

darkloki писал(а):
29.02.2008 17:17
Добавил следующее правило для iptables:

Код: Выделить всё

iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source $INET_IP

И ничего не изменилось :(

а что должно было изменится ?
ip_forward включили?
80 порт заверните на сквид 3128 на роутере.
правила покажите какие в iptables.
slackware user
mail: snozstas@gmail.com
icq: 299434468
icq2: 469265570
icq3: 407493069
Спасибо сказали:
Аватара пользователя
darkloki
Сообщения: 20
ОС: Gentoo Linux

Re: squid transparent

Сообщение darkloki »

ip_forward включен:

Код: Выделить всё

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

А зачем 80й порт перенаправлять на 3128 сквида, если он и так прекрассно видит когда к нему коннектятся. На сайты заходит по IP. В любом случае попробовал и это следующим правилом:

Код: Выделить всё

iptables -t nat -A PREROUTING -s $LAN -d ! $LAN -p tcp -d 80 -j DNAT --to 170.254.200.1:3128

Видимых изменений не заметил.

вот этим скриптом создаю правила для iptables:

Код: Выделить всё

# cat ./ipt.make.rules
#! /bin/bash

IPT="/sbin/iptables"

EXT_IF="ext0"
LO_IF="lo"
LAN="170.254.200.0/24"
LOOPBACK="127.0.0.1/8"
PREF_IP="170.254.200.49"
INET_IP="IP выданный интернет провайдером"
POLICY="DROP"

startfw() {
    /bin/echo 1 > /proc/sys/net/ipv4/ip_forward

    # flash all existens rules
    $IPT -F
    $IPT -X

    # Setting default policy
    $IPT -P INPUT $POLICY
    $IPT -P FORWARD $POLICY
    $IPT -P OUTPUT ACCEPT

    # Разрешаем входящие на петлю
      $IPT -A INPUT -i $LO_IF -d $LOOPBACK -j ACCEPT

    #########################################################################
    # Общие Правила - COMMON RULES
    # Здесь мы создаем различные цепочки, которые висят в памяти ядра, далее в таблицах при определенных
    # условиях мы будем направлять пакеты в эти цепочки.
    #########################################################################

    # Разрешаем прохождение statefull-пакетов. Эта цепочка обязательная она разрешает прохождение пакетов в
    # уже установленных соединениях(ESTABLISHED), и на установление новых соединений от уже установленных
    # (RELATED)
    $IPT -N allowed
      $IPT -F allowed
    # "allowed" это просто имя, можно использовать что нибудь и другое:)
      #Разрешаем прохождение statefull трафика. Далее идет собственно сам список правил
      $IPT -A allowed -m state --state ESTABLISHED,RELATED -j ACCEPT
      # Журналируем все обращение к этому серверу от WAN-сетей :) Мы не ждем гостей !
      $IPT -A allowed -i $EXT_IF -m limit --limit 1/second -j ULOG --ulog-prefix "Bad packet from $EXT_IF"
      $IPT -A allowed -j $POLICY

    # Цепочка общего разрешения использовать аккуратно!
    # Эту цепочку я использую когда необходимо разрешить прохождение пакетов, с определенных портов или адресов
       $IPT -N com-allow
       $IPT -F com-allow
       $IPT -A com-allow -p tcp -j ACCEPT
       $IPT -A com-allow -p udp -j ACCEPT

    #----------------------------------------------------------------------------------------------------------
    # Правила для входящего трафика
    #----------------------------------------------------------------------------------------------------------
    # 1. Создаем цепочку для входящих ICMP.
    # 2. Создаем цепочку для входящего SSH трафика.

    # 1. Разрешаем ICMP
    $IPT -N icmp_in
      $IPT -F icmp_in
    # здесь можно увидеть применения модуля "state" т.е. состояние. пропускаются пакеты со статусом NEW,
    # остальные нам не нужны
      $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT
    $IPT -A icmp_in --fragment -p icmp -j DROP
    $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type echo-reply -j ACCEPT
      $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
      $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
    $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type source-quench -j ACCEPT
    # Журналируем ICMP-пакеты, нам не нужны эти пакеты.
      $IPT -A icmp_in -p icmp -j ULOG --ulog-prefix "Bad ICMP"

    # 2. Входящий SSH трафик
      $IPT -N ssh-in
      $IPT -F ssh-in
      $IPT -A ssh-in -p tcp --dport 22 -j ACCEPT
    # Защита о флуда по SSH
      $IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport ssh -j ACCEPT
      $IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport ssh -j ACCEPT
      $IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport ssh -j ACCEPT
      $IPT -A ssh-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

      $IPT -t nat -A PREROUTING -s $LAN -d ! $LAN -p tcp -d 80 -j DNAT --to 170.254.200.1:3128
    $IPT -t nat -A POSTROUTING -s $LAN -d ! $LAN -j SNAT --to-source $INET_IP
    $IPT -A FORWARD -s $PREF_IP -d ! $LAN -j ACCEPT

    #----------------------------------------------------------------------------------------------------------
    # Цепочка INPUT
    # Здесь создаем правила для входящего трафика, конкретно для SSH, DNS, ICMP и служебных обращений на петле
    # также включена проверка на плохие пакеты и в конце правила для остального трафика (см. цепочку allowed).
    #----------------------------------------------------------------------------------------------------------

    # Разрешаем входящие по HTTP
      $IPT -A INPUT -p tcp --dport 80 -j com-allow
    # Разрешаем входящие по smb/netbios из определенной подсети
      $IPT -A INPUT -p tcp --dport 139 -s $LAN -j com-allow
      $IPT -A INPUT -p tcp --dport 445 -s $LAN -j com-allow
      $IPT -A INPUT -p udp --dport 137 -s $LAN -j com-allow
      $IPT -A INPUT -p udp --dport 138 -s $LAN -j com-allow
    # Разрешаем входящие к хабу (DC++) из определенной подсети
      $IPT -A INPUT -p tcp --dport 411 -s $LAN -j com-allow
    # Разрешаем входящие для Team Speak из определенной подсети
      $IPT -A INPUT -p tcp --dport 51234 -s $LAN -j com-allow
      $IPT -A INPUT -p udp --dport 8767 -s $LAN -j com-allow
    # Разрешаем входящие по SSH
      $IPT -A INPUT -p tcp --dport 22 -s $PREF_IP -j ssh-in
    # Разрешаем входящие по xmpp
      $IPT -A INPUT -p tcp --dport 5222:5223 -s $LAN -j com-allow
      $IPT -A INPUT -p tcp --dport 5280 -s $PREF_IP -j com-allow
    # Разрешаем входящие соединения к прокси-серверу SQUID
      $IPT -A INPUT -p tcp --dport 3128 -s $LAN -j com-allow
     # Разрешаем входящие по DNS
      $IPT -A INPUT -s $LAN -p udp --dport domain -j com-allow
    # Разрешаем входящие к microdc2 из определенной подсети
      $IPT -A INPUT -p tcp --dport 10001 -s $LAN -j com-allow
    # Разрешаем входящие по icmp
      $IPT -A INPUT -p icmp -j icmp_in
    # Ну, и разрешаем statefull-пекеты.
      $IPT -A INPUT -j allowed

    # Все правила для пакетов заканчиваются, если пакет не подошел ни к одному условию, его ждет судьба по
    # умолчанию, а нашем случае DROP.
    ###########################################################################
##############################################
}

startfw

/etc/init.d/iptables save
/etc/init.d/iptables stop
/etc/init.d/iptables start

Что-то я совсем запутался если честно уже... Думаю уже легче поднять локальный bind. Но хочется домучить текущий вариант :)
Спасибо сказали:
Аватара пользователя
DaemonTux
Сообщения: 1480
Статус: Юный падаван
ОС: Gentoo

Re: squid transparent

Сообщение DaemonTux »

А 53 порт проброшен?
Vladivostok Linux User Group
Спасибо сказали:
Аватара пользователя
darkloki
Сообщения: 20
ОС: Gentoo Linux

Re: squid transparent

Сообщение darkloki »

DaemonTux писал(а):
02.03.2008 06:46
А 53 порт проброшен?

Код: Выделить всё

$IPT -t nat -A POSTROUTING -s $LAN -d ! $LAN -j SNAT --to-source $INET_IP
$IPT -A FORWARD -s $LAN -d ! $LAN -j ACCEPT

Если считать эти правила рабочими, то видимо все пробрасывается :rolleyes:
Спасибо сказали:
Аватара пользователя
darkloki
Сообщения: 20
ОС: Gentoo Linux

Re: squid transparent

Сообщение darkloki »

Вобщем я решил данную проблему.
Как появилось время снова занялся данным вопросом и наткнулся на одну статью, примерно по теме. В итоге получилось следующее:
Добавил в начало вышеозвученного скрипта след.строку:

Код: Выделить всё

iptables -F -t nat

Затем где идет про проброс портов сделал примерно так:

Код: Выделить всё

iptables -t nat -A PREROUTING -s $LAN -d ! $LAN -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -s $LAN -j SNAT --to-source $INET_IP
iptables -A FORWARD -s $LAN -d ! $LAN -j ACCEPT
iptables -A FORWARD -d $LAN -m state --state RELATED,ESTABLISHED -j ACCEPT

Авось кому пригодиться :)
Спасибо сказали:
ParaSerfer
Сообщения: 3

Re: squid transparent

Сообщение ParaSerfer »

darkloki писал(а):
13.03.2008 16:02
Вобщем я решил данную проблему.
Как появилось время снова занялся данным вопросом и наткнулся на одну статью, примерно по теме.


А можно ссылку на эту статью подкинуть? Ну очень интересно.
Спасибо сказали:
Аватара пользователя
darkloki
Сообщения: 20
ОС: Gentoo Linux

Re: squid transparent

Сообщение darkloki »

ParaSerfer писал(а):
19.03.2008 02:52
А можно ссылку на эту статью подкинуть? Ну очень интересно.

да конечно. вот ссылка. :)
Спасибо сказали:
ParaSerfer
Сообщения: 3

Re: squid transparent

Сообщение ParaSerfer »

Спасибо, признателен.
Спасибо сказали: