SSH Sshuttle: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 106: | Строка 106: | ||
} |
} |
||
</PRE> |
</PRE> |
||
| + | |||
| + | Формат правил такой: |
||
| + | </BR> |
||
| + | <code> |
||
| + | action [direction] [log] [quick] [on interface] [af] [proto protocol] [from src_addr [port src_port]] [to dst_addr [port dst_port]] |
||
| + | </code> |
||
| + | |||
| + | * <code>action</code> <code>pass</code> Действие предпринимаемое к подходящим пакетам, либо pass, либо block. Действие pass будет пропускать пакеты в ядро для дальнейшей обработки, в то время как действие block будет реагировать так – как указано в опции block-policy. Значение по умолчанию которой можно изменить на block drop или block return. |
||
| + | <code>direction</code> <code>out</code> Направление движения пакета через интерфейс, либо in, либо out. |
||
| + | <code>log</code> - отсутвует, без логгирования |
||
| + | <code>quick </code> - отсутвует, отсутвие этой опции означает что дальнейшие правила будут обработаны |
||
| + | <code>route-to lo0 Для этого у правила pass есть опция route-to (Interface [Gateway]). Указывает, куда отправлять трафик, прошедший по этому правилу. ( |
||
| + | <code>af</code> <code>inet </code> Предположу что AF == Address Family, ip или ipv6 (inet / inet6) |
||
| + | <code>proto protocol</code> <code>proto tcp</code> |
||
| + | <code>from src_addr [port src_port]</code> <code>from any</code> "откуда угодно", порт опущен что означает "любой порт" |
||
| + | <code>to dst_addr [port dst_port]</code> <code>to 172.31.0.0/24 </code> |
||
| + | flags S/SA keep state |
||
Версия 11:05, 14 мая 2024
Shuttle
Заметка что бы не забыть что да как
Пример:
sshuttle --remote mcc-user@10.238.27.69 10.238.56.0/24 -vv --dns --ssh-cmd "ssh -F /Users/mmazur/ssh_config -vv"
--remote mcc-user@10.238.27.69- через какой хост завернуть трафик (туда и только туда нужен доступ по логину/ключу/2FA )10.238.56.0/24- какую сеть маршрутизировать (в случае МакОС - добавлю подробности!)-vv- подробный вывод--dns- в том числе использовать для DNS--ssh-cmd "ssh -F /Users/mmazur/ssh_config -vv"- как и с какими параметрами подключаться к хосту10.238.27.69
Работает только для tcp/udp/icmp
Еще примеры
Весь трафик
Например для работы в небезхопастных сетях
sshuttle -r user@remoteserver 0.0.0.0/0 -vv
Теперь о том, как работает. 1) в момент запуска sshuttle копирует на удаленный сервер некий assembler.py (/usr/lib/sshuttle/assembler.py с ноута) 2) запускает assembler.py на удаленном сервере (python2 -c import sys; skip_imports=1; verbosity=2; exec compile(sys.stdin.read(764), «assembler.py», «exec»)) 3) запускает на локалхосте /usr/lib/sshuttle/main.py 4) в iptables (в линкус) добавляет правило, по которым весь tcp трафик заворачивается в ssh-туннель.
DNS трафик через туннель тоже
# sshuttle -r user@remoteserver 0.0.0.0/0 -vv --dns
(учтите, что если у вас в resolv.conf прописаны провайдерские dns-резолверы, то к ним вас после этой команды могут «не пустить». Впрочем — кто такой херней страдает и оставляет провайдерские dns?)
Используем ssh-ключ для коннекта
# sshuttle -r user@remoteserver 0.0.0.0/0 -vv --dns --ssh-cmd "ssh -i /home/username/.ssh/id_dsa"
Используем ssh-агента для коннекта
# sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" sshuttle -r root@messer.qs.biz 0.0.0.0/0 -vv
Отроутим трафик через ssh только до определенных сетей/хостов
# SSH_AUTH_SOCK="$SSH_AUTH_SOCK" sshuttle -r root@remotehost.tld 188.40.35.183/32 153.121.72.212/32 153.121.72.211/32 173.194.122.0/24 -vv
Да, ещё где-то в недрах «это ж опенсорс!» есть версия, которая умеет роутить вообще весь трафик (и icmp, и весь udp), но она не очень похожа на стабильную. https://github.com/brianmay/sshuttle/tree/tproxy — вот здесь (это НЕ апстрим проекта).
ssh-cmd
Можно например так - проброс через несколько хостов
sshuttle -r user@10.245.56.195 10.236.0.0/14 -vv --dns --ssh-cmd "ssh -F /Users/mmazur/ssh_config -vv"
Тут фокус в том что
- За счет строки конфига
ProxyJump citadel.some-domin.tld,osbastion.some-domin.tldподключение к хосту10.245.56.195будет идти через два джамп-хоста, после чего сеть 10.236.0.0/14 будет доступна уже через это соединение - подключение к osbastion.some-domin.tld происходит через ProxyJump citadel.some-domin.tld
Host *some-domin.tld
User mmazur2
ForwardAgent yes
Host osbastion.some-domin.tld
Hostname 10.252.13.102
ProxyJump citadel.some-domin.tld
ServerAliveInterval 3600
DynamicForward 127.0.0.1:6666
Host ssh.some-domin.tld
Hostname 10.252.12.6
Host 10.245.56.* 10.245.57.* 10.245.58.* 10.245.59.* 10.245.60.* 10.34.187.*
ForwardAgent yes
ProxyJump citadel.some-domin.tld,osbastion.some-domin.tld
StrictHostKeyChecking no
User mcc-user
IdentitiesOnly yes
IdentityFile ~/path/to/ssh.key
UserKnownHostsFile /dev/null
PasswordAuthentication no
GSSAPIAuthentication no
UserKnownHostsFile=/dev/null
Как заворачивается трафик
Никакой (почти) магии - создаются правила файрволла.
Например комманда sshuttle --remote ubuntu@server.com 172.31.0.0/24 -v
- Заворачивает траффик для сети
172.31.0.0/24через серверserver.com
sudo pfctl -a '*' -sr
... пропущено не относящееся к делу ...
anchor "sshuttle6-12300" all {
pass out inet6 proto tcp from any to ::1 flags S/SA keep state
}
anchor "sshuttle-12300" all {
pass out route-to lo0 inet proto tcp from any to 172.31.0.0/24 flags S/SA keep state
pass out inet proto tcp from any to 127.0.0.1 flags S/SA keep state
}
Формат правил такой:
action [direction] [log] [quick] [on interface] [af] [proto protocol] [from src_addr [port src_port]] [to dst_addr [port dst_port]]
actionpassДействие предпринимаемое к подходящим пакетам, либо pass, либо block. Действие pass будет пропускать пакеты в ядро для дальнейшей обработки, в то время как действие block будет реагировать так – как указано в опции block-policy. Значение по умолчанию которой можно изменить на block drop или block return.
direction out Направление движения пакета через интерфейс, либо in, либо out.
log - отсутвует, без логгирования
quick - отсутвует, отсутвие этой опции означает что дальнейшие правила будут обработаны
route-to lo0 Для этого у правила pass есть опция route-to (Interface [Gateway]). Указывает, куда отправлять трафик, прошедший по этому правилу. (
af inet Предположу что AF == Address Family, ip или ipv6 (inet / inet6)
proto protocol proto tcp
from src_addr [port src_port] from any "откуда угодно", порт опущен что означает "любой порт"
to dst_addr [port dst_port] to 172.31.0.0/24
flags S/SA keep state