Вопрос или проблема
У меня есть выделенный сервер с установленной Ubuntu 14.10.
Сервер должен подключаться к серверу OpenVPN, и весь трафик должен проходить только через VPN, кроме SSH-трафика.
Моя идея заключается в том, чтобы реализовать это с помощью iptables
, но я не специалист.
Что именно нужно обработать с помощью iptables
?
Предположим, что ниже указаны основные условия:
-
Разрешить только трафик через VPN. Когда мой сервер теряет соединение с VPN, не должно быть утечек трафика.
-
Разрешить SSH без VPN. Я хочу подключаться к своему серверу по SSH и его обычному IP-адресу от провайдера (но только SSH-трафик).
-
Поскольку я не единственный пользователь VPN, я хочу скрыть свой сервер в VPN от других компьютеров.
Я начал создавать свои правила iptables
, но они постоянно блокируют все мои соединения:
# очистить старые правила
iptables -F
# разрешить SSH-трафик без подключения к VPN
iptables -A INPUT -d X.X.X.X -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s X.X.X.X -p tcp --sport 22 -j ACCEPT
# заблокировать все, кроме моих правил
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# разрешить локальную петлю
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# разрешить VPN
iptables -A INPUT -j ACCEPT -p udp -s Y.Y.Y.Y --sport 1194
iptables -A OUTPUT -j ACCEPT -p udp -d Y.Y.Y.Y --dport 1194
X.X.X.X – это IP-адрес сервера от провайдера.
Y.Y.Y.Y – это IP-адрес VPN-сервера.
Правила всегда выбивают меня из текущего SSH-соединения, и я не могу создать новое SSH-соединение, хотя оно должно принимать трафик через порт 22.
Имейте в виду, что в вашем параметре -d, если вы хотите применить его ко всем адаптерам, просто не используйте этот параметр, например
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ИЗМЕНЕНИЕ:
Разрешить только трафик через VPN. Когда мой сервер теряет соединение с VPN, не должно быть утечек трафика.
Это должно быть предусмотрено вашим приложением VPN. Например, PIA (Private Internet Access) называет это Kill Switch, вы просто можете включить это в приложении.
Разрешить SSH без VPN. Я хочу подключаться к своему серверу по SSH и его обычному IP-адресу от провайдера (но только SSH-трафик).
Что ж, это противоречит Kill Switch выше.
Как пользователь VPN, я решил эту проблему, не подключаясь к его локальному IP, скажем, 192.168.0.xxx, а к его публичному адресу и разрешив конкретный порт для моего сервера, вместо использования 22, потому что у меня дома несколько серверов, так что вы тоже можете подумать об этом. Это также означает, что вам нужно будет перенаправить этот порт с вашего роутера на этот сервер и создать правило iptables
для этого порта.
Поскольку я не единственный пользователь VPN, я хочу скрыть свой сервер в VPN от других компьютеров.
Поскольку вы не описали свою среду, я могу только сказать, что я бы отключил некоторые службы, такие как samba
и т.д.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Согласно странице man:
--sport - это сокращение для --source-port --dport - это сокращение для --destination-port
В вашем случае, я думаю, вам следует использовать только опцию --dport
.
Если вы беспокоитесь об утечках, а не просто о том, чтобы сделать данные доступными только через VPN, то самым безопасным способом сделать это является использование отдельных машин. Машина, на которой работает openvpn и ssh, должна быть единственной, которая напрямую подключена к интернету; остальные должны использовать частный адрес и использовать прокси или шлюз через эту машину.
Таким образом, если вы что-то неправильно настроите, например, DNS, это просто даст сбой, а не пройдет через неправильную сеть. Вы можете достичь этого с помощью виртуальных машин, если не хотите физических. Но у ВМ также есть большая поверхность атаки… взломанная виртуальная машина может легче использовать уязвимость, чтобы добраться до хоста, чем другая машина в сети.
Здесь несколько вопросов.
Во-первых, вам нужно разрешить еще несколько вещей.
- Трафик через VPN. Это будет конкретное именованное устройство или класс именованных устройств. Если VPN работает, вы должны увидеть его в выводе команд
ip link
илиifconfig
. В противном случае это выглядит как ваши «разрешить локальную петлю» записи. - Связанные пакеты. Это позволяет ICMP-сообщениям проходить для ваших соединений.
Вероятно, будет лучше разрешить, в первом правиле, установленные соединения. Это ускоряет тестирование. В сочетании со вторым пунктом выше, это будет:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Это также имеет преимущество в том, что оно предотвратит отключение вашего существующего SSH-соединения.
Во время тестирования не устанавливайте правила политики, пока всё не станет работать.
Также добавьте правило LOG, чтобы записывать то, что не принимается:
iptables -A INPUT -j LOG
iptables -A OUTPUT -j LOG
Вы увидите этот вывод в консоли, через dmesg и через системный журнал. Эти правила не нужны, когда всё работает. (Но они могут показать вам, насколько вы подвергаетесь атаке.)
Как только вы сможете создать новое SSH-соединение, не получая никаких записей, тогда пора установить правила политики.
Единственное, что вам может понадобиться сделать, это аккуратная работа с маршрутизацией. Если VPN предназначен для интернета в целом (что не невозможно), тогда исключения для SSH и VPN могут стать сложными. Ваше программное обеспечение VPN должно документировать или обрабатывать это для вас.
Ответ или решение
Для эффективного управления подключениями к вашему серверу с Ubuntu 14.10 через iptables
с целью разрешить только SSH и VPN трафик, прежде всего, необходимо учитывать несколько ключевых аспектов.
Общая структура правил iptables
-
Флешинг старых правил: Начнем с очистки предыдущих правил, чтобы избежать конфликта с существующими настройками.
iptables -F
-
Добавление основных правил:
- Разрешить входящие и исходящие соединения, относящиеся к уже установленным соединениям (это позволит вашему текущему SSH-сессии функционировать нормально):
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- Разрешить учетные записи через SSH (22 порт). Здесь важно не указывать конкретный IP-адрес сервера, чтобы не потерять возможность доступа:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
Настройка VPN: Вам нужно разрешить трафик по протоколу VPN. Обычно OpenVPN использует UDP, но это можно уточнить, если ваш VPN использует другой протокол.
iptables -A INPUT -p udp --dport 1194 -j ACCEPT iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT
-
Разрешение локального трафика: Следует разрешить трафик в пределах сервера для локальных соединений.
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
-
Блокировка всего остального трафика: После того как все нужные правила добавлены, можно установить политику по умолчанию для блокировки всего остального трафика:
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
Обратите внимание на:
-
Требования к безопасности VPN: Убедитесь, что ваш VPN клиент настроен для использования Kill Switch, чтобы предотвратить утечки трафика, когда соединение с VPN прерывается. Это может быть реализовано через конфигурацию клиента OpenVPN.
-
Проверка состояния VPN: Убедитесь, что устройства VPN отображаются с помощью команды
ip link show
илиifconfig
, чтобы убедиться, что ваши правила работают корректно. -
Логирование: В процессе отладки будет полезно включить логирование, чтобы видеть, какой трафик блокируется:
iptables -A INPUT -j LOG --log-prefix "iptables-input: " iptables -A OUTPUT -j LOG --log-prefix "iptables-output: "
Это поможет вам отслеживать все входящие и исходящие пакеты, которые блокируются, в файлах логов системы, тем самым вы сможете корректировать ваши правила в дальнейшем.
Тестирование и адаптация правил
Перед установкой жестких правил, тестируйте каждое изменение по отдельности. Не устанавливайте политику по умолчанию, пока не убедитесь, что можете без проблем подключаться через SSH.
Это количество правил даст вам гибкость и безопасность, а также защитит ваш сервер от нежелательного трафика, не облегая при этом необходимое управление через SSH.
Заключение
С помощью предложенных правил вы сможете настроить ваш сервер так, чтобы разрешить только SSH и VPN трафик. Убедитесь, что вы тестируете изменения на рабочем сервере в безопасной среде, чтобы избежать потери доступа к системе. Ваша безопасность и контроль над трафиком должны быть в приоритете, и подход с использованием iptables
является мощным инструментом для достижения этой цели.