amarao (amarao_san) wrote,
amarao
amarao_san

Category:

Туннелирование localhost'ов

Задумался о грамотном методе изоляции сети для приложения. Нужно дать доступ к удалённому localhost'у, но не к локальному localhost'у, не к сетевым интерфейсам локально и не к сетевым интерфейсам на удалённой машине.

Первичное - использование namespace'ов. Для проброса портов - форвардинг -L у ssh. Видимо, в обоих случаях это должны быть veth интерфейсы. Одна половинка достаётся "слушать ssh", вторая - приложению в namespace'е.

В принципе, в этой схеме даже не надо что-то городить локально. мы опускаем lo и поднимаем 127.0.0.1 на выданной в namespace veth'ке. Получается один интерфейс с адресом 127.0.0.1, что, вероятнее всего, полностью устроит все программы (хотя, возможно, получим неиллюзорные глюки из-за лежащего lo - хотя, вроде бы, нет).

Дальше мы на второй veth'ке поднимаем что-то типа 127.0.0.2, говорим ssh слушать на нём. (ой, огребу глюков...)

Куда более тонкий и интересный вопрос на ремоте. С тем, что 127.0.0.1 общается с 127.0.0.1 особых проблем нет - для ремоты из-за туннелирования портов это будет не 127.0.0.1, а 127.0.0.1, то есть его локальный локалхост, а не локалхост на удалённом клиенте.

А вот как запретить с такого localhost'а ходить наружу... Ну, iptables понятно. В принципе, даже разумная конструкция:

iptables -t filter -A OUTPUT -s 127.1/8 -d 127.1/8 -j ACCEPT
iptables -t filter -A OUTPUT -s 127.1/8 -j DROP
iptables -t filter -A OUTPUT -d 127.1/8 -j DROP

но всё равно как-то неуютненько.

Альтернативно можно перестать выделываться, сделать простейший tap/tun через ssh. Но вопрос с изоляцией удалённого приложения остаётся. Вгонять его в namespace не хочется - у него есть внешний трафик. Дать ему один интерфейс в namespace, другой вне - не получится.

Сделать парочку veth'ов, заставить слушать программу на втором, а первый в namespace? Наверное, да, что-то такое. Но как-то уж очень остро-избыточно... Элегантный ssh -L 127.1:80:127.1:80 куда симпатичнее. Но его во-первых в namespace не завернуть, а во-вторых всё-таки внешние интерфейсы будут слегка доступны.
Subscribe

  • План действий

    AAA при логине ведёт себя по разному в зависимости от того A это или AAAA.

  • Админский гольф

    Вам выдали шелл на сервер, на котором кто-то удалил все симлинки (т.е. файлы типа "симлинк"). Ваша задача починить сервер. Починенным сервер…

  • продолжая leetcode

    Первый раз я ощутил Силу. Задача - roman numerals, с обещанием, что на входе нет мусора. pub fn roman_to_int(s: String) -> i32 { let mut acc =…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments