Есть пул реальных адресов /28 на linux-маршрутизаторе.
За маршрутизатором много-много - около сотни - клиентов с приватными адресами.Сейчас все клиенты натятся через один реальный адрес посредством iptables.
Но хотелось бы чтобы был задействован весь /28 пул реальников.
Возможно ли с помощью iptables сделать так:
Чтобы пакеты от любого клиента каждый раз транслировались бы в случайным образом выбранный реальник из /28 пула.
Причем все коннекты бы от этого клиента биндились к каждому конкретному реальнику на какое-то заданное время.
В деталях, что я хочу:
клиент: 10.10.1.108
пул: 2.2.2.0/28
1. клиент посылает запрос на opennet.ru(77.234.201.242)
2. iptables создает трансляцию, выбирая из реального пула /28 какой-то адрес. допустим: 10.10.1.108:25628 <- 2.2.2.8 -> 77.234.201.242:80
3. всё последующие коннекты от этого клиента к серверу 77.234.201.242 на любой порт транслируются через тот же реальник(2.2.2.8).
4. по прошествии какого-то времени, если клиент к этому серверу больше не шлет коннектов, то срабатывает таймаут и любое последующее соединение от этого же клинта к этому же, либо любому другому серверу, транслировалось бы уже через другой случайным образом выбранный реальник из 2.2.2.0/28 пула.
То есть я хочу это в частности для того, чтобы не возникало плачевных ситуаций в случаях с капризными протоколами, например, ICQ, который требует, чтобы все коннекты от конкретного клиента были с одного и тоже адреса.
в манах нашел для своей ситуации только nth патч, с помощью которого можно, например, матчить каждый 3й пакет и назначать ему соответствующий --to-source, но в моем случае это не подходит по причинам, что я рписал выше.
For example, if you want to balance the load to the 3 addresses 10.0.0.5, 10.0.0.6 and 10.0.0.7, then you can do as follows :
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 0 -j SNAT --to-source 10.0.0.5
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 1 -j SNAT --to-source 10.0.0.6
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 2 -j SNAT --to-source 10.0.0.7
# iptables -t nat --list
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- anywhere anywhere every 3th packet #0 to:10.0.0.5
SNAT all -- anywhere anywhere every 3th packet #1 to:10.0.0.6
SNAT all -- anywhere anywhere every 3th packet #2 to:10.0.0.7