Назад | Перейти на главную страницу

iptables с прозрачным прокси, как передать IP пользователя

У меня есть локальный прозрачный прокси, но моя проблема в том, что пакеты при перенаправлении имеют IP-адрес маршрутизатора, а не пользователя. Вот правила, которые у меня сейчас есть:

iptables -t nat -A PREROUTING -i eth0 -s ! 192.168.1.231 -p tcp -m multiport --dport 80 -j DNAT --to 192.168.1.231:3128
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -d 192.168.1.231 -j SNAT --to 192.168.1.1
iptables -A FORWARD -s 192.168.0.0/16 -d 192.168.1.231 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
iptables -I FORWARD -i eth0 -p tcp -m multiport --dport 80 -j DROP

Вроде все работает, но IP в ЖУРНАЛЕ прокси всегда 192.168.1.1 вместо возможно 192.168.1.46 или 192.168.4.25

это важно для меня, потому что у меня разные правила кальмаров для 192.168.4.XX (DHCP) против 192.168.1.XX или 192.168.2.XX и это действительно помогло бы мне найти тех, кто скучает по Интернету.

с помощью этого метода вы можете избежать изменения пакетов NAT.

в коробке iptables

iptables -t mangle -A PREROUTING -j ACCEPT -p tcp --dport 80 -s squid-box
iptables -t mangle -A PREROUTING -j MARK --set-mark 3 -p tcp --dport 80
ip rule add fwmark 3 table 2
ip route add default via squid-box dev eth1 table 2

в коробке с кальмарами

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

подробнее см. здесь http://www.tldp.org/HOWTO/TransparentProxy-6.html

Итак, ваша установка выглядит так: clients -> router -> proxy. Если трафик из proxy к clients течь через router, вы можете просто удалить SNAT правило, ничего не нарушая, поскольку router увидит ответные пакеты и сможет выполнить для них необходимую трансляцию IP. Если это не так, вы можете добавить маршруты на proxy к clients через routerИтак, мы вернулись к делу №1. Если это невозможно, вы также можете установить HTTP-прокси на router, который проинформирует ваш proxy IP исходного пользователя через X-Forwarded-for заголовок.

Вы также можете использовать ответ Пэта с небольшими изменениями:

iptables -A PREROUTING -t nat -i eth0 ! -d $proxy_ip -p tcp --dport 80 -j REDIRECT --to-port 3128

Таким образом, только перенаправленный трафик снова перенаправляется на прокси-сервер squid, и apache, работающий на том же сервере, может использоваться как обычно.

Я не уверен в своей интерпретации вашей установки. Но, возможно, переадресация работает так:

# HTTP Forward (TCP Port 80)
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 192.168.1.1 --dport 80 -j DNAT --to 192.168.1.231:3128
iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.231 -j SNAT --to-source 192.168.1.1
iptables -A FORWARD -p tcp -s 192.168.1.1 --sport 80 -j ACCEPT

# DNS Forward (TCP & UDP Port 53)
iptables -t nat -A PREROUTING -p udp -s 0/0 -d 192.168.1.1 --dport 53 -j DNAT --to 192.168.1.231:53
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 192.168.1.1 --dport 53 -j DNAT --to 192.168.1.231:53
iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.231 -j SNAT --to-source 192.168.1.1
iptables -A FORWARD -p udp -s 192.168.1.1 --sport 53 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.1 --sport 53 -j ACCEPT