NAT на одном сетевом интерфейсе
В течение многих лет я использовал коммутируемое модемное соединение на 28.8k для связи между домашним компьютером и компьютером на работе, который также был оснащен модемом, так как это решение не требовало оплаты. Стоимость DSL-подключения в наших местах была несколько высока для меня, пока конкуренция между местными провайдерами кабельного доступа не сделала цену более доступной. DSL – классная вещь, а так как я люблю выходить в Интернет из дома, то дополнительная скорость весьма кстати. И к тому же, теперь, когда я подключен к сети все время, это позволяет мне получить доступ к домашнему компьютеру с работы. Настроить DSL-доступ на моей системе с Red Hat 8.0 (rp-pppoe) было вопросом нескольких кликов мышкой.
Тем временем, моя жена сообщила, что у нее на работе установили веб-интерфейс почтового сервера MS Exchange. Отлично! Я подумал, что ей достаточно запустить Мозиллу на моей машине с Linux чтобы проверять рабочую почту дома. Но когда мы попробовали сделать это, у нас не получилось. Также отказались работать Netscape и Konqueror, идентифицирующий себя как IE. Я все еще думал – это не проблема, установил CrossOver Office, проапргрейдил IE до версии 6.0, но так и не смог получить доступ к корпоративной почте. Единственным рабочим вариантом был IE, запущенный на Windows системе, так что вам придется полюбить эти собственные протоколы Microsoft:)
На ноутбуке моей жены была установлена Windows 98, но после установки программного обеспечения SBL DSL на другую машину с Windows, мне не хотелось тратить время еще на одну установку. Также мне не хотелось запускать Windows на машине, имеющей непосредственный выход в сеть.
Конечно, мне в голову пришла идея использовать маскирование IP/NAT (network address translation). Но моя рабочая станция с материнской платой VIA M9000 Mini-ITX имела только одну сетевую карту, и один PCI слот ,который был занят под TV-тюнер. Встроенная сетевая использовалась для подключения DSL, так куда мне подключить еще одну сетевую карту?
Так как я курировал несколько маршрутизаторов на базе Linux и несколько multihomed серверов (имеющих несколько сетевых интерфейсов), я решил, что маскирование IP на псевдоинтерфейсе на единственной сетевой карте сможет работать. Сделать это оказалось просто. Вот схема:
Я подсоединил DSL-модем к 4-портовому хабу с помощью перекрестной витой пары 5-ой категории. Затем я подсоединил рабочую станцию и ноутбук к хабу обычной витой парой 5-ой категории. На схеме показано, как все это выглядит.
Ниже приведен скрипт, который я использую для включения маскирования после того, как установится DSL-соединение и отработает скрипт, поднимающий файрволл.
# —————— begin nat.sh ——————
#!/bin/sh
## скрипт, включающий маскирование
## должен быть запущен после установления DSL соединения
## использование: sh nat.sh
#
# подъем псевдоинтерфейса eth0:0 :
ifconfig eth0:0 192.168.1.1 netmask 255.255.255.0 \
broadcast 192.168.1.255 up
# Правило iptables, включающее маскирование:
iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE
# Наконец, включаем форвардинг:
echo 1 > /proc/sys/net/ipv4/ip_forward
# Дополнительное необязательное правило
# для общения ноутбка и рабочей станции
# для ssh и samba (это по умолчанию запрещено файрволлом)
iptables -I INPUT -s 192.168.1.2 -d 192.168.1.1 -j ACCEPT
# —————— end nat.sh ——————
Ноутбук с Windows 98 имеет статический IP адрес 192.168.1.2, шлюз 192.168.1.1 и адреса DNS-серверов моего провайдера. Адреса DNS-серверов берутся из файла /etc/resolv.conf после установления DNS-соединения и далее не меняются.
Вот и все! Доступ в Интернет для моей домашней сети с единственным хабом и парой соединительных кабелей готов.
Lon Jones,
перевод Юрия Левина,yl@tut.by
Сетевые решения. Статья была опубликована в номере 06 за 2004 год в рубрике sysadmin
NAT с одним сетевым интерфейсом
Необходимо решить следующую задачу. В сети 192.168.1.0/24 присутствуют 3 устройства: 192.168.1.1 — точка доступа с web интерфейсом для администрирования (порт 80), 192.168.1.20 — Windows XP, 192.168.1.160 — Raspberry PI с сетевым интерфейсом eth0.
Хочу, используя iptables на Raspberry, настроить проброс портов, чтобы при обращении на 192.168.1.160:80 пакеты уходили на 192.168.1.1:80. Т.е., открыв в браузере на windows xp адрес 192.168.1.160, я попал в web панель точки доступа. Напрямую, на 192.168.1.1, естественно web морда открывается.
iptables -t nat -A PREROUTING -p tcp -m tcp —dport 80 -j DNAT —to-destination 192.168.1.1
iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT —to-source 192.168.1.20
Эти правила я настроил для случая, если запрос будет исходить от машины 192.168.1.20
Дополнительно я еще добавлял
iptables -A FORWARD -i eth0 -o eth0 -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth0 -d 192.168.1.0/24 -j ACCEPT
и отдельно активировал echo 1 > /proc/sys/net/ipv4/ip_forward
По итогам этой настройки получить доступ с 192.168.1.20 на 192.168.1.1 через 192.168.1.160 не получилось
Следующим шагом я удалил цепочки FORWARD, посчитав, что если у меня сетевой интерфейс один, то они не нужны. Это также не поменяло общей картины (
Запрашиваю информацию с учетом счетчиков iptables -t nat -L -n -v —line-numbers
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DNAT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:192.168.1.1
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3 packets, 213 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 3 packets, 213 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 SNAT all — * * 192.168.1.1 0.0.0.0/0 to:192.168.1.20
Как видно, наши цепочки пока ничего не проходило. Делаю запрос из браузера на машине 192.168.1.20 по адресу 192.168.1.160 и после этого вновь запрашиваю информацию по цепочкам:
Chain PREROUTING (policy ACCEPT 2 packets, 458 bytes)
num pkts bytes target prot opt in out source destination
1 2 128 DNAT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:192.168.1.1
Chain INPUT (policy ACCEPT 2 packets, 458 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 43 packets, 3029 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 45 packets, 3157 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 SNAT all — * * 192.168.1.1 0.0.0.0/0 to:192.168.1.20
На сколько я понимаю, через цепочку PREROUTING прошло 2 пакета, а вот обратно через POSTROUTING нет (
Подскажите, где ошибка? Может чего не хватает.