Я пытаюсь создать прозрачный прокси для кеширования и черного списка трафика на моем самодельном маршрутизаторе Linux. Проблема в том, что у всех клиентов истекает время ожидания при попытке доступа к любым сайтам HTTP (HTTPS работает).
Вот моя установка:
Система: Ubuntu 16.04
Прокси: Кальмар 3.5.12
iptables:
- Соответствующее правило:
-A PREROUTING -i wlx30b5c21224f3 -p tcp --dport 80 -j REDIRECT --to-port 9999
- Весь набор правил:
https://pastebin.com/HtzTmYMp
Кальмар:
- Соответствующие правила:
http_port 192.168.99.1:8888
http_port 192.168.99.1:9999 intercept
- Вся конфигурация:
https://pastebin.com/Ft2f3uaD
Интерфейсы:
- Интернет - enp1s0 (ethernet)
- Локальная сеть - wlx30b5c21224f3 (беспроводная)
Сеть:
- Сетевой адрес - 192.168.99.0/24
- Шлюз, DNS, Squid - 192.168.99.1
Журналы кальмаров:
- Access.log - пусто
- Cache.log - https://pastebin.com/AQ6VFdNP
Я могу сказать, что squid работает и прослушивает назначенные порты, глядя на активные процессы.
Результат netstat -tulpn | grep squid
:
tcp 0 0 192.168.99.1:9999 0.0.0.0:* LISTEN 2604/(squid-1)
tcp 0 0 192.168.99.1:8888 0.0.0.0:* LISTEN 2604/(squid-1)
udp 0 0 0.0.0.0:35057 0.0.0.0:* 2604/(squid-1)
udp6 0 0 :::50319 :::* 2604/(squid-1)
Я также могу сказать, что правило iptables перенаправляет трафик с порта 80 на порт 9999, наблюдая за трафиком при попытке подключиться к HTTP-сайту на одном из клиентов.
Результат watch 'iptables -t nat -L -n -v'
: https://pastebin.com/wdRjnBDa
Количество байтов, проходящих через правило iptables, продолжает увеличиваться по мере того, как я пытаюсь добраться до сайта, но все же время ожидания клиента истекает.
Итак, моя теория заключается в том, что iptables правильно перенаправляет трафик, а squid прослушивает правильные порты, но мне не хватает чего-то, что мешает трафику когда-либо достигать Squid. (Поскольку логи Squid более-менее пусты)
Я пробовал кучу различных правил iptables, которые нашел в различных руководствах по Squid в Интернете - большинство из них дали тот же результат, что и выше. Я также пробовал кучу разных портов в Squid, и я пытался удалить IP-адрес из http_port 192.168.99.1:9999
- но это заставило squid прослушивать только ipv6 (и я не уверен, как это влияет на перенаправление iptables).
PS. Это мой первый сетевой проект, так что, возможно, я упускаю здесь что-то упущенное.
Убедитесь, что вы открыли / имеете еще один http_port для обратного прокси:
Причина, по которой SSL работает, заключается в том, что он не проходит через squid. в этом примере вы также можете перехватить это (первая строка - это то, что вам нужно):
http_port 3130
http_port 3128 intercept
https_port 3129 intercept ssl-bump \
cert=/etc/squid/certs/squidCA.pem \
generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
iptable:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 3128
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0