Назад | Перейти на главную страницу

OpenBSD pf - реализация эквивалента DNAT iptables

Укороченная версия

Сервер A (OpenBSD 4.7) подключается к серверу B (Windows). IP сервера B меняется. Сервер A должен иметь возможность подключаться к серверу B как по старому, так и по новому IP. Мы не можем настроить несколько IP-адресов на сервере B.

Длинная версия

У нас есть сервер OpenBSD, действующий как точка доступа (правила ssh + authpf), к которой подключаются внешние клиенты, а затем открывают соединение с сервисом на другом внутреннем сервере. IP внутреннего сервера будет изменен.

Чтобы дать нам больше времени на перенастройку всех клиентов для использования нового IP-адреса, я подумал, что мы можем реализовать эквивалент DNAT в окне OpenBSD. Если бы это был Linux, я мог бы использовать следующее правило DNAT, которое позволяет мне подключаться вне из самого бокса в удаленную службу либо на реальном IP (10.68.32.215), либо на новом IP.

$ sudo iptables -t nat -A OUTPUT -d 10.68.99.99 -j DNAT --to-dest 10.68.32.215
$ ssh-keyscan -t rsa 10.68.32.215
# 10.68.32.215 SSH-2.0-OpenSSH_4.3
10.68.32.215 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAy/GCd47aaRkBOu72v9Ysqk48Ngd6budStvdwnvMOTLiYoz6M81cTq7SskWctXx57cz6Ijnv1sbzcmDpFMUsN5vHk+6NxfrLzO0M1zh7UezY54FakgaavSdCiy15vGw/Lifntp5kMKkjgC5o42O+RUVw5iCpR8nsu/2/kR2smcVR1G3R8EunjCZWEptOCHz3Iup7FTMd4Pw/xmt+8u+5ZyHKu+uaLWQl6I12rzLiQJNyMLVdhba54FGiJDFUfcXtgM7cFli6xlrE3dnbboQE/7/cuj/N11QwTvHuU07NtrubefZE1VahWb146ph31blsW5NSiyFwL2I7rxFFoPQMbuQ==
$ ssh-keyscan -t rsa 10.68.99.99
# 10.68.99.99 SSH-2.0-OpenSSH_4.3
10.68.99.99 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAy/GCd47aaRkBOu72v9Ysqk48Ngd6budStvdwnvMOTLiYoz6M81cTq7SskWctXx57cz6Ijnv1sbzcmDpFMUsN5vHk+6NxfrLzO0M1zh7UezY54FakgaavSdCiy15vGw/Lifntp5kMKkjgC5o42O+RUVw5iCpR8nsu/2/kR2smcVR1G3R8EunjCZWEptOCHz3Iup7FTMd4Pw/xmt+8u+5ZyHKu+uaLWQl6I12rzLiQJNyMLVdhba54FGiJDFUfcXtgM7cFli6xlrE3dnbboQE/7/cuj/N11QwTvHuU07NtrubefZE1VahWb146ph31blsW5NSiyFwL2I7rxFFoPQMbuQ==

Наша версия OpenBSD - 4.7, но при необходимости мы можем обновить ее. Если этот DNAT невозможен, мы, вероятно, можем сделать NAT на межсетевом экране по пути.

Ближайшее, что мне удалось сделать на тестовой коробке:

pass out on em1 inet proto icmp from any to 10.68.31.99 nat-to 10.68.31.247

К сожалению, pfctl -s state говорит мне, что nat-to переводит источник IP, пока мне нужно переводить по назначению.

$ sudo pfctl -s state
all icmp 10.68.31.247:7263 (10.68.30.199:13437) -> 10.68.31.99:8       0:0

Я также нашел много упоминаний о правилах, которые начинаются с rdr и включить -> символ для обозначения перевода, но это выглядит так: синтаксис устарел в версии 4.7 и я не могу получить ничего похожего на работу. Попытки реализовать правило перенаправления с новым синтаксисом заканчиваются неудачей:

$ echo match out on em1 to 10.68.31.99 rdr-to 10.68.31.247 | sudo pfctl -f -
stdin:1: rdr-to can only be used inbound

Конечно, поскольку я пытаюсь перенаправить исходящий трафик, изменив указанное выше правило на «проход», тоже не работает.

Текущее состояние

Закончилось применением NAT на межсетевом экране между двумя серверами. Сделал трюк, хотя из академического интереса мне все еще любопытно, возможно ли это в OpenBSD.

Я не совсем уверен, что вы хотите, но я использую что-то вроде этого для перенаправления трафика на другой IP-адрес.

rdr pass on $ext_if proto icmp from any to $OLD_IP -> $NEW_IP

Синтаксис не проверен, но может работать

Что-то подобное работает на FreeBSD


редактировать

После просмотра руководств OpenBSD этот синтаксис может работать:

pass in on $ext_if proto icmp from any to $OLD_IP rdr-to $NEW_IP