Я думаю, проблема довольно классическая, но так как в iptables я все еще плаваю (ибо редко с ним имею дело), понятного мне решения я так и не нашел.
Итак, имеем: 1. Комп, выступающий в роли роутера. На нем Linux с iptables. 2. Сервер с nginx внутри локалки, на который проброшен 80-й порт. 3. Рядовые компы внутри локалки, которые получают доступ в инет через вышеупомянутый роутер.
Все работает как надо, но есть одна проблема: в логах nginx все запросы к серверу извне видны как будто они идут от внешнего IP роутера, и как следствие имеем ряд неприятных последствий.
iptables на роутере настроен следующим образом:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/$INET_IFACE/proxy_arp
# Clear ALL rules
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t filter -F
$IPTABLES -t filter -X
#----------------------------------------------------------------------------------------------------------
# POSTROUTING chain
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_IP_RANGE -j SNAT --to-source $STATIC_IP
# Port forwarding
$IPTABLES -t nat -A PREROUTING -p tcp -i $INET_IFACE --dport 80 -j DNAT --to 192.168.0.2:80
# Forwarding itself
$IPTABLES -t nat -A POSTROUTING -o $LAN_IFACE -j SNAT --to-source $STATIC_IP
# Forward to connect via local net to external IP
$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp -m tcp -d $STATIC_IP/32 --dport 80 -j DNAT --to-destination 192.168.0.2:80
В логах nginx виднеется такое (AA.BB.CC.DD - внешний IP роутера):
2014/01/18 00:22:16 [error] 2607#0: *11106146 limiting connections by zone "conn_limit_per_ip", client: 192.168.0.1, server: localhost, request: "POST /index.php HTTP/1.1", host: "AA.BB.CC.DD"
Как сделать так, чтобы были видны именно внешние IP-адреса тех, кто шлет запросы?