Здравствуйте уважаемые знатоки.
Есть 5 прокси с авторизацией(http,socks) серверов разбросанные территориально по планете (все данные для примера):
1.1.1.1:9999
2.2.2.2:8888
3.3.3.3:7777
4.4.4.4:6666
5.5.5.5:5555
Есть желание установить 6 сервер с целью иметь один входящий ip адрес и перенаправление на эти 5 серверов по портам.
Предположим 6 сервер(главный): 6.6.6.6
И так 6.6.6.6:1000 - перенаправляет все на прокси 1.1.1.1:9999
6.6.6.6:1001 - перенаправляет все на прокси 2.2.2.2:8888
6.6.6.6:1002 - перенаправляет все на прокси 3.3.3.3:7777
6.6.6.6:1003 - перенаправляет все на прокси 4.4.4.4:6666
6.6.6.6:1004 - перенаправляет все на прокси 5.5.5.5:5555
Как такое организовать с помощью iptables?
Я выяснил что это iptables PREROUTING POSTROUTING FORWARD
Но как правильно составить сами правила, методом перебора не вышло.
galaxy, в девственном.
Этого достаточно что бы указать в программе по работе с прокси 6.6.6.6:1000
И все будет работать и перенаправляться на 1.1.1.1:9999 ?
POSTROUTING не требуется?
Михаил, POSTROUTING не нужен.
А достаточно или нет, это вам разбираться. Правил iptables, по идее, достаточно, а так много какие настройки в linux влияют на прохождение пакетов (та же routing table, ipv6 может укусить и пр.). Tcpdump в помощь, если не работает.
Соответственно имеет следующее
iptables-save
# Generated by iptables-save v1.8.4 on Thu Jul 22 19:45:27 2021
*mangle
:PREROUTING ACCEPT [770:532364]
:INPUT ACCEPT [369:29781]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [328:39807]
:POSTROUTING ACCEPT [328:39807]
COMMIT
# Completed on Thu Jul 22 19:45:27 2021
# Generated by iptables-save v1.8.4 on Thu Jul 22 19:45:27 2021
*filter
:INPUT ACCEPT [40:2872]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [33:3104]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 1.1.1.1/32 -p tcp -m tcp --dport 9999 -j ACCEPT
COMMIT
# Completed on Thu Jul 22 19:45:27 2021
# Generated by iptables-save v1.8.4 on Thu Jul 22 19:45:27 2021
*nat
:PREROUTING ACCEPT [402:502623]
:INPUT ACCEPT [1:40]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 1000 -j DNAT --to-destination 1.1.1.1:9999
COMMIT
пытаюсь подключится к адресу 6.6.6.6:1000 не выходит.
На сервере я имею такое
# iptables -L -v -n
Chain INPUT (policy ACCEPT 452 packets, 35079 bytes)
pkts bytes target prot opt in out source destination
Требуется, если 6.6.6.6:1000 не является шлюзом для 1.1.1.1:9999 (а по описанию задачи не является).
iptables -t nat -A POSTROUTING -p tcp --dport 1000 -j SNAT --to-source 6.6.6.6
Без этого будет несимметричный маршрут, клиент пошлёт запрос на 6.6.6.6, а получит ответ напрямую от 1.1.1.1 (и отправит этот ответ в мусор).
Немного не понимаю вас.
Мне нужно что бы между прокси 1.1.1.1:9999 и пользователем был прокси сервер 6.6.6.6:1000
И что бы пользователь указывая 6.6.6.6:1000 работал через прокси 1.1.1.1:9999 и трафик нормально шел.
Для этого нужен POSTROUTING ?
правильнее сказать, что нужен SNAT.
Потому что в POSTROUTING можно написать и что-нибудь другое, не только SNAT, а в вашем конкретном случае нужен SNAT.
моя ошибка, номер порта нужен тот, что после DNAT
iptables -t nat -A POSTROUTING -p tcp --dport 9999 -j SNAT --to-source 6.6.6.6
ну или не 9999, а 8888, судя по:
12:09:10.864125 IP 91.219.66.130.65428 > 195.140.147.22.8888: Flags [S], seq 3529296127, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
тогда у вас и в правиле DNAT не 1.1.1.1:9999, а 1.1.1.1:8888, наверное.
hint000, пока не получается.
Вот что делаю
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 95.161.164.178 --dport 64013 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 95.161.164.178:64013
iptables -t nat -A POSTROUTING -p tcp --dport 64013 -j SNAT --to-source 195.140.147.22
tcpdump -i any -nn 'tcp and (port 8888 or 64013)'
Получаю вот такие сообщения
12:19:21.132676 IP 91.219.66.130.53756 > 195.140.147.22.8888: Flags [S], seq 41697034, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
Но по прежнему не работает, куда еще можно посмотреть?
Михаил, может быть там старые правила остались и мешают.
Попробуйте перед двумя последними строчками добавить эту:
iptables -t nat -F
она должна вычистить старые правила из NAT, если такие остались.
hint000, И финальный вопрос, я смогу как то правилами передать IP адрес клиента через эту систему
Что бы
клиент 12.12.12.12 -> сервер ретранслятор iptables -> прокси сервер (что бы они видел этот ip адрес 12.12.12.12) поскольку на конечном прокси существует авторизация по ip адресу?
Ещё можно попробовать такой вариант: убрать SNAT на 6.6.6.6, но добавить SNAT на 1.1.1.1, чтобы клиент думал, что получает ответ от 6.6.6.6. Это не очень хороший вариант, может работать или не работать, в зависимости от настройки всех сетей, через которые будут проходить эти пакеты.
Самый надёжный вариант - это убрать SNAT вообще, но поднять VPN между 6.6.6.6 и 1.1.1.1, сделав 6.6.6.6 основным шлюзом для 1.1.1.1.