LINUX.ORG.RU
ФорумAdmin

[iptables] Организовать NAT

 


0

2

Дистрибутив - Debian

Сначала такой вопрос: есть ли другие способы организовать NAT кроме iptables?

К eth1 подключён ноутбук с виндой кросс-кабелем.

C ppp0 идёт Интернет. Адрес - 94.29.109.53

Задача организовать NAT.

Делаю:

sudo iptables -t nat -D POSTROUTING -o eth1 -j SNAT --to-source 94.29.109.53
Интернет на ноутбуке после выполнения команды так и не заработал. Что я делаю неправильно? И ещё. Я из руководств так и не понял в каких файлах находятся те таблицы, которые редактирует iptables.

★★★★★

>есть ли другие способы организовать NAT кроме iptables?

нет.

Интернет на ноутбуке после выполнения команды так и не заработал.


ip routing включен?


в каких файлах находятся те таблицы, которые редактирует iptables.


ни в каких. iptables - это userspace тулза для управления сетевым стеком ядра.

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

>... в каких файлах...

правила iptables можно сохранять в файлы(скрипты)

dreamer ★★★★★
()
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

Например, так (если внутренняя сеть 192.168.1.x).

Igron ★★★★★
()

возможно, это просто описка ТС

Да, это описка. Просто из терминала скопировал не то, изначально давал команду:

iptables -t nat -A POSTROUTING -p all -o eth1 -j SNAT --to-source 94.29.109.53
или команду
iptables -t nat -A POSTROUTING -p all -o eth1 -j MASQUERADE
Всё равно не работает.

ip routing включен?

В смысле

route add -net 0.0.0.0 netmask 0.0.0.0 gw 94.29.109.53 dev ppp0
Да, конечно.

echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE Например, так (если внутренняя сеть 192.168.1.x).

Вечером попробую. А чем отличаются ключи -o eth1 от -s 192.168.1.0.24? По сути то дело это одна и та же сеть.

sunny1983 ★★★★★
() автор топика

>Я из руководств так и не понял в каких файлах находятся те таблицы, которые редактирует iptables.

iptables записывает правила прямо в ядро. Есть iptables-save и iptables-restore для переноса правил Ядро <-> файл. В разных дистрибутивах файл, в котром хранятся правила, записываемые в ядро при начальной загрузке, находится в разных местах.

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

>iptables -t nat -A POSTROUTING -p all -o eth1 -j MASQUERADE

-o - это _выходной_ интерфейс. Т.е. должен быть -o ppp0.
Как-то так:

iptables -t nat -A POSTROUTING -p all -o ppp0 -s $NOTEBOOK_IP -j MASQUERADE

redgremlin ★★★★★
()

Вы делаете SNAT не на том интерфейсе.
При таком раскладе, у вас во всех пакетах посылаемых с интерфейса eth1 заменится адрес источника и получится хрень какая-то.

Идея SNAT, в том, чтобы пакеты посылаемые в интернет (ppp0) посылались с правильным адресом источника. Если не делать SNAT (и включить форвардинг), то в интерфейс ppp0 отправится пакет с адресом источника 192.168.0.0/24. Удалённому роутеру такое поведение явно не понравится (ожидается 94.29.109.53) и пакет будет с большой вероятностью дропнут.

Рекомендую примерно такую конфигурацию:

iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source 94.29.109.53
# Или -j MASQUERADE если адрес меняется
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -P FORWARD -j DROP

Впринципе достаточно первой строчки. И конечно нужно включить форвардинг (выше писали)

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

На лоре столько таких топиков, давно пора этот вопрос прикрепить.

Помню, я вроде тоже создавал такой топик )

Gordon01 ★★
()

Понял-понял. Я перепутал -o и -i
То есть если я делаю
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
будут маскарадиться все пакеты, направляемые в ppp0. Вечером попробую.
Дальше: а как сделать, чтобы маскарадились только пакеты, направляемые с eth0? -i eth0 я указать не могу, потому что параметр -i недопустим в цепочке POSTROUTING, как сказано в руководстве.

И ещё. Если адрес динамический, можно чтобы вместо -j MASQUERADE было что-то вроде -j SNAT --to-source $PPP0_IP. Как сделать чтобы создавалась переменная $PPP0_IP?

Дальше. Это было правило для исходящего трафика. А для входящего тоже нужно? Чтобы у пакетов, идущих из Интернета на ноутбук адрес менялся обратно с 94.29.109.53 на 192.168.1.2.

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

> Дальше: а как сделать, чтобы маскарадились только пакеты, направляемые с eth0? -i eth0 я указать не могу, потому что параметр -i недопустим в цепочке POSTROUTING, как сказано в руководстве.

Именно по этому делай общий маскарадинг, а фильтруй пакеты в FORWARDING где разрешены -i и -o

И ещё. Если адрес динамический, можно чтобы вместо -j MASQUERADE было что-то вроде -j SNAT --to-source $PPP0_IP.


Если у тебя не первый пенёк или не высоконагруженный сервер, которому надо натить сотни трафика, то используй MASQUERADE и не парься. Если будешь использовать SNAT, то тебе придётся использовать какие-нибудь методы, которые будут менять это правило каждый раз при изменении IP.

Как сделать чтобы создавалась переменная $PPP0_IP?


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

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

>Дальше: а как сделать, чтобы маскарадились только пакеты, направляемые с eth0?

С помощью -s же.

Как сделать чтобы создавалась переменная $PPP0_IP?


В скрипте запуска iptables добавляешь
PPP0_IP=`ip addr sho dev ppp0 | grep inet | awk '{ print $2 }'`

Дальше. Это было правило для исходящего трафика. А для входящего тоже нужно? Чтобы у пакетов, идущих из Интернета на ноутбук адрес менялся обратно с 94.29.109.53 на 192.168.1.2.


Если я правильно понял, то не нужно, само подставится.

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

>Дальше: а как сделать, чтобы маскарадились только пакеты, направляемые с eth0?

А зачем? разреши проходить в таблицу форварде только пакеты с eth0 - и вот тебе профит!

iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT

как-то так... ну и про умолчальную политику DROP не забудь....

а вообще, настоятельно рекомендую осилить(желательно полностью) http://www.opennet.ru/docs/RUS/iptables/

Когда я прочел этот документ у меня отпали 99,9% всех вопросов по работе iptables

Pinkbyte ★★★★★
()

Ну, осиливание столь адской штуковины может придти только с опытом. Если посмотреть таблицу прохождения пакетов, то видно что цепочка POSTROUTING находится в самом конце, после неё пакеты уходят в сеть. Так я не понимаю, что тут можно фильтровать?

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
При таком раскладе будут маскарадиться все пакеты, следующие в ppp0, то есть не только транзитные, но и пакеты от локальных процессов, что мне явно не надо. А если что-то фильтровать в FORWARD, который находится перед POSTROUTING, то пакеты не будут доходить до POSTROUTING и в Интернет стало быть тоже не попадут, стало быть всё работать перестанет. Если я что-то понял неправильно, пожалуйста, объясните что не так.

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

> цепочка POSTROUTING находится в самом конце
На самом деле там ещё есть цепочка из таблицы raw :) Правда на момент написания документа её ещё видимо не было.

Так я не понимаю, что тут можно фильтровать?

Фильтровать в таблице nat не желательно. Для этого есть таблица filter

но и пакеты от локальных процессов, что мне явно не надо

У пакетов сгенерированных локально ничего не изменится. Как был адрес отправителя, таким и остался.

А если что-то фильтровать в FORWARD, который находится перед POSTROUTING то пакеты не будут доходить до POSTROUTING и в Интернет стало быть тоже не попадут,

Если они не пройдут FORWARD то до POSTROUTING они не доживут, да.

стало быть всё работать перестанет.

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

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

Под фильтрацией обычно понимается DROP, REJECT, ACCEPT

Nao ★★★★★
()
У пакетов сгенерированных локально ничего не изменится. Как был адрес отправителя, таким и остался.

А порт? Сказано же в руководстве:

Если диапазон портов не задан, то исходные порты ниже 512 перекартируются в диапазоне 0-511, порты в диапазоне 512-1023 перекартируются в диапазоне 512-1023, и, наконец порты из диапазона 1024-65535 перекартируются в диапазоне 1024-65535.

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

> А порт? Сказано же в руководстве:
Честно говоря никогда не задумывался об этом.
Логично было бы предположить что NAT не выполняется если адреса до и после изменения равны, но я не знаю наверняка, нужно проверить...

Лично я всегда когда делаю SNAT прописываю явно что если адрес -s такой же как на интерфейсе, то натить не надо. Возможно зря :)

Сейчас проверил. при простом MASQUERADE всего выходного интерфейса порт 13 остался 13. 12345 тоже самое.

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

Что Вы голову морочите. Делаем

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE

и все будет нормально.

NAT - это не тупая замена адреса источника, это по сути новый сокет. Сокет поднимается не каждым пакетом, а только новым. И сокет определяется 3-мя вещами, протоколом, хостом и портом. У каждого хоста свои свободные порты. Естественно вместе с адресом источника поменяется и порт и ответы пойдут на этот порт, на каждое соединение - свой порт. И NAT знает, что все что пришло на этот порт нужно вернуть взад (адрес и порт назначения).

Причем если POSTROUTING (в последнюю очередь через NAT), то ответы - в первую очередь попадут в NAT, ну и для PRE наоборот.

А фильтрация в цепи FORWARD.

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

Да, к предыдущему, MASQUERADE от SNAT отличается только тем, что первый вычисляет IP интерфейса, опять же не на каждый пакет, а на каждое новое соединение, поэтому, для дома, с одной машиной за НАТом, разницы не заметите.

lvi ★★★★
()

Пришёл домой, проделал всё что мне советовали, интернет на ноутбуке так и не заработал. Чешу репу.

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

Вывод iptables-save , cat /proc/sys/net/ipv4/ip_forward и ifconfig в студию.

edigaryev ★★★★★
()
sunny@sunny-desktop:~$ sudo iptables-save
# Generated by iptables-save v1.4.2 on Thu Aug 12 19:15:02 2010
*filter
:INPUT ACCEPT [8041:744408]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [8122:631100]
COMMIT
# Completed on Thu Aug 12 19:15:02 2010
# Generated by iptables-save v1.4.2 on Thu Aug 12 19:15:02 2010
*nat
:PREROUTING ACCEPT [6669:384975]
:POSTROUTING ACCEPT [13:1909]
:OUTPUT ACCEPT [301:19848]
-A POSTROUTING -o ppp1 -j MASQUERADE 
COMMIT
# Completed on Thu Aug 12 19:15:02 2010
sunny@sunny-desktop:~$ cat /proc/sys/net/ipv4/ip_forward
0
sunny@sunny-desktop:~$ sudo ifconfig
eth0      Link encap:Ethernet  HWaddr 00:25:11:23:29:60  
          inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::225:11ff:fe23:2960/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:41633 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14882 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:28444259 (27.1 MiB)  TX bytes:1552897 (1.4 MiB)
          Interrupt:252 Base address:0x8000

eth1      Link encap:Ethernet  HWaddr 00:02:44:06:65:6c  
          inet addr:10.10.10.1  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::202:44ff:fe06:656c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:544 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:42673 (41.6 KiB)  TX bytes:12189 (11.9 KiB)
          Interrupt:19 Base address:0xec00 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:100 (100.0 B)  TX bytes:100 (100.0 B)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:95.165.97.80  P-t-P:95.165.96.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:14663 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14769 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:1725173 (1.6 MiB)  TX bytes:1161470 (1.1 MiB)
sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Выполните эти команды:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -D POSTROUTING 1
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE

edigaryev ★★★★★
()

Заработало. Стало быть дело в /proc/sys/net/ipv4/ip_forward, то есть неправильно настроено ядро? А что я могу сделать чтобы ядро настраивалось правильно при каждой загрузке?

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

Не только в этом, а еще в:

...
-A POSTROUTING -o ppp1 -j MASQUERADE
...
ppp1 — у вас нет такого интерфейса.

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

А IP ноута в сети 10.10.10.0?, 10.10.10.1 пингуется с ноута?, 10.10.10.1 прописан шлюзом на ноуте?

Что-то подозрительно мелкая статистика.

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