Ветеран
Сообщения: 2029
Благодарности: 704
|
Профиль
|
Отправить PM
| Цитировать
Только что освободился, сейчас примерно набросаю, каким образом включить forwarding и nat на linux-системе.
Автор написал, что ip получает от провайдера по dhcp. Значит для nat мы использует -j MASQUERADE, а не -j SNAT --to x.x.x.x.
Сразу хочу оговориться, что начну с предварительной части, которая НЕ НУЖНА на рабочей системе. Она используется исключительно для того чтобы избавиться от неопределенности в состоянии системы (я же не знаю, что Вы уже понаписали в правилах брандмауэра).
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
Этими командами мы очистили таблицы правил межсетевого экрана и установили политики по умолчанию.
Прошу обратить внимание на два момента.
1. Мы СНАЧАЛА устанавливаем политики, а потом сбрасываем таблицы. Почему именно так? Да потому, что в хорошо сконфигурированной системе политика всегда должна запрещать прохождение любого пакета, который не был явно разрешен соответствующим правилом. "Запрещено всё, что не разрешено".
В такой ситуации, политики должны быть изменены первыми. Потому что если мы поступим обратным образом и сначала сбросим правила, то любой пакет, который придет в промежутке между сбросом правил и изменением политик, будет отброшен. А это недопустимо - любые действия на корпоративном шлюзе не должны нарушать работоспособность сети предприятия.
2. Все команды рекомендуется записывать с указанием полного пути. Это во-первых, экономит время, а во-вторых, затрудняет работу потенциальному злоумышленнику.
Теперь включаем NAT:
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQURADE
(допустим, что eth1 - это интерфейс Вашего интернет-соединения. Рекомендую во всех правилах, когда это возможно, указывать интерфейс, даже если это не обязательно. Это сильно облегчит Вам жизнь, когда список правил разрастется до нескольких сотен и/или появится резерное подключение к провайдеру).
Разрешаем маршрутизацию пакетов между интерфейсами:
echo 1 > /proc/sys/net/ipv4/ip_forward
не будет лишней и такая команда:
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
Всё. Дело сделано. Предполагая, что таблица машрутизации у Вас уже настроена (утилитами route либо ip c параметром route, если Вы по каким-то причинам используете iproute2) можете указывать Ваш Linux-компьютер в качестве шлюза и спокойно работать в сети).
Примечание: естественно, на практике использовать подобный способ категорически не рекомендуется, поскольку межсетевой экран мы с Вами отключили в самом начале нашего примера, оставив компьютер открытым для всех видов сетевых угроз.
Кроме того, вполне возможно Вам потребуется настроить статические правила трансляции адресов для организации серверов доступных из сети провайдера (а значит, если у Вас публичный ip, то и из интернета).
Попробуем чуточку улучшить наш с Вами набор правил:
Для начала, не будем указывать в сценарии ни явных имен программ, ни наименований интерфейсов. Заменим их на переменные, которые установим в самом начале сценария:
IPTABLES=/sbin/iptables
IF_LAN=eth0
IF_INT=eth1
(IF - от слова "интерфейс". Названия переменных можете выбирать произвольно)
$IPTABLES -A FORWARD -i $IF_LAN -o $IF_INT -j ACCEPT
(разрешили все исходящие соединения, с локального интерфейса на интерфейс провайдера)
$IPTABLES -A FORWARD -i $IF_INT -o $IF_LAN -m state --state ESTABLISED,RELATED -j ACCEPT
(а вот входящие пакеты разрешили пропускать только если они относятся к уже установленному соединению)
$IPTABLES -P FORWARD DROP
(политика по умолчанию - тотальный запрет)
ну и т.д.
После создания скелета сценария можно его улучшать и дополнять.
Добавить проверку корректности переменной содержащей путь до iptables:
[ -x "$IPTABLES" ] || (echo $IPTABLES - not executable; exit 1)
Записать нормальные правила работы межсетевого экрана (этим мы сейчас заниматься не будем).
И последнее. Ваш сценарий не должен исполняться каждый раз при включении компьютера. Это может быть слишком долго.
Сохраните результат его работы: "iptables-save > iptables" и пусть потом все таблицы разом восстанавливаются командой iptables-restore. Обычно это автоматически обеспечивается соответствующим системным сервисом, но он, к сожалению, в каждом дистрибутиве разный.
К примеру, для Debian необходимо установить этот сервис командой "aptitude install iptables-persistent" и сохранять правила командой "iptables-save > /etc/iptables/rules.v4"
Команду "echo 1 > /proc/sys/net/ipv4/ip_forward" (или "sysctl net.ipv4.ip_forward=1" - это одно и то же) необходимо исполнять независимо от использования команды iptables-restore. Правда на этот случай тоже есть системный сервис, но пора закругляться. И так слишком длинно получилось.
|