LINUX.ORG.RU
ФорумAdmin

Некорректный IP-адрес в строке Last login при подключении по SSH к LXC-контейнеру.

 , , , ,


0

2

Здравствуйте, господа! Всех с наступившим, новым, 2026 годом!

Решил, вот, на праздниках, немного побаловаться с виртуализацией: на железку поставил ALT Virtualization PVE (Proxmox), создал контейнер с ALT Linux, настроил к нему доступ по SSH. Так-то всё работает, всё прекрасно подключается - как извне, так и из локалки, но мозолит глаза при каждом подключении строчка:

Last login: Fri Jan  2 22:10:13 2026 from 192.168.0.1

, в которой адрес 192.168.0.1 никогда не меняется - откуда бы я не подключался. Хотя нет, вру, если в PuTTY вместо example.com указать 192.168.0.136, то адрес последнего входящего меняется на локальный адрес устройства, с которого шло подключение. Вот как бы сделать, чтобы и по example.com адрес менялся?

Внешний IP железки с Proxmox - 12.34.56.78 (привязан к example.com)
Внутренний IP железки с Proxmox - 192.168.0.1
Внутренний IP контейнера - 192.168.0.136

Проброс 22-го порта для SSH делал так:

iptables -A PREROUTING -t nat -p tcp -i vmbr0 --dport 22 -j DNAT --to-destination 192.168.0.136

Что интересно: когда подключаюсь по SSH к самой железке, то адрес, с которого был осуществлён последний вход, меняется и отображается корректно, а вот с контейнером непонятки.

Подскажите, пожалуйста, в чём неправ? Без пол литры не разберусь...


Да ты всё прав, просто proxmox что кластерная штука, в которой при подключении к виртуалке по IP адресу должно работать подключение вне зависимости от того, где эта виртуалка расположена. И особенно, если она вообще в процессе переезда. Поэтому все соединения производятся с IP адреса моста.

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

Не совсем понимаю про что ты. Зашёл на LXC контейнер, но по его IP, т.е. IP контейнера, там виден мой IP, а точнее IP vpn сервера, через который подключен к сети компании, на нём делается NAT.

Контейнер может мигрировать между узлами кластера proxmox, но на каждом узле должна быть доступна сеть (VLAN / Bridge), к которому подключена сеть в LXC контейнере и IP подключающегося в last будет соответствовать клиенту, с которого произошло подключение, без разницы на какую ноду кластера мигрировал контейнер / ВМ.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от Sferg

А зачем? Всё должно спокойно маршрутизироваться. В LXC контейнере задай шлюз, если это должен быть сам proxmox, т.е. IP адрес шлюза - на интерфейсе proxmox - пропиши на сетевом оборудовании маршруты до сети через внешний IP proxmox, т.е. через который он доступен в локальной сети.

Если сети перекрываются - для ВМ / LXC на proxmox поднимай отдельную сеть.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Да, в контейнере указан шлюз - 192.168.0.1, который соответствует внутреннему IP железки с Proxmox:

# ip route show
default via 192.168.0.1 dev eth0 proto static
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.136
Sferg
() автор топика
Ответ на: комментарий от Sferg

Тогда контейнер должен быть доступен по своему IP без всяких NAT.

Маршрут из общей сети пропиши и всё. И bdirge должен быть с внешним интерфейсом proxmox.

Но лучше, чтобы IP узла proxmox был в одной сети для управления. А сеть контейнеров / ВМ в отдельной сети, на отдельном физическом интерфейсе или VLAN.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от Sferg

В протоколе SSH - нет SNI и его нельзя проксировать. Т.е. ты не можешь сделать, что example1.com, example2.com, example3.com указывали на один IP и чтобы при подключении было:

  • ssh example1.com -> ssh 192.168.0.136
  • ssh example2.com -> ssh 192.168.0.137
  • ssh example3.com -> ssh 192.168.0.138

Вот так можно:

  • ssh example1.com -p 22136 -> ssh 192.168.0.136 (22)
  • ssh example2.com -p 22137 -> ssh 192.168.0.137 (22)
  • ssh example3.com -p 22138 -> ssh 192.168.0.138 (22)

На одном внешнем IP делаешь проброс разных портов на соответствующий внутренний IP и 22 порт.

Либо разные внешние IP и стандартный порт 22, либо разные порты.

Либо поднимай VPN сервер, допустим с внутренней DNS зоной, где example1.com, example2.com, example3.com указывают на внутренние IP конкретных контейнеров.

Либо проброс разных портов.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от Sferg

Ещё ты можешь взять одну систему, на которую будет осуществляться подключение по одному SSH порту, но разными пользователями.

И настроить, что если подключаются

  • ssh user1@public_ip -> root@private_ip1
  • ssh user2@public_ip -> root@private_ip2
  • ssh user3@public_ip -> root@private_ip3

Смотри документацию по sshd_config.

Но зайти потом под этими пользователями по SSH на саму систему, где работает переключение, без изменения конфигурации SSH сервера нельзя будет.

Match User user01
    ForceCommand ssh -tt root@192.168.0.136
    AllowTcpForwarding no
    X11Forwarding no
    PermitTTY yes

Match User user02
    ForceCommand ssh -tt root@192.168.0.137
    AllowTcpForwarding no
    X11Forwarding no
    PermitTTY yes

Match User user03
    ForceCommand ssh -tt root@192.168.0.138
    AllowTcpForwarding no
    X11Forwarding no
    PermitTTY yes

Но тут нужна авторизация по SSH ключам, они могут быть разные на первом сервере и втором, но должны быть загружены в SSH агент.

С паролями не пробовал, возможно не заработает. Пробуй, если нужно с паролями, сам.

Либо можешь явно подключаться через jump хост:

ssh root@192.168.0.136 -j user02@public_ip:22
kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от Aceler

Было так:

iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.136 --dport 22 -j SNAT --to-source 12.34.56.78

Но я это удалил, так как вместо постоянного 192.168.0.1 со всех клиентов становилось 12.34.56.78.

Хотелось бы чтобы отображался реальный адрес КЛИЕНТА, а не шлюза.

Sferg
() автор топика
Последнее исправление: Sferg (всего исправлений: 1)
Ответ на: комментарий от NyXzOr

Итак, частично получилось достичь желаемого.

Две строчки:

iptables -A POSTROUTING -t nat -o eno1 -j MASQUERADE
iptables -A POSTROUTING -t nat -o vmbr0 -j MASQUERADE

Заменил на одну:

iptables -A POSTROUTING -t nat -s 192.168.0.0/24 -j MASQUERADE

Теперь, при подключении к контейнеру через мобильный инет, SSH выводит правильный адрес последнего подключенного клиента:

Last login: Sat Jan 3 15:53:42 2026 from 176.15.172.27

Однако! При подключении к контейнеру из локалки:

- с 192.168.0.4 к example.com, получаю это:

Last login: Sat Jan 3 16:05:58 2026 from 192.168.0.1

, хотя адрес ожидался-таки 192.168.0.4!

- с 192.168.0.4 к 192.168.0.136, получаю это:

Last login: Sat Jan 3 16:12:20 2026 from 192.168.0.4

Ну, тут, вроде бы, всё в порядке и ожидаемо.

Sferg
() автор топика
Ответ на: комментарий от NyXzOr

Так работает nat. У тебя example.com это внешний адрес. Если будешь подключаться к внешнему ip, также будет.

btw можно разнести зону example.com между внешними и внутренними сетями, в бинде это из каробки заточено, в каких-то других реализациях возможно придется два отдельных демона поднимать.

anc ★★★★★
()
Ответ на: комментарий от Aceler

Да судя по топику ТС действует исключительно старым дедовским способом под названием «метод тыка» не вникая в суть того, что делают те или иные ключи.

anc ★★★★★
()
Ответ на: комментарий от Aceler

Прежде чем, что-то делать, нужно понять как и что, а не как «Я его слепила из того, что было» и ещё не нужно менять рельеф, пока составляешь карту местности.

kostik87 ★★★★★
()