May 10th, 2014

404

Туннелирование 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 не завернуть, а во-вторых всё-таки внешние интерфейсы будут слегка доступны.