Установить некоторые порты брандмауэра, чтобы принимать только локальные сетевые подключения?

18

Как настроить брандмауэр в системе в локальной сети, чтобы некоторые порты были открыты только для подключений из локальной сети, а не из внешнего мира?

Например, у меня есть коробка с Scientific Linux 6.1 (дистрибутив на основе RHEL), и я хочу, чтобы его SSH-сервер принимал соединения только с локального хоста или локальной сети. Как мне это сделать?

HPY
источник

Ответы:

24

Когда iptables ядра полностью пуст ( iptables -F), это будет делать то, что вы просите:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Это говорит о том, что всем сетевым адресам разрешено общаться с TCP-портом 22, что localhost получает то же самое соображение (да, 127. * не только 127.0.0.1), и пакеты с любого другого адреса, не соответствующие этим первым двум правилам, бесцеремонно сбрасываются в немного ведро . Вы можете использовать REJECTвместо, DROPесли вы хотите активный отказ (TCP RST), вместо того, чтобы сделать TCP-порт 22 черной дырой для пакетов.

Если ваша локальная сеть не использует блок 192.168.0. *, Вам, естественно, потребуется изменить IP-адрес и маску в первой строке в соответствии со схемой IP-адреса вашей локальной сети.

Эти команды могут не выполнять то, что вы хотите, если на вашем брандмауэре уже настроены некоторые правила. (Скажите iptables -Lкак root, чтобы выяснить это.) Часто случается, что одно из существующих правил захватывает пакеты, которые вы пытаетесь отфильтровать, так что добавление новых правил не имеет никакого эффекта. В то время как вы можете использовать -Iвместо -Aс iptablesкомандой сращивать новые правила в середину цепочки , а не добавляя их, как правило , лучше , чтобы узнать, как цепи получают заселена при загрузке системы и изменять этот процесс , так что ваши новые правила всегда получить установлены в правильный порядок.

РЕЛ 7+

На современных системах типа RHEL лучший способ сделать это - использовать firewall-cmdего или его GUI-эквивалент. Это говорит firewalldдемону ОС, что вы хотите, и именно это заполняет и манипулирует тем, через что вы видите iptables -L.

RHEL 6 и ранее

В старых системах типа RHEL самый простой способ изменить цепочки брандмауэров при заказе - это редактировать /etc/sysconfig/iptables. Инструменты OSI GUI и TUI firewall довольно просты, поэтому, как только вы начнете добавлять более сложные правила, подобные этим, лучше вернуться к старым добрым файлам конфигурации. Остерегайтесь, как только вы начнете это делать, вы рискуете потерять свои изменения, если когда-либо будете использовать инструменты брандмауэра ОС для изменения конфигурации, поскольку она может не знать, как обращаться с подобными правилами, созданными вручную.

Добавьте что-то вроде этого в этот файл:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Где вы добавляете это хитрый бит. Если вы обнаружите в этом файле строку, о которой говорите --dport 22, просто замените ее на три строки выше. В противном случае он, вероятно, должен идти до первой существующей строки, заканчивающейся на -j ACCEPT. Как правило, вам необходимо ознакомиться с тем, как работает iptables , и в этот момент правильная точка вставки будет очевидна.

Сохраните этот файл, затем скажите, service iptables restartчтобы перезагрузить правила брандмауэра. Обязательно сделайте это, войдя в консоль, на случай, если вы нажмете правку! Вы не хотите блокировать себя из своего компьютера, когда вошли в систему через SSH.

Сходство с командами выше не случайно. Большая часть этого файла состоит из аргументов iptablesкоманды. Различия относительно вышеизложенного состоят в том, что iptablesкоманда отбрасывается, и INPUTимя цепочки становится специальной RH-Firewall-1-INPUTцепочкой, специфичной для RHEL . (Если вы захотите изучить файл более подробно, вы увидите ранее в файле, где они по существу переименовалиINPUT цепочку. Почему? Не могу сказать.)

Уоррен Янг
источник
4

Низкоуровневый инструмент для настройки брандмауэра под Linux iptables . Также доступны инструменты более высокого уровня. Я не знаю, есть ли в Scientific Linux рекомендуемый инструмент брандмауэра.

Согласно этой веб-странице (я не проверял, что она относится к 6.1), service iptables saveбудут сохранены текущие правила брандмауэра, и эти сохраненные правила загружаются во время загрузки. Таким образом, вам нужно установить нужные правила с помощью iptablesкоманд (или любым другим способом), а затем запуститьservice iptables save чтобы сделать ваши настройки постоянными.

Сообщение в блоге Scott Pack - это начало отбрасывания «странных» пакетов, которые обычно не нужны и имеют высокий риск быть частью атаки. Кроме того, вы захотите закрыть все входящие порты и открыть только те, которые вам нужны. Что-то вроде этого:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
Жиль "ТАК - перестань быть злым"
источник
1
Жиль, ты не неправильно понял вопрос? Я понимаю, что коробка Scientific Linux - это один из компьютеров в локальной сети, но не брандмауэр.
rozcietrzewiacz
@ Жиль Да, это один из компьютеров в локальной сети.
hpy
@rozcietrzewiacz Я понимаю, что брандмауэр находится на той же машине, что и сервер. Я согласен, что вопрос в некоторой степени неоднозначен, но, поскольку penyuan упомянул только ОС одной машины, я предполагаю, что все происходит на этой машине. В противном случае это был бы не вопрос UNIX, а вопрос о сетевом администраторе.
Жиль "ТАК - перестань быть злым"
1

Предпочтительный способ сделать это с iptables . Похоже, что это было должным образом охвачено другими, поэтому для полноты картины я укажу альтернативный метод контроля доступа, который доступен для многих демонов в большинстве дистрибутивов Linux. Этот метод контроля доступа предоставляется libwrapбиблиотекой.

Чтобы проверить поддержку вашего любимого демона libwrap, попробуйте выполнить следующее:

ldd `which sshd` | grep libwrap

Если вы получили непустой результат, такой как

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

тогда тебе определенно хорошо идти.

Это почти уверенность , что ваш sshdдемон имеет libwrapподдержку, и поэтому она должна проконсультироваться с /etc/hosts.allowи /etc/hosts.denyфайлами для контроля доступа. Предполагая, что ваша локальная сеть LAN есть 192.168.100.0/24, вы можете запретить доступ ко sshdвсем клиентам, кроме клиентов на локальном хосте или в локальной сети, добавив в ваш /etc/hosts.denyфайл следующее:

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Обратите внимание, что этот метод на самом деле не открывает и не закрывает порты. Он просто сообщает демонам, которые используют этот метод контроля доступа, принимать или отклонять попытки подключения от клиентов, которые соответствуют заданному шаблону (ам).

Для получения полной информации ознакомьтесь со справочными страницами, начиная с hosts_access(5).

Стивен Понедельник
источник
1

Если у вас есть собственный брандмауэр на основе linux, вам лучше его настроить iptables, как другие описывают здесь. Если нет, и брандмауэр является вашим маршрутизатором, то, скорее всего, конфигурация по умолчанию уже запрещает доступ извне, если вы явно не включили переадресацию портов (как я недавно описал в ответе на этот вопрос ).

Для обеспечения дополнительной безопасности вы можете использовать отдельную подсеть для соединений в локальной сети. Для этого для каждого компьютера добавьте второй IP-адрес, который будет использоваться только внутри локальной сети, а не маршрутизатором. Допустим, вся локальная сеть теперь использует 192.168.0.xxxадреса, а маршрутизатор (шлюз, межсетевой экран) - 192.168.0.1. Поэтому добавьте второй адрес для каждого компьютера - например:

ifconfig eth0:0 192.168.5.1/24

Затем отредактируйте sshdконфигурацию, чтобы использовать только этот адрес (чтобы он не позволял устанавливать соединения 192.168.0.xxx) - отредактируйте /etc/ssh/sshd_configи измените ListenAddressодну из вашей новой подсети ( 192.168.5.1в приведенном выше примере). Это оно! Если вы не настроите шлюз для маршрутизации связи этой подсети, он должен быть отделен от внешней стороны.

rozcietrzewiacz
источник