NAT и iptables (Как раздать интернет через вторую сетевую карту)

Дано:
Сетевая карточка eth0 подключенная с помощью PPPoE к интернету и
eth1 подключенная к сети с адресом 192.168.0.1 к которой подключена сеть с адресами 192.168.0.* в которой нужно раздать интернет.

Для начала включим форвардинг:

echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы форвардинг автоматически включался при запуске системы

Открываем файл:

sudo nano /etc/sysctl.conf

и добавляем в него строчку:

net.ipv4.ip_forward = 1

Затем включаем NAT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Где ppp0 название вашего интерфейса через который выходите в интернет.

Чтобы NAT работал после перезагрузки делаем следующее:

сохраняем настройки iptables в файл

sudo iptables-save > /etc/iptables.up.rules

И добавляем в конец файла:

sudo nano /etc/networks/interfaces

эту строчку, для автоматической подгрузке правил

pre-up iptables-restore < /etc/iptables.up.rules

Так же в этот файл добавляем правила роутинга:

up route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1
up route add -net 0.0.0.0 netmask 255.255.255.255 dev eth0

Комментарии (68)

+1
yurmax - 23 Август, 2007 - 04:38
Изображение пользователя yurmax.

ну если еще и ррр0...
тогда так

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT


# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT
iptables -A FORWARD -i ppp0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth1 -o ppp0 -j ACCEPT


# Masquerade.
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i ppp0 -o ppp0 -j REJECT
iptables -A FORWARD -i eth0 -o ppp0 -j REJECT
# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward

0
Гость - 20 Май, 2010 - 21:58

создал файлег, че-та ноут (WinXP)у меня не может подключиться к сети - адрес не назначается,
в командной строке вот чего:
stranger@stranger-desktop:~$ sudo su
[sudo] password for stranger:
root@stranger-desktop:/home/stranger# sh /etc/network/if-up.d/routing.shUsing intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).
root@stranger-desktop:/home/stranger# sh /etc/network/if-up.d/routing.sh start
Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).

Скрипт вот он:

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT

# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! tap0 -j ACCEPT
iptables -A FORWARD -i tap0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth1 -o tap0 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i tap0 -o tap0 -j REJECT
iptables -A FORWARD -i eth0 -o tap0 -j REJECT
# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
интернет - на интерфейсе tap0

0
rrrandom - 4 Декабрь, 2010 - 13:42

Спасибо за пост, очень помог

0
balamutick - 26 Сентябрь, 2011 - 23:46
Изображение пользователя balamutick.

А что ещё прописать в правило, чтобы помимо конкретного интерфейса ещё и через конкретный IP адрес NAT илось ?

0
Flameflower - 27 Сентябрь, 2011 - 08:31
Изображение пользователя Flameflower.

Тогда использовать SNAT вместо MASQUERADE
-j SNAT --to-source $ip
Правда, если у тебя ip динамический то тебе придется каждый раз переписывать сие правило.

0
balamutick - 27 Сентябрь, 2011 - 20:25
Изображение пользователя balamutick.

Не, статичный. Я чуть позже попробую, отпишусь.

+1
yurmax - 23 Август, 2007 - 04:38
Изображение пользователя yurmax.

ЗЫ кидаем этот файлик с любым названием в /etc/network/if-up.d/

0
balamutick - 3 Февраль, 2009 - 21:17
Изображение пользователя balamutick.

Затем включаем NAT
А как выключить NАТ ? Т.е. обратный процесс этому всему.

Т.е. понастраивал я это все себе правил в iptables понаписал, все прекрасно работало и ладно. А теперь "расшаривание интернета не требуется".

Как это всё потереть.

0
DeathMoroz - 4 Февраль, 2009 - 12:13

убери правило iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
и отключи форвардинг

0
balamutick - 4 Февраль, 2009 - 12:34
Изображение пользователя balamutick.

В /proc/sys/net/ipv4/ip_forward прописанную еденичку я убрал.
убери правило iptables
Мне и нужно его убрать. Я не спрашиваю что (я спросил в вопросе)
А как выключить NАТ ? Я не знаю как убрать правило из iptables, и понятное дело man iptables, но потратить 2-3 часа(и не 100%-но что пойму) для одной команды...
Вообщем спрашиваю вопрос однозначно:
Какую команду дать, чтобы из настроек iptables удалить выше прописанные изменения.

Как вариант, вернуть все к исходному состоянию, как например при свежеустановленной кубунте.

+1
DeathMoroz - 4 Февраль, 2009 - 12:42

ну её маё

из консоли: echo 0 > /proc/sys/net/ipv4/ip_forward

из консоли: sudo nano /etc/sysctl.conf

удаляем строку: net.ipv4.ip_forward = 1

из консоли: sudo iptables -F

из консоли: sudo iptables-save > /etc/iptables.up.rules

sudo nano /etc/networks/interfaces - удаляем строки
pre-up iptables-restore < /etc/iptables.up.rules
up route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1
up route add -net 0.0.0.0 netmask 255.255.255.255 dev eth0

все :) это я тупо проделал все действия наоборот :)
iptables -F - удаляет все правила

в итоге будет как свежей кубунте.
файл /etc/iptables.up.rules вероятно будет пустой. и его можно будет удалить

0
balamutick - 4 Февраль, 2009 - 13:30
Изображение пользователя balamutick.

iptables -F - удаляет все правила

man iptables
-F, --flush [chain]
Flush the selected chain (all the chains in the table if none is given). This is equivalent to deleting all the rules one by one.
Как я при беглом чтении не заметил подчёркнутую строку...

Что делает эта строка ? Восстанавливает iptables ?
pre-up iptables-restore &lt; /etc/iptables.up.rules
Точнее, что значит тут pre-up, -пред запуск ?
$ man pre-up
No manual entry for pre-up

0
vimax - 16 Сентябрь, 2009 - 10:36
Изображение пользователя vimax.

pre-up, post-up, pre-down, post-down - очень интересные штуки. Они указывают какие команды нужно запустить до, после включения и отключения интерфейсов.

Например, после поднятия ppp0 можно организовать чтобы автоматом включилась аська, торент начал докачивать порево, амарок включил музон.... ну я думаю мысля ясна.

p.s.

iptables-save - выводит текущие правила фаервола на стандартный вывод: на экран (название обманчивое. эта команда ничего нигде не сохраняет). Сохранять нужно "вручную": сохранить текущие настройки фаера в файл (iptables-save >> /etc/MySuperRules) и потом восстановить их (iptables-restore << /etc/MySuperRules) . После перезагрузки системы, настройки фаера обнуляются и чтобы постоянно не вбивать команды в консоли их впихивают в автозагрузку (правильнее конечно в interfaces pre-up или post-up).

p.s.

А man нужно смотреть не для pre-up, а для interfaces

0
zheny - 27 Апрель, 2009 - 19:00
Изображение пользователя zheny.

По этой команде echo 0 > /proc/sys/net/ipv4/ip_forward выдает вот это bash: /proc/sys/net/ipv4/ip_forward: Permission denied. Что делать не знаю. Пытался открыть этот файл, так он пустой.

0
picaro - 27 Апрель, 2009 - 19:09
Изображение пользователя picaro.

надо из под рута это делать

0
zheny - 27 Апрель, 2009 - 19:13
Изображение пользователя zheny.

надо из под рута это делать
То же самое сообщение выдает.

0
balamutick - 28 Апрель, 2009 - 01:09
Изображение пользователя balamutick.

Значит, рут у вас не правильный !
Шутка :-) Permission denied - доступ запрещён. Почему, вероятно всё таки не из под рута делаете. Или по каким-то причинам, ему нельзя писать\читать в этот файл (но это вы должны были ручками, что-то трогать).

0
picaro - 28 Апрель, 2009 - 16:31
Изображение пользователя picaro.

Не из под sudo, а из под рута:
$ sudo su
# echo 0 > /proc/sys/net/ipv4/ip_forward

0
vimax - 16 Сентябрь, 2009 - 10:59
Изображение пользователя vimax.

"$ sudo command " и "# command" это одно и то же

+4
Гость - 24 Январь, 2010 - 15:04

# command и $ sudo command Это конечто одно и тоже. Но когда делается перенаправдение вывода (">") то оно делается с правами основного пользователя
То есть когда делаешь sudo echo 0 > /proc/sys/net/ipv4/ip_forward то собственно отоборажение единички происходит от рута, а вот помещение ее в файл - от обычного пользователя. По этому и недостаточно прав.
А решить это можно несколькими способами:
sudo su -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
echo 0 > sudo tee /proc/sys/net/ipv4/ip_forward
и тд

0
vimax - 29 Январь, 2010 - 10:36
Изображение пользователя vimax.

спасибо! не знал про перенаправление

+2
vimax - 16 Сентябрь, 2009 - 11:02
Изображение пользователя vimax.

Конечно же это из под рута делается! Вы изменяете настройки ядра.
Настройки хранятся в /etc/sysctl.conf. Для их изменения используется утилита sysctl. И не нужно выдумывать новых путей.

- посмотреть все настройки

sysctl -a

- посмотреть настройки только для одного параметра

sysctl net.ipv4.ip_forward (как всегда для продолжения названия параметра работает наш любимый TAB)

- изменить настройки

sudo sysctl net.ipv4.ip_forward=1

0
Mor - 5 Февраль, 2009 - 22:17

Ip_tables tutorial от PC Magazine (рус.)

ценный труд чувака во благо наше

0
Aule - 29 Июль, 2009 - 12:00
Изображение пользователя Aule.

Выполнил все как тут сказано,но у меня все равно не работает мой бук с XP отказывается видеть "Подключение ограничено или отсутствует"Че делать то?

напишите в асю 559106132

+1
urusha - 29 Июль, 2009 - 12:23
Изображение пользователя urusha.

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

0
Гость - 9 Октябрь, 2009 - 13:38

если необходимо дать полный доступ в Инет только одному из локальных адресов, а все остальные должны работать через прокси (squid - установлен и работает) по HTTP ?

0
vimax - 13 Октябрь, 2009 - 20:35
Изображение пользователя vimax.

Вам нужно настроить фаервол. Воспользуйтесь ufw. Это утилита для управления фаерволом. Сделана специально, чтобы облегчить настройку. Она переводит простые команды в iptables стиль и автоматом их вписывает туда. Почитайте на сайте хелпа убунты, там все очень хорошо описано.
Вам понадобиться включить маскарадинг, чтобы выпускать адреса напрямую. А потом с помощью правил запретить всем доступ к http порту, кроме одного. А стандартный порт сквида (3128) при этом останется открытым. Я так выпускаю компы бухгалтеров с их клиент-банками в инет... Через проксю не работают

0
ramserak - 24 Ноябрь, 2015 - 10:53

Можно подробнее про маскарадинг. Точно такая же ситуация, нужно пробросить бухгалтеров мимо прокси сервера. Можете дать подробную инструкцию для чайника. Систему поднимал не я, теперь приходится разбираться самому. Буду признателен за помощь.

0
dyug - 24 Ноябрь, 2015 - 13:19

сложно подробнее чем уже рассказано, но можно.
iptables -t nat -A POSTROUTING -s 192.168.0.1 -o eth1 -j MASQUERADE

у меня так.
еще можно так
iptables -t nat -A POSTROUTING -s 192.168.46.0/24 -d 195.ххх.хх.хх -o eth1 -j MASQUERADE
если известен ип адрес сервера банка
вариантов много..
/sbin/iptables -t nat -A POSTROUTING -m multiport -p tcp --destination-ports 7002 -s 192.168.0.хх -d хх.хх.хх.84 -o vlan00 -j SNAT --to-source 81.хх.ххх.хх
это реально работающее правило для одного из банков.
где --destination-ports 7002 порт банка
-s 192.168.0.хх ип бухмашины
-d хх.хх.хх.84 ип банка
-o vlan00 интерфейс выхода в интернет
--to-source 81.хх.ххх.хх внешний ип интерфейса выхода
Эта схема работает независимо от алиасов, адресов, и прочего (но все адреса, интерфейсы и порты должны быть реально существующими)

0
urusha - 14 Октябрь, 2009 - 01:31
Изображение пользователя urusha.

man squid.conf, или как-то так. Опишите вашу ситуацию по подробнее (с прокси не по теме пишете).

+1
salt - 29 Май, 2010 - 13:16
Изображение пользователя salt.

Отличная статья про iptables, ufw, маскарадинг
Сам к ней очень часто обращаюсь
http://mirspo.narod.ru/firewall.html
и тут тоже много полезного:
http://www.ab-log.ru/smart-house/linux/source-routing
Раздача интернета

0
sg-333 - 14 Март, 2010 - 17:30
Изображение пользователя sg-333.

Насколько я понял, если я буду таким способом раздавать интернет по wifi то подключиться к сети сможет кто угодно?

0
Fatalist - 17 Март, 2010 - 05:09
Изображение пользователя Fatalist.

Тут зависит от того, как ты точку создаёшь. С паролем или без, с DHCP сервером или без него. Допустим, я создавал точку с паролем и в настройках dhcp сервера указывал, из какого диапазона раздавать адреса. А можно сделать, чтобы адреса автоматом выдавались только для определённых MAC'ов. В общем, много всяких удобств. создавай точку с паролем и тогда можешь быть более-менее спокоен за свой инет)

0
Vorlon - 16 Март, 2010 - 13:18

Пробую обоими способами и ни чего не выходит. На компе с win7 ни в какую не хочет инет появляться. Пишет "неопознаная сеть без доступа к интеренету".

ifconfig:

Развернуть/свернуть скрытый текст.
eth0      Link encap:Ethernet  HWaddr 00:15:f2:4f:0d:1d
          inet addr:94.76.120.140  Bcast:94.76.120.255  Mask:255.255.255.0
          inet6 addr: fec0::8:215:f2ff:fe4f:d1d/64 Диапазон:Сайт
          inet6 addr: 2002:5e4c:78be:8:215:f2ff:fe4f:d1d/64 Диапазон:Общий
          inet6 addr: fe80::215:f2ff:fe4f:d1d/64 Диапазон:Ссылка
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54955 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30978 errors:0 dropped:0 overruns:0 carrier:0
          коллизии:0 txqueuelen:1000
          RX bytes:63081559 (63.0 MB)  TX bytes:3139094 (3.1 MB)
          Прервано:18

eth1      Link encap:Ethernet  HWaddr 00:15:f2:4f:14:f3
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::215:f2ff:fe4f:14f3/64 Диапазон:Ссылка
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:405 errors:0 dropped:0 overruns:0 frame:0
          TX packets:441 errors:0 dropped:0 overruns:0 carrier:0
          коллизии:0 txqueuelen:1000
          RX bytes:32040 (32.0 KB)  TX bytes:54867 (54.8 KB)
          Прервано:23 Base address:0xc000

lo        Link encap:Локальная петля (Loopback)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Диапазон:Узел
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
          коллизии:0 txqueuelen:0
          RX bytes:1998 (1.9 KB)  TX bytes:1998 (1.9 KB)
iptables:
Развернуть/свернуть скрытый текст.
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            state NEW

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
На win7 настроенно:
Развернуть/свернуть скрытый текст.
IP:   192.168.0.2
Mask: 255.255.255.0
Шлюз: 192.168.0.1
DNS:  192.168.0.1
Проверил: /proc/sys/net/ipv4/ip_forward записанно 1
Также в /etc/sysctl.conf имеется строчка: net.ipv4.ip_forward=1
Где я туплю?
0
dyug - 16 Март, 2010 - 18:36

iptables -t nat -L -n что показывает?

0
Vorlon - 16 Март, 2010 - 21:01

iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

0
Гость - 18 Октябрь, 2010 - 23:40

DNS включите, либо пропишите днс провайдера

0
vimax - 17 Март, 2010 - 01:27
Изображение пользователя vimax.

Помнится, мешал мне NetworkManager все это добро делать. Я его отключал.
Свои сервера на работе я превращаю в шлюз как описано тут, раздел "ufw Masquerading".
Но это серверная версия. Без всяких "наворотов".

0
Vorlon - 17 Март, 2010 - 14:57

Настроил... только не совсем разобрался где именно была проблема. Как пойму что к чему - напишу. :)

0
get_sux - 2 Июль, 2010 - 18:36

А у меня после этих настроек вырубился bluetooth (в трее серая иконка горит), кто знает как вернуть его?)

0
Гость - 30 Ноябрь, 2010 - 12:01

пишет такую ошибку

bash: /proc/sys/net/ipv4/ip_forward: Отказано в доступе

0
vimax - 3 Декабрь, 2010 - 17:46
Изображение пользователя vimax.

нужно от рута менять настройки. выше я уже писал.
делайте так
sudo sysctl net.ipv4.ip_forward=1

0
Filkt - 12 Январь, 2011 - 10:30
Изображение пользователя Filkt.

Добавлю, все наверное это знают, но я только недавно нарыл. Если вы ловите чужой халявный вай-фай и раздаете себе на комп (как это делаю я), то что бы узнать какой адрес DNS вбить на компе наберите под линуксом команду
cat /etc/resolv.conf
и уведите

0
picaro - 12 Январь, 2011 - 12:19
Изображение пользователя picaro.

Пиши днсы гугла и будет тебе счастье везде.

0
DarkneSS - 12 Январь, 2011 - 12:21
Изображение пользователя DarkneSS.

... или любые открытые

0
Xenomorph - 12 Январь, 2011 - 14:10
Изображение пользователя Xenomorph.

... или ставь бинд и не парься...

0
picaro - 12 Январь, 2011 - 14:13
Изображение пользователя picaro.

По моему, сие уже перебор. Хотя как вариант решение радикальное.

0
Xenomorph - 12 Январь, 2011 - 14:18
Изображение пользователя Xenomorph.

С недавних пор(а точнее, с лета) так и делаю.

+1
dyug - 12 Январь, 2011 - 14:47

А кто будет бинду форвардерс настраивать? :-)
я в сетях меньше 20 машин ставлю dns-masq он проще в понимании и менее избыточен.
Да и как дхцп-сервер для маленькой локалки - очень хорош, включить нужно только...

Да разумеется, настройка внешнего/ведущего днс-сервера здесь тоже нужна... :-)

А, да, чтоб не рассказывали, что бинд не умею/не люблю...
У меня сейчас висит в рабочей сети 5 биндов. два для сайтов, три для внутренних задач.
На 5 разных машинах. Но у меня и сеть из 15 разного размера сегментов.

0
balamutick - 2 Август, 2011 - 09:55
Изображение пользователя balamutick.

up route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1
up route add -net 0.0.0.0 netmask 255.255.255.255 dev eth0

Люди, а если у нас "tap0" это интерфейс для подключения через VPN. Как цитируемая строчка должна выглядеть ?

А eth0:5 - интерфейс сервера с нужным IP для выхода через него в интернет.

Суть такая. Подключаемся через защищённое VPN подключение к серверу, и уже через это VPN подключение(через сервер) и выходим в интернет.

Нужно например, для подключения в ненадёжных местах(ХСВ, интернет кафе, wi-fi отеля и т.п.).