Я использую маршрутизатор с Tomato USB для пересылки запросов порта 80 на сервер Ubuntu с Squid 3 в прозрачном режиме. Кто-то на форуме Tomato адаптировал эти инструкции для помидоров:
#!/bin/sh
INTERNAL_NETWORK="192.168.1.0/24"
ROUTER_IP="192.168.1.1"
PROXY_SERVER="192.168.1.3"
PROXY_PORT="3128"
/usr/sbin/iptables -t nat -A PREROUTING -i br0 -s $INTERNAL_NETWORK -d $INTERNAL_NETWORK -p tcp --dport 80 -j ACCEPT
/usr/sbin/iptables -t nat -A PREROUTING -i br0 -s ! $PROXY_SERVER -p tcp --dport 80 -j DNAT --to $PROXY_SERVER:$PROXY_PORT
/usr/sbin/iptables -t nat -A POSTROUTING -o br0 -s $INTERNAL_NETWORK -p tcp -d $PROXY_SERVER -j SNAT --to $ROUTER_IP
/usr/sbin/iptables -t filter -I FORWARD -s $INTERNAL_NETWORK -d $PROXY_SERVER -i br0 -o br0 -p tcp --dport $PROXY_PORT -j ACCEPT
Пересылка работает как надо, запросы обрабатывает Squid. В инструкциях показано правило обхода определенных машин в сети. Моя проблема в том, что мне нужно обходить некоторые сайты, у которых проблемы с прокси, а не конкретную машину. Я пробовал добавить это:
/usr/sbin/iptables -t nat -A PREROUTING -d caixa.gov.br -j ACCEPT
Это правило не работает. Я вообще не хочу, чтобы caixa.gov.br (и некоторые другие) перенаправлялись на прокси. Но Tomato по-прежнему перенаправляет все сайты.
Можно ли добавить правило для каждого сайта, который я не хочу перенаправлять?
iptables -A ...
помещает правило в конец цепочки. Таким образом, ваш никогда не соответствует (или, по крайней мере, без эффекта), потому что второй (-s ! $PROXY_SERVER
) уже получил эти пакеты / соединения.
Вместо того iptables -A PREROUTING
тебе нужно iptables -I PREROUTING 2
. Или вы создаете цепочки, чтобы упростить понимание структуры:
#!/bin/bash
INTERNAL_NETWORK="192.168.1.0/24"
ROUTER_IP="192.168.1.1"
PROXY_SERVER="192.168.1.3"
PROXY_PORT="3128"
if iptables -L prerouting_exceptions -n &>/dev/null; then
iptables -t nat -F prerouting_exceptions
else
iptables -t nat -N prerouting_exceptions
fi
# this prevents the same rule being inserted with each script call
if ! iptables -L FORWARD -n | grep -q proxy; then
iptables -t filter -I FORWARD -s $INTERNAL_NETWORK -d $PROXY_SERVER -i br0 \
-o br0 -p tcp --dport $PROXY_PORT -j ACCEPT -m comment --comment proxy
fi
iptables -t nat -F PREROUTING
iptables -t nat -A PREROUTING -j prerouting_exceptions
iptables -t nat -A PREROUTING -i br0 -s ! $PROXY_SERVER -p tcp \
--dport 80 -j DNAT --to $PROXY_SERVER:$PROXY_PORT
iptables -t nat -A prerouting_exceptions -i br0 -s $INTERNAL_NETWORK \
-d $INTERNAL_NETWORK -p tcp --dport 80 -j ACCEPT
iptables -t nat -A prerouting_exceptions -d caixa.gov.br -j ACCEPT
Я попробовал твой ответ. Я добавил www1.caixa.gov.br помимо caixa.gov.br, потому что он также отображался в журнале Squid.
Журнал кальмаров:
1367165802.899 151455 192.168.1.1 TCP_MISS/503 4261 GET http://www.caixa.gov.br/ - DIRECT/www.caixa.gov.br text/html
Результат iptables -t nat -L -nv на Tomato USB:
Chain PREROUTING (policy ACCEPT 117 packets, 10457 bytes)
pkts bytes target prot opt in out source destination
155 12613 prerouting_exceptions all -- * * 0.0.0.0/0 0.0.0.0/0
12 660 DNAT tcp -- br0 * !192.168.1.103 0.0.0.0/0 tcp dpt:80 to:192.168.1.103:3128
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
169 12403 MASQUERADE all -- * ppp0 0.0.0.0/0 0.0.0.0/0
12 660 SNAT all -- * br0 192.168.1.0/24 192.168.1.0/24 to:192.168.1.1
Chain OUTPUT (policy ACCEPT 73 packets, 5279 bytes)
pkts bytes target prot opt in out source destination
Chain WANPREROUTING (0 references)
pkts bytes target prot opt in out source destination
0 0 DNAT icmp -- * * 0.0.0.0/0 0.0.0.0/0 to:192.168.1.1
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9740 to:192.168.1.117:9740
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5740 to:192.168.1.101:5740
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:34184 to:192.168.1.117:34184
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:14983 to:192.168.1.117:14983
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:54184 to:192.168.1.101:54184
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:51413 to:192.168.1.103:51413
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:42020 to:192.168.1.100:42020
Chain prerouting_exceptions (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- br0 * 192.168.1.0/24 192.168.1.0/24 tcp dpt:80
14 800 ACCEPT all -- * * 0.0.0.0/0 200.201.166.106
12 696 ACCEPT all -- * * 0.0.0.0/0 200.201.166.240
IP-адрес caixa.gov.br:
#host caixa.gov.br
aixa.gov.br has address 200.201.166.106
caixa.gov.br mail is handled by 0 bootes1.caixa.gov.br.
caixa.gov.br mail is handled by 0 bootes.caixa.gov.br.