Скренарио:
[internal_server_1]AA------AB[firewall_1]AC----+
10.2.0.3-^ ^-10.2.0.2 |
internet
10.3.0.3-v v-10.3.0.2 |
[internal_server_2]BA------BB[firewall_2]BC----+
Порты AC, BC имеют действующие интернет-адреса. Все системы работают под Linux и имеют root-доступ для всех.
Нужен безопасный rsync внутренний_сервер_1: / некоторый / путь в внутренний_сервер_2: / другой / путь
Моя идея - создать безопасный туннель ssh между двумя брандмауэрами, например. из firewall_1
firewall1# ssh -N -p 22 -c 3des user2@firewall_2.example.com -L xxx/10.3.0.3/xxxx
а после будет запускать rsync от internal_server_1 примерно так:
intenal1# rsync -az /some/path user@xxxx.yyyy.com:/another/path
Я не знаю
Есть идея или указатель на полезный интернет-ресурс по этому делу?
спасибо.
В SSH есть опция ProxyCommand, которая позволяет передавать весь трафик SSH команде, которая может быть запущена на другом хосте. Вероятно, вы можете связать несколько из них вместе, чтобы достичь того, что вы хотите делать.
Если вы можете напрямую подключиться от internal_server_1 к firewall_2, вы можете использовать что-то вроде этого (например, как значение для -e
если вы используете rsync):
ssh -o ProxyCommand="ssh -W %h:%p firewall_2" internal_server_2
Я предполагаю, что порт SSH на firewall_2 («BC» на вашей диаграмме) доступен извне. Могут ли компьютеры в сети 1 (10.2.0. *) Подключаться к Интернету напрямую (то есть через NAT) или только через проксирование через firewall_1? Поскольку вы не указываете, я предполагаю, что нет.
Вероятно, самое простое, что можно сделать, - это туннелировать rsync через SSH, туннелируемый через SSH (очевидно, «простейший» - относительный). Сначала создайте внешний туннель, запустив его на firewall_1:
firewall_1# ssh -N -p 22 -c 3des user2@firewall_2.example.com -L 10.2.0.2:5432:10.3.0.3:22
Обратите внимание, что это запускает локальный (firewall_1) конец туннеля, привязанный к его внутреннему IP-адресу (10.2.0.2), на произвольном порту (я использовал 5432).
Затем с server_1 запустите rsync и используйте его -e
возможность запустить его через SSH:
server_1# rsync -e "ssh -N -p5432 -c 3des" -a /local/path server2user@10.2.0.2:/remote/path
Этот SSH входит в порт 5432 на IP-адресе 10.2.0.2, который внешний туннель перенаправляет на порт 22 10.3.0.3 (server_2) (стандартный SSH).
Кстати, если координировать настройку на нескольких компьютерах (т.е. создать туннель из firewall_1, а затем использовать его из server_1) сложно, дайте мне знать; с немного большей сложностью, можно запустить все это с server_1 с помощью одной команды. Хотя вы должны иметь возможность настроить внешний туннель один раз, а затем просто оставить его ...
rsync по умолчанию использует SSH (порт 22). Итак, вам нужно выполнить перенаправление портов на ваших брандмауэрах, чтобы иметь возможность rsync с внутреннего сервера 1 на внутренний сервер 2.
Это можно сделать с помощью iptables
на firewall1 и firewall2 следующим образом:
На брандмауэре1
iptables -A POSTROUTING -s 10.2.0.3 -p tcp --dport 5022 -j SNAT --to-source AC.IP.addr.ess
На брандмауэре2
iptables -A PREROUTING -s AC.IP.addr.ess -p tcp --dport 5022 -j DNAT --to-destination 10.3.0.3:22
Используя такие правила, вы можете получить доступ к внутреннему server2 с внутреннего server1 через порт 5022, например:
internal_server1$ ssh -p 5022 user@BC.public.ip.addr
протестированная полная команда выглядит так:
rsync -av --delete -e "ssh -o ProxyCommand='ssh -l username -W %h:%p jumphost-ip'" ./source_path/ username@internal-ip:/dest_path/