LINUX.ORG.RU
решено  
nixtrian

[nat][iptables][routing] Интересная задачка


0

1

Есть сервер с линуксом на борту. С eth0 10.34.34.2/30 смотрящим во внешнюю (будем приближенно называть ее "корпоративной") сеть и интернет; и eth1 10.34.8.1/25 смотрящим во внутреннюю сеть. На роутере "корпоративной" сети прописано, что моя сеть 10.34.8.0/25 доступна через 10.34.34.2. Админ "корпоративной" сети предлагает настроить у себя нат (для выпускания всего этого дела в инет) только для 10.34.8.0/25.

Натить надо только то, что выходит в инет. По остальной части "корпоративной" сети пакеты должны путешествовать с "родными" адресами.

Вопрос: как мне получить доступ к сети интернет с самого сервера с линуксом? Ведь пакеты, уходящие на корпоративный роутер с адреса 10.34.34.2 натиться в инет не будут. То есть, например, как-то "снатить" уходящие с самого сервера пакеты чтобы они уходили во вне с адресом отправителя из подсети 10.34.8.0/25 ?

ЗюЫю Есть и другое решение: нат у админа "корп." сети настраивается для адреса 10.34.34.2 и я у себя сам начу при помощи

iptables -t nat -A PREROUTING -d $some_external_corporate_network -j MARK --set-xmark 0x1
iptables -t nat -A PREROUTING -d $yet_another_external_corporate_network -j MARK --set-xmark 0x1
iptables -t nat -A POSTROUTING -o eth0 -s 10.34.8.0/25 -m mark ! --mark 0x1 -j SNAT --to-source 10.34.34.2
только то, что не имеет отношения к "корпоративной" сети, то есть то, что идет в инет.


[#]  
guilder

рисуйте ибо епонятно

* ()
[#] Ответ на: комментарий от guilder 10.02.2011 23:56:08  
nixtrian

Вопрос имеет отношение только к системе с 2 интерфейсами и устройству NATа линукса. Все остальные дела за пределами данного линуксошлюза интересовать не должны. Достаточно знать, что 1) где-то дальше по пути следования пакеты идущие с адресов 10.34.8.0/25 в инет натятся 2) подсеть 10.34.8.0/25 смаршрутизирована через 10.34.34.2

* ()
[#] Ответ на: комментарий от nixtrian 11.02.2011 0:03:42  

Что-то как-то запутанно немного.
Попробую воспроизвести условия задачи своими словами:

На Вашем роутере два сетевых интерфейса:
eth0:10.34.34.2/30 - в корпоративную сеть
eth1:10.34.8.1/25 - в свою сеть.

При этом "провайдер" корпоративной сети знает про сеть 10.34.8.0/25 и умеет роутить пакеты на неё через 10.34.34.2/30 (eth0 на роутере)

Корпоративная сеть описывается как 10.0.0.0/8

Задача:
1) Необходимо, чтобы пакеты, идущие транзитом, проходили без изменений.
2) Необходимо, чтобы пакеты с роутера, идущие на корпоративную сеть (10.0.0.0/8), имели source address как 10.34.34.2
3) Необходимо, чтобы пакеты с роутера, идущие на любые адреса не из корпоративной сети, имели source address равный 10.34.8.1

Я правильно понял?

**** ()
[#] Ответ на: комментарий от Slavaz 11.02.2011 0:22:02  
nixtrian

Собственно наиболее коротко мой вопрос может звучать так:

как подменить адрес исходящего пакета? ведь таблица nat с ее цепочкой POSTROUTING в которой есть цель SNAT действует только на транзитные пакеты.

* ()
[#] Ответ на: комментарий от nixtrian 11.02.2011 0:58:39  

Есть ещё цепочак OUTPUT в таблице nat, в ней и подменяйте

**** ()
[#] Ответ на: комментарий от Slavaz 11.02.2011 10:36:33  
nixtrian

Хотя минуточку.. ман гласит, что target SNAT is only valid in the nat table, in the POSTROUTING chain.

да и dmesg говорит

x_tables: ip_tables: SNAT target: used from hooks OUTPUT, but only usable from POSTROUTING

* ()
[#] Ответ на: комментарий от nixtrian 11.02.2011 11:47:56  

nixtrian> Хотя минуточку.. ман гласит, что target SNAT is only valid in the nat table, in the POSTROUTING chain.

              nat:
                  This table is consulted when a packet  that  creates  a  new
                  connection  is encountered.  It consists of three built-ins:
                  PREROUTING (for altering packets as soon as they  come  in),
                  OUTPUT  (for altering locally-generated packets before rout‐
                  ing), and POSTROUTING (for  altering  packets  as  they  are
                  about to go out).

***** ()
[#] Ответ на: комментарий от sdio 11.02.2011 20:52:33  
nixtrian

Спасибо. Насколько я правильно понял (хотя отнюдь не сразу), суть реплая в том, что POSTROUTING относится не только к транзитным пакетам. Так что можно в моем случае успешно использовать правило

iptables -t nat -A POSTROUTING -o eth0 -s 10.34.34.2 -j SNAT --to-source 10.34.8.1
* ()
[#] Ответ на: комментарий от nixtrian 13.02.2011 1:30:40  
nixtrian

есть еще предположение, что можно решить это при помощи iproute2.

ip route add default dev eth0 src 10.34.8.1

Как думаете, а?

* ()
[#] Ответ на: комментарий от nixtrian 11.03.2011 23:56:51  
nixtrian

да. конечно же via в том числе

ip route add default via 10.34.34.1 dev eth0 src 10.34.8.1

P.S. Проверил. Таким образом оно действительно работает.

* ()