|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 12 Jan 2005 02:54:25 To : All Subject : ICMP errors & NAT -------------------------------------------------------------------------------- Привет! Вопрос на тему "что должен делать NAT и чего он делать не должен". Возьмем простую схему: H-...-B-L-R-...-G-...D Здесь H - хост в публичном интернете, B - пограничный роутер автономной системы AS, в которую входит все, что правее B. Многоточие между ними - путь в интернете от H до B, он нас не интересует. L - локальная сеть в системе AS на реальных адресах, R - внутренний маршрутизатор с NAT. Все что правее его - сеть на приватных адресах, включающая хост D, а G - один из маршрутизаторов на пути от R до D, у всех таких роутеров G только серые адреса. У D кроме серого адреса есть и отдельный реальный, трафик на этот реальный адрес приходит извне на R, который его транслирует в серый адрес D (команда redirect_address для natd). Пусть теперь хост H запускает traceroute на реальный адрес машины D. Пока пакеты идут вплоть до R, система H получает нормальную трассировку маршрута. Что получается на следующем после R хопе? Пакет от H из-за redirect_address транслируется и попадает на первый из роутеров G, который обнаруживает, что TTL уже ноль, прибивает пакет, генерирует новый пакет ICMP error и посылает его от своего собственного серого адреса в сторону H. Этот ICMP-пакет попадает снова на R и обрабатывается NAT'ом. natd в FreeBSD 3.x и более старых, а также ранних версий 4.x транслировал адрес источника в таком пакете и если в конфигурации не сказано иного, пакет уходил в интернет с адресом источника, заданным аргументом -a или -n, то есть со стандатным alias address. В результате H видел в трассировке маршрута несколько строк с одинаковыми адресами - столько, сколько маршрутизаторов G между R и H. Потом кто-то написал PR и в результате поведение natd (точнее, libalias) изменили - он перестал транслировать исходящие ICMP errors и последние версии 4.x и в пятерке такие ICMP-пакеты уходят в публичный интернет с приватным адресом источника. В свое время при переходе с 3.5 сразу на середину ветки 4.x это изменение мне не понравилось и я сделал патч для libalias, восстанавливающий старое поведение, с которым успешно прожил больше двух лет. Hе понравилось это изменение во-первых, потому что структура внутренней сети становится видна хостам вне автономной системы. Во-вторых, потому что серые адреса часто режутся в публичном интернете (и это правильно), поэтому трассировка будет в соответствующих строчках вместо серых адресов рисовать звезды и тормозить. А со старым поведением просто рисуется несколько строк с одинаковым адресом и не тормозит. Hо в этом случае имеем один минус. Хосты в сети L видят то же самое, что и хост H. Hо сеть L внутри автономной системы и ей можно показывать структуру внутренней сети, а кроме того, серые адреса внутри нее можно не резать. В последнее время этот минус стал сильно мешать. Теперь вопрос к сетевикам - как вы считаете, какое поведение более "правильное" - пропуск исходящих ICMP errors без трансляции или с трансляцией адреса источника? Eugene --- slrn/0.9.8.0 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/26093cf4598d2.html, оценка из 5, голосов 10
|