
У меня есть sshd: Listen 2222
на сервере, и что я хочу сделать:
ssh -p 2222 userA@ip
, и сервер находит userA
, затем перенаправляет это соединение на 6122
порт этого сервера, но я не хочу изменять на своей локальной машине, потому что есть сотни пользователей, у всех этих пользователей есть свой собственный контейнер docker, например, для пользователя userA
, я запускаю sshd
его контейнер и открываю 22
порт 6122
порту хоста. Поэтому я хочу использовать iptables
или другие способы переадресации Host:2222
на Container:6122
.
Я пробовал команды, подобные приведенным ниже:
iptables -t nat -A userA_rules -p tcp --dport 2222 -j REDIRECT --to-port 6122
iptables -A OUTPUT -m owner --uid-owner userA -j userA_rules
Но это не работает. Я новичок в iptables
, поэтому не уверен, где ошибся. Также я пытался изменить, /etc/ssh/sshd_config
чтобы использовать Match User userA
блок, но у меня тоже не получилось. Буду признателен за любые предложения.
решение1
Модуль владельца iptables работает только с локально сгенерированными пакетами на машине, где они генерируются, а не на удаленном сервере.
https://manpages.ubuntu.com/manpages/focal/en/man8/iptables-extensions.8.html
owner
This module attempts to match various characteristics of the packet creator, for locally
generated packets. This match is only valid in the OUTPUT and POSTROUTING chains.
Forwarded packets do not have any socket associated with them. Packets from kernel threads
do have a socket, but usually no owner.
Но этот UID/GID недоступен за пределами сервера.
Iptables работает с сетевыми пакетами TCP/IP. У пакетов есть порт назначения IP, порт источника и порт источника, но нет свойства, которое говорит: они были сгенерированы пользователем freshzy
или UID #123 на исходной машине. Поэтому iptables на удаленном сервере просто не имеет информации, чтобы сделать то, что вы хотите, чтобы он сделал; создать правило для одного пользователя с удаленной машины.