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

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

+1
yurmax - 23 Август, 2007 - 05: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 - 22: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 - 14:42

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+1
DeathMoroz - 4 Февраль, 2009 - 13: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 - 14: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 - 11: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 - 20:00
Изображение пользователя zheny.

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

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

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

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

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

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

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

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

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

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

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

+3
Гость - 24 Январь, 2010 - 16: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 - 11:36
Изображение пользователя vimax.

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

+2
vimax - 16 Сентябрь, 2009 - 12: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 - 23:17

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

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

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

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

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

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

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

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

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

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

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

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

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

+1
salt - 29 Май, 2010 - 14: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 - 18:30
Изображение пользователя sg-333.

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

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

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

0
Vorlon - 16 Март, 2010 - 14: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 - 19:36

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

0
Vorlon - 16 Март, 2010 - 22: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
Гость - 19 Октябрь, 2010 - 00:40

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

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

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

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

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

0
get_sux - 2 Июль, 2010 - 19:36
Изображение пользователя get_sux.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0
balamutick - 2 Август, 2011 - 10: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 отеля и т.п.).

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

Лучше вывод
ip a
ip r
А там будем дальше двигаться.

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