LINUX.ORG.RU
решено ФорумAdmin

Маршрутизация и NAT для отдельных адресов


0

1

В общем, ситуация такая. Есть провайдер со своей локальной сеткой. Доступ в интернет в основном происходит через NAT, но есть возможность арендовать статический внешний адрес, что я и сделал. Дома стоит системник, выполняющий функцию NAT для домашней сети. Решил я в локальную сеть выходить без NAT, и попросил провайдера выделить подсеть локальных адресов и смаршрутизировать её на внешний интерфейс системника. Дома адреса назначил из выделенного диапазона, NAT прописал в iptables чтобы работало только для внешних адресов. А вот внутри локалки трафик не маршрутизируется. Точно проблема у меня, так как пробовал трассировку по одному из выделенных адресов от друга, подключённого к этому же провайдеру - они приходят на внешний интерфейс - а дальше не проходят. Что я сделал не так? Вот правила таблицы NAT iptables:

root@anime:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N locals
-A POSTROUTING -o eth0 -j locals
-A locals -d 10.0.0.0/8 -o eth0 -j RETURN
-A locals -d 172.16.0.0/12 -o eth0 -j RETURN
-A locals -d 192.168.0.0/16 -o eth0 -j RETURN
-A locals -o eth0 -j SNAT --to-source <внешний_IP_адрес>

Таблица маршрутизации:

root@anime:~# netstat -rn
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 <IP_шлюза_провайдера> 0.0.0.0 UG 0 0 0 eth0
<адрес_подсети_белых_адресов> 0.0.0.0 255.255.255.252 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
192.168.115.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1

Выданная мне подсеть локальных адресов - 192.168.115.0/24

######################### REAL IPS ##########################################
/sbin/iptables -t nat -A POSTROUTING  -s REAL_IPS_SUBNET/24 -j  ACCEPT
/sbin/iptables -t nat -A POSTROUTING  -d REAL_IPS_SUBNET/24 -j  ACCEPT
######################### NAT ###############################################
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source IP_ИНТЕРФЕЙСА_КОТОРЫЙ_СМОТРИТ_В_ИНЕТ

как то так

xspirit ()
Ответ на: комментарий от xspirit

Вы видимо, не внимательно прочитали вопрос. Мне не нужно NAT'ить подключения ко всем адресам за пределами подсети. По адресам 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12 мне нужно чтобы NAT не работал, но работала маршрутизация на тот же интерфейс, через который осуществляется NAT для всех остальных адресов. С NAT'ом проблемы нет: с описанными в первом посте настройками он работает по внешним адресам, а по внутренним - нет, как и положено. Но вот маршрутиазция тоже не работает, и у меня никак не получается её настроить.

В голову закрадываются мысли: не сделано ли специально в линуксе невозможность маршрутизации между адресами приватного и публичного диапазонов?

Mironov ()

Включить маршрутизацию: echo 1 > /proc/sys/net/ipv4/ip_forward Проверить правила таблицы FORWARD, т.к. маршрутизация именно через неё идёт.

gfh ★★★ ()

Я делаю попроще:

-A POSTROUTING -d 10.0.0.0/8 -o eth0 -j ACCEPT
-A POSTROUTING -d 172.16.0.0/12 -o eth0 -j ACCEPT
-A POSTROUTING -d 192.168.0.0/16 -o eth0 -j ACCEPT
-A POSTROUTING -o eth0 -j SNAT --to-source <внешний_IP_адрес>
и оно работает.

berrywizard ★★★★★ ()
Ответ на: комментарий от gfh

/proc/sys/net/ipv4/ip_forward

С этим всё нормально. Без IP-форвардинга даже NAT не работает. В цепочке FORWARD таблицы filter - лишь одно правило:

-P FORWARD ACCEPT

Mironov ()
Ответ на: комментарий от berrywizard

Сделал точно так же. Ничего не изменилось. NAT работает, маршрутизация - нет.

На всякий случай: Это ведь правила таблицы nat?

Mironov ()
Ответ на: комментарий от Mironov

на всякий случай: шлюз на остальных компах какой прописал?

По идее всё должно работать
Пакет проходит PREROUTING - FORWARD - ROSTROUTING и наоборот.

Galant ()
Ответ на: комментарий от Mironov

Еще же на компах пропиши маршруты.
Если они думают что пакет идет в локалку, то пакеты через шлюз не будут засылать.

Galant ()
Ответ на: комментарий от Galant

В качестве шлюза записан IP-адрес сервера внутренней подсети. То есть 192.168.115.1 в моём случае. Я думаю, что если бы он был неправильным, NAT бы тоже не работал.

Есть ли способ отследить прохождение пакета? Чтобы определить, почему он не маршрутизируется.

Mironov ()
Ответ на: комментарий от Mironov

давай еще раз:

какие ип на твоем шлюзе.
какая подсетка провайдера
какие ип и маршруты на остальных твоих компах.

Galant ()
Ответ на: комментарий от Galant

На компах подсеть только 192.168.115.0/24, а я посылаю на адреса, например 192.168.100.200. На такой адрес он посылается на роутер, в трассировке есть только первая строка - ответ моего сервера. А дальше него пакет не идёт. Со стороны внешнего интерфейса наблюдается точно такая же картина: пакет доходит до моего сервера, а внутрь не попадает.

Mironov ()
Ответ на: комментарий от Mironov

В простейшем случае можешь прописать SNAT для каждого твоего компа с соответствующим ip.

Galant ()
Ответ на: комментарий от Galant

На шлюзе два IP: 192.168.115.1/24 и подсетка реальных адресов (адеса изменены, но суть та же): 88.88.88.90/30 Дефолтным (и единственным шлюзом) является 88.88.88.89. Локальными адресами являются 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12 и 88.88.88.0/22. По этим адресам трафик с моих внутренних адресов должен маршрутизироваться. А на все остальные адреса - применяться NAT.

На остальных компах: IP: 192.168.115.2/255.255.255.0 gw 192.168.115.1, 192.168.115.3/255.255.255.0 gw 192.168.115.1 И так далее. Маршрутов явно не задавал, так как всё должно идти на 192.168.115.1 (кроме адресов данной подсети естественно).

Mironov ()
Ответ на: комментарий от Mironov

И что ты хочешь если у тебя на компах внутренние ип?

Если по уму у тебя должно быть так:

на шлюзе
локальный интерфейс: ип например 192.168.1.1
второй интерфейс: ип провайдера 192.168.100.123

на клиенте
ип провайдера 192.168.100.124
ip route add 192.168.1.1 dev eth0
ip route add 192.168.100.0/24 via 192.168.1.1

сам так не делал. могу ошибиться.

Или делай для каждого внутреннего ип свой SNAT на шлюзе

Galant ()
Ответ на: комментарий от Galant

И что ты хочешь если у тебя на компах внутренние ип?

Я хочу, чтобы при отправке пакетов изнутри моей подсети на на адреса из заданных диапазонов, NAT не применялся, а работала маршрутизация. А при отправке на все остальные адреса, работал NAT. Да, адреса внутренние, но поскольку речь идёт о маршрутизации внутри локалки провайдера, ничего неправильного тут нет. Для внешних, интернетовских адресов применяется NAT.

Или делай для каждого внутреннего ип свой SNAT на шлюзе

Как вы предлагаете? Вот так?

iptables -t nat -A POSTROUTING -s 192.168.115.2 -o eth0 -j SNAT --to-source 88.88.88.90
iptables -t nat -A POSTROUTING -s 192.168.115.3 -o eth0 -j SNAT --to-source 88.88.88.90
...
iptables -t nat -A POSTROUTING -s 192.168.115.254 -o eth0 -j SNAT --to-source 88.88.88.90

Зачем так делать, если можно записать одно правило вместо 254?

Mironov ()
Ответ на: комментарий от Galant

Да, 192.168.115.0/24 - это подсетка локальных адресов, выделенная провайдером и смаршрутизированная на адрес 88.88.88.90 моего шлюза.

Mironov ()
Ответ на: комментарий от Mironov

Я просто сначала не понял топологию.
В принципе вроде всё должно работать.

Попробуй поснифить на шлюзе пакеты с помощью tcpdump или tshark.
Достаточно icmp пакеты с отного ип посмотреть и попинговать с него. Что на локальный интерфейс приходит, что уходит с внешнего, и наоборот.

Внутри иптпблес можно делать правило -j LOG чтобы проследить пакет.

Galant ()
Ответ на: комментарий от berrywizard

88.88.88.90 - на eth0, 192.168.115.1 - на eth1.

В общем, спасибо всем кто пытался помочь. В следствии исследования прохождения icmp-пакетов через интерфейс eth0 tcpdump'ом выяснилось, что исходящие пинги на локальные ресурсы провайдеры через интерфейс проходят. Когда попросил потрассировать до 192.168.115.2 другого абонента этого провайдера, выяснилось, что на 192.168.115.2 эти icmp-пакеты приходят, и 192.168.115.2 даже отправляет на них ответ, но ответы не доходят. Предположительно: косяк провайдера, не настроившего фильтрацию по IP и MAC адресам для выделенной подсети на коммутаторе, к которому подключён eth0. Завтра буду звонить, о решении проблемы обязательно сообщу.

Mironov ()
Ответ на: комментарий от Mironov

Проблема решилась. Проблема была у провайдера, не настроившего привязку по MAC на коммутаторе должным образом, из-за чего зарезались исходящие пакеты из подсети 192.168.115.0/24. Всем спасибо за помощь.

Mironov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.