Мотивация
Когда-нибудь назад мне пришлось получить доступ к серверу API Kubernetes, который был бранджирован в частную сеть VPC. Я не хотел настроить отдельный экземпляр Bastion, просто чтобы получить доступ к этому кластеру, причина, потому что бастионы TBH являются избыточными в K8S, так как каждая задача может быть выполнена через API-адресов клиент-сервера, используя kubectl
. Итак, все, что мне нужно было доступ к этому серверу API из доверенной сети безопасным способом. Благодаря моему другу @sarat. Я узнал о СШТЛЫ . sshuttle
вполне уникален в том смысле, что это не совсем VPN, а действует как один (для большинства практических целей). sshuttle
Позволяет получить доступ к внутренней сети через надежный узел внутри VPC, без необходимости иметь дело с беспорядком переадресации портов или VPN.
Основная идея довольно простая, sshuttle
Начинается местный Python
Сервер в вашем хозяином машине и создает iptables
Правила для маршрута пакетов назначения указанных блоков CIDR на этот локальный сервер. На сервере пакеты мультиплексируются над SSH
сеанс и отправлен на сервер. Сервер разбирается мультиплексированный пакет и маршруты их для выше по потоку. Таким образом, в основном это умный взлом, чтобы избежать TCP на TCP (который снова беспорядок на ненадежных сетях). Мультиплексированные потоки на SSH
это всего лишь одно состояние TCP (по сравнению с VPN-соединениями, которые являются безграждающимися). Теперь вам должно быть интересно, как придет целевой сервер разбирает пакеты. Да, должен быть какой-то sshuttle
Запуск демона, который делает это для вас. Это где СШТЛЫ
Есть ли магия, это автоматически Развертывает сценарий Python на вашем целевом хосте для выполнения этой задачи. Так да, для sshuttle
Работать, как клиент, так и цель должны иметь Python
и iptables
установлены.
использование
sshuttle -r user @ port x.x.x.x
Все пакеты, направляемые на блок CIDR, теперь будут проходить sshuttle
Демон, так как он настроил iptables
правила для них. Также СШТЛЫ
Запускает локальный сервер Python на вашем хостом. Вы можете увидеть это, используя Netstat
:
$ sudo netstat -tunapl | grep python Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:12300 0.0.0.0:* LISTEN 27425/python
Есть Python
Сервер слушает порт 12300
в моем хост-машине. На самом деле проверять, это действительно начинается СШТЛЫ
, вы можете использовать PSTREE -P |. меньше
и искать СШТЛЫ
. Здесь вы можете увидеть sshuttle
действительно начал Python
Сервер и PID ( 27425
) совпадает с тем, что мы видели в Netstat
команда.
-zsh(13201)---sshuttle(27425)-+-ssh(27446)---ssh(27447) `-sudo(27427)---python(27445)
Вы можете даже пересылать DNS-запросы с --dns
флаг. Это супер полезно, если у вас есть что-то вроде Route 53, чтобы провести ваши DNS-записи в частной зоне (например, TLD, как . Innernal
).
Лучше, чем SSH Tunnels?
Да, вы также можете перейти вперед с SSH, используя: ssh -nnt -l <локальный порт>: {upstream-хозяин}: {upstream-port} user @ пульт
Проблема с SSH
Туннели состоит в том, что они испытывают частые потери пакетов на нормальном соединении WiFi, и это довольно неприятно, чтобы иметь дело с ними. Более того, иногда вам нужен доступ к нескольким портам в вашей частной сети, который требует, чтобы вы придумывали их -L
Флаг, который я нахожу это как громоздким. Кроме того, вы не можете пересылать DNS-запросы (через UDP) с SSH
может сделать только TCP.
sshuttle
сделал мою жизнь так просто!
Плавник!
Первоначально опубликовано в моем блог
Оригинал: «https://dev.to/mrkaran/using-sshtunnel-2h24»