Мне нужен эксперт, чтобы настроить перенаправление NAT (iptables) для сохранения исходного адреса клиента. В настоящее время мои серверы работают, но все клиенты появляются с частными IP-адресами моей vLAN.
Пример работы перенаправления моего сервера:
VPS 1 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 2 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 3 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 4 (Public IP) redirect traffic to VPS 5 (Private IP)
Но при перенаправлении трафика IP-адрес клиента изменяется на частный IP-адрес общедоступного сервера, к которому обращается клиент.
TCPDUMP:
IP 10.0.1.130.61570> 10.0.1.138.85: UDP, length 35
IP 10.0.1.132.63112> 10.0.1.138.85: UDP, length 35
IP 10.0.1.133.63435> 10.0.1.138.85: UDP, length 35
IP 10.0.1.136.63432> 10.0.1.138.85: UDP, length 35
Проблема заключается в том, что всем клиентам назначается частный IP-адрес при перенаправлении, и мне нужно поддерживать реальный IP-адрес клиента.
Если я удалю правило "iptables -t nat -A POSTROUTING -j MASQUERADE"
Затем IP-адреса клиентов поддерживаются, но сервер отвечает пакетам частным IP-адресом на IP-адреса клиентов.
TCPDUMP:
IP 10.0.1.138.85> client1.isp.net.61570: UDP, length 45
IP 10.0.1.138.85> client2.isp.net.63112: UDP, length 45
IP 10.0.1.138.85> client3.isp.net.63435: UDP, length 45
IP 10.0.1.138.85> client4.isp.net.63432: UDP, length 45
Я хочу сохранить реальный IP-адрес клиентов, но (VPS 5) не маршрутизирует пакеты обратно в Интернет.
Я знаю два способа решить вашу проблему:
Вы можете использовать дополнительные диапазоны портов в DNAT
правило на хостах VPS без SNAT
правило. И на основе этих номеров портов VPS-5
направляет ответы через правый хост.
Краткий пример:
Планируйте дополнительные номера портов на VPS-5
на который другие хосты будут пересылать пакеты от клиентов. Угадаем VPS-1
пересылать пакеты в VPS-5 tcp/10001
, то VPS2
- чтобы VPS-5 tcp/10002
и так далее.
На каждом VPS
хоста вам нужно только одно правило для перенаправления трафика на специальный порт VPS-5
. Скоро VPS-1
правило будет выглядеть так:
# vps-1 host
iptables -t nat -A PREROUTING \
--dst <vps-1-pub-ip> -p udp --dport <srv-port> \
-j DNAT --to-destination <vps-5-ip>:10001
На VPS-5
вам нужна более сложная конфигурация. Прикол в том, какой номер порта на какой VPS5
получает перенаправленный запрос, а также указывает на хост VPS, через который должны маршрутизироваться ответы.
На VPS-5
вам нужна отдельная таблица маршрутизации и правило маршрутизации для каждого другого VPS
хост. Пример для VPS-1
и VPS-2
:
# vps-5 host
ip route add <connected-subnet> dev <iface> table 1
ip route add 0/0 via <VPS-1-INT-IP> dev <iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001
ip route add <connected-subnet> dev <iface> table 2
ip route add 0/0 via <VPS-2-INT-IP> dev <iface> table 2
ip rule add fwmark 2 lookup 2 pref 10002
# vps-5 host
iptables -t mangle -A PREROUTING \
-m conntrack --ctstate NEW \
-p udp --dport 10001 \
-j CONNMARK --set-mark 0x1
# vps-5 host
iptables -t nat -A PREROUTING \
--dst <vps-5-ip> -p udp --dport 10001:10004 \
-j REDIRECT --to-ports 85
# vps-5 host
iptables -t mangle -A OUTPUT \
-m conntrack --ctstate DNAT --ctdir REPLY \
-j CONNMARK --restore-mark
Этот способ применим, только если хосты подключены друг к другу напрямую. В противном случае вам следует использовать следующий способ.
В некоторых случаях серверы подключаются не друг к другу, а через некоторые маршрутизаторы. В этих случаях способ, описанный выше, не поможет, поскольку каждый промежуточный маршрутизатор самостоятельно принимает решение о маршрутизации.
Единственный способ, насколько я знаю, сохранить исходный адрес клиента и перенаправить пакеты с переднего хоста (VPS-1
- VPS-4
) на целевой хост (VPS-5
), это использование туннелирования.
Упрощенное решение: * Запланируйте дополнительную IP-адресацию для использования внутри туннелей. * На каждом переднем хосте (VPS-1
- VPS-4
) вы создаете туннель для VPS-5
. Вы можете использовать любой тип туннелирования, какой захотите. В самом простом случае вы можете использовать статические туннели GRE, но у него есть некоторые ограничения, например, обход NAT. * На каждом переднем хосте вам нужно только одно правило для перенаправления трафика на VPS-5
. Пример для VPS-
:
# vps-1 host
iptables -t nat -A PREROUTING \
--dst <vps-1-pub-ip> -p udp --dport <srv-port> \
-j DNAT --to-destination <vps-5-tun-ip>
VPS-5
вам также следует настроить дополнительные таблицы маршрутизации и правила маршрутизации для ответа через правый передний хост:# vps-5 host
ip route add 0/0 dev <vps-1-tun-iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001
iptables -t mangle -A PREROUTING \
-m conntrack --ctstate NEW \
-i <vps-1-tun-iface> \
-j CONNMARK --set-mark 0x1
iptables -t nat -A PREROUTING \
-i <vps-1-tun-iface> \
-p udp --dport <srv-port> \
-j DNAT --to-destination <srv-listen-ip>
iptables -t mangle -A OUTPUT \
-j CONNMARK --restore-mark
iptables -t filter -A INPUT \
-m conntrack --ctstate ESTABLISHED,RELATED
-j ACCEPT
...
iptables -t filter -A INPUT \
-p udp --dport <srv-port>
-j ACCEPT