Allowing Incoming Traffic on Specific Ports
You could start by blocking traffic, but you might be working over SSH, where you would need to allow SSH before blocking everything else.
To allow incoming traffic on the default SSH port (22), you could tell iptables to allow all TCP traffic on that port to come in.
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
Referring back to the list above, you can see that this tells iptables:
- append this rule to the input chain (-A INPUT) so we look at incoming traffic
- check to see if it is TCP (-p tcp).
- if so, check to see if the input goes to the SSH port (—dport ssh).
- if so, accept the input (-j ACCEPT).
Lets check the rules: (only the first few lines shown, you will see more)
sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Now, let’s allow all incoming web traffic
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Checking our rules, we have
sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www
We have specifically allowed tcp traffic to the ssh and web ports, but as we have not blocked anything, all traffic can still come in.
Использование ключей для доступа и шифрование трафика
Первоначально беспроводные сети работали в открытом режиме, потом появился WEP (Wired Equivalent Privacy, который впоследствии оказался весьма ненадежным), потом WPA, WPA2…
Популярный сейчас WPA2-PSK (pre-shared key) использует единственный ключ для всех клиентов сети. Помимо того, что при компрометации злоумышленник получает доступ ко всей сети, такой ключ достаточно сложно менять — нужно перенастроить все клиенты. Тем не менее из-за простоты реализации такой метод защиты применяется в домашних сетях и малом бизнесе.
До появления WiFi 6 c WPA3 самым защищенным считался WPA2 Enterprise с использованием индивидуальных динамических ключей, которые могут периодически обновляться без разрыва соединения. Для организации работы с такими ключами используется сервер авторизации (обычно RADIUS).
В Nebula для точек AX появилась функция Dynamic Personal Pre-Shared Key (DPPSK) — усовершенствованная аутентификация через облако, позволяющая использовать разные пароли (PSK) для каждого клиента. Можно указать срок действия для каждого пароля, что позволяет гибко управлять доступом к сети WiFi для большого числа устройств.
Где искать следы атаки
Эффективным методом выявления атаки является мониторинг и анализ событий, происходящих в инфраструктуре уже после проникновения злоумышленников в локальную сеть, со своевременным реагированием на инциденты. Однако здесь есть свои особенности. Мониторинг событий на конечных узлах позволяет обнаружить факт компрометации, но для того чтобы восстановить цепочку атаки, потребуется отследить перемещения злоумышленников между узлами сети и выявить подключения ко внешним командным серверам.
Анализ сетевой активности дополняет картину происходящего в инфраструктуре. Если злоумышленники получили возможность выполнять команды в пределах одного компьютера, то перед ними стоят две задачи: установить связь с командным сервером и начать продвигаться по сети. Все эти действия оставляют следы в сетевом трафике, а скрыть их становится сложнее. Например, если на отдельном узле иногда достаточно воспользоваться упаковщиком для сокрытия вредоносной утилиты, то для того чтобы полностью скрыть идентифицирующие утилиту сетевые запросы к другим узлам или командному серверу, потребуется изменить логику её работы. Кроме того, в атаках часто применяются бесфайловые вредоносные программы (fileless malware), которые исполняются сразу в оперативной памяти. Тело такого объекта не сохраняется на жёстком диске, а в некоторых случаях не создаётся также никаких новых процессов — вредоносный код внедряется в один из уже работающих. При этом сохраняются все функции хакерской программы, в том числе — коммуникации с командным центром.
Мы рассмотрим несколько популярных техник, которые могут выдать присутствие злоумышленников, и покажем, как обнаружить их в сетевом трафике.
Kernel Packet Traveling Diagram
Network -----------+----------- | +--------------------------+ +-------+-------+ +---------+---------+ | IPCHAINS | | IPTABLES | | INPUT | | PREROUTING | +-------+-------+ | +-------+-------+ | | | | conntrack | | | | +-------+-------+ | | | | mangle | | <- MARK WRITE | | +-------+-------+ | | | | IMQ | | | | +-------+-------+ | | | | nat | | <- DEST REWRITE | | +-------+-------+ | DNAT or REDIRECT or DE-MASQUERADE | +---------+---------+ +------------+-------------+ | +-------+-------+ | QOS | | INGRESS | +-------+-------+ | packet is for +-------+-------+ packet is for this machine | INPUT | another address +--------------+ ROUTING +--------------+ | | + PDBB | | | +---------------+ | +-------+-------+ | | IPTABLES | | | INPUT | | | +-----+-----+ | | | | mangle | | | | +-----+-----+ | | | | filter | | | | +-----+-----+ | | +-------+-------+ | | +---------------------------+ +-------+-------+ | | | Local | +-------+-------+ +-------+-------+ | Process | | IPCHAINS | | IPTABLES | +-------+-------+ | FORWARD | | FORWARD | | +-------+-------+ | +-----+-----+ | +-------+-------+ | | | mangle | | <- MARK WRITE | OUTPUT | | | +-----+-----+ | | ROUTING | | | | filter | | +-------+-------+ | | +-----+-----+ | | | +-------+-------+ +-------+-------+ | | | IPTABLES | +---------------------------+ | OUTPUT | | | +-----------+ | | | | conntrack | | | | +-----+-----+ | | | | mangle | | <- MARK WRITE | | +-----+-----+ | | | | nat | | <-DEST REWRITE | | +-----+-----+ | DNAT or REDIRECT | | | filter | | | | +-----+-----+ | | +-------+-------+ | | | +----------------------+----------------------+ | +------------+------------+ | | +-------+-------+ +---------+---------+ | IPCHAINS | | IPTABLES | | OUTPUT | | POSTROUTING | +-------+------- | +-------+-------+ | | | | mangle | | <- MARK WRITE | | +-------+-------+ | | | | nat | | <- SOURCE REWRITE | | +-------+-------+ | SNAT or MASQUERADE | | | IMQ | | | | +-------+-------+ | | +---------+---------+ +------------+------------+ | +------+------+ | QOS | | EGRESS | +------+------+ | -----------+----------- Network
Отобразить список правил с номерами строк.
Примерный вывод:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 0.0.0.0/0 0.0.0.0/0 state INVALID 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 2 DROP all -- 0.0.0.0/0 0.0.0.0/0 state INVALID 3 TCPMSS tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 5 wanin all -- 0.0.0.0/0 0.0.0.0/0 6 wanout all -- 0.0.0.0/0 0.0.0.0/0 7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain wanin (1 references) num target prot opt source destination Chain wanout (1 references) num target prot opt source destination
Вы можете использовать номера строк для того, чтобы добавлять новые правила.
Исследуем хакерский инструментарий
В большинстве своём злоумышленники используют уже готовые фреймворки, поэтому в поиске подозрительного трафика важно знать особенности, характерные для различных инструментов. Так, популярный среди киберпреступников фреймворк Koadic передаёт полезную нагрузку в виде ответа веб-сервера внутри HTML
Сама полезная нагрузка зашифрована, а к расшифровщику применены техники обфускации кода: случайные имена пользовательских функций, их аргументов и переменных. Зашифрованный скрипт дополнительно закодирован. Для обхода средств обнаружения вторжений (IDS) авторы скрывают имя функции, используемой для выполнения расшифрованного скрипта.
Рисунок 19. Обфускация «полезной» нагрузки в Koadic
Ниже представлен ответ агента Koadic командному серверу. Часть служебной информации, например тип исполненного задания, создатели хранят в собственных HTTP-заголовках. Идентификаторы сессии и задачи устанавливаются случайным образом, а путь к библиотеке mshtml обфусцирован для обхода сигнатур IDS, но вид URI всё равно является одним из индикаторов, по которому можно узнать Koadic.
Рисунок 20. Запрос, свидетельствующий об использовании Koadic
Опишем несколько подходов, которые помогают выявить шифрованное соединение с использованием Meterpeter из состава фреймворка Metasploit.
Долгое время хорошо работало правило детектирования Meterpreter HTTPS Reverse Shell, которое анализировало SSL-сертификат защищённого соединения. Дело в том, что в сертификате, сгенерированном через Metasploit, поля Distinguished Name (DN) Issuer и DN Subject содержат идентичные наборы из 6 RDN, расположенных в фиксированном порядке.
Рисунок 21. Содержимое полей DN Issuer и DN Subject
Другим примером детектирования служит обнаружение Meterpreter Reverse TCP Shell. В начале соединения происходит отправка пакета определённой длины, внутри которого передаётся публичный ключ RSA-2048. Такой пакет дополнительно защищён шифром гаммирования (XOR), однако из-за малой длины гаммы в структуре пакета можно выявить повторяющиеся части. На рисунке ниже выделены такие фрагменты, а также сам зашифрованный ключ.
Рисунок 22. Обнаружение Meterpreter Reverse TCP Shell
Благодаря большому количеству нулей в начале шифруемых данных и малой длине гаммы можно без труда найти ключ и посмотреть, что находится за XOR.
Рисунок 23. Расшифровка публичного ключа
Для фреймворка Cobalt Strike также были выявлены неизменные паттерны, связанные с особенностями используемого SSL-сертификата, которые позволяют обнаружить такую коммуникацию.
Как открыть один порт
Рассмотрим синтаксис команды.
На практике аргумент -t опускается. Для первого примера откроем 80 port для протокола tcp.
Здесь:
- -A — добавить новое правило в цепочку;
- -p — протокол tcp;
- ACCEPT — разрешить.
После этого все внешние устройства смогут установить связь по порту 80 (для примера). Теперь сделаем тоже самое, только для протокола udp
При необходимости открыть порт для определенного устройства, пользователю нужно уточнить адрес внешнего устройства. В развернутом и конкретизированном виде эта команда будет выглядеть так:
После выполнения данного действия порт с указанным номером откроется на вашем ПК.
Открытие нескольких портов сразу
Для примера откроем диапазон портов с 18060:18071.
Что получится в результате? Теперь возможен прием входящих пакетов, передаваемых по протоколу на локальный ПК. Порты 18060-18071 открылись одновременно.
Далее мы рассмотрим пример команды, которая позволит разрешить прием пакетов через выбранный порт iptables. То есть, команду для входящего типа соединения. Для этого потребуется задать:
Теперь перейдем к настройкам исходящего коннекта. Пользователю нужно задать команду аналогичного вида. Единственная разница будет заключаться в изменении «INPUT» на «OUTPUT». Во всем остальном указанная схема остается без изменений.
Как проверить статус порта
На практике очень часто бывает так, что введенная команда не работает. Чтобы не попасть в такую ситуацию, необходимо проверить состояния порта. Для этих целей используется telnet.
Проверка порта осуществляется таким образом:
Как видно по заданной команде, система проверит порт под номером 8080 у компьютера с указанным IP-адресом. А теперь представим ситуацию, что порт 445 на удаленном устройстве открыт для входящего коннекта, а порт 445 на локальном устройстве открыт для исходящего коннекта. При таких условиях на экран будет выведено сообщение данного вида: «Connection closed by foreign host». В обратном случае выведенное сообщение будет носить иной характер. И это можно воспринять, как невозможность дальнейшего соединения.
Заключение
Открытие порта iptables на локальном устройстве вызывает множество различных трудностей у новичков. Внимательно следуя рекомендациям в данной статье, можно быстро приучиться к новшествам системы Линукс и решить все незакрытые вопросы. Воспользуйтесь подсказками, если вам потребуется открыть один или сразу несколько портов на своём ПК, закрыть его или проверить актуальный статус портов на нескольких машинах. Создайте новый коннект («NEW») или отточите своё мастерство при работе с уже установленными коннектами.
Tips
If you manually edit iptables on a regular basis
The above steps go over how to setup your firewall rules and presume they will be relatively static (and for most people they should be). But if you do a lot of development work, you may want to have your iptables saved everytime you reboot. You could add a line like this one in /etc/network/interfaces:
pre-up iptables-restore < /etc/iptables.rules post-down iptables-save > /etc/iptables.rules
The line «post-down iptables-save > /etc/iptables.rules» will save the rules to be used on the next boot.
Using iptables-save/restore to test rules
If you edit your iptables beyond this tutorial, you may want to use the iptables-save and iptables-restore feature to edit and test your rules. To do this open the rules file in your favorite text editor (in this example gedit).
sudo sh -c "iptables-save > /etc/iptables.rules" gksudo gedit /etc/iptables.rules
You will have a file that appears similiar to (following the example above):
# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006 *filter :INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 -A INPUT -j DROP COMMIT # Completed on Sun Apr 23 06:19:53 2006
Notice that these are iptables commands minus the iptable command. Feel free to edit this to file and save when complete. Then to test simply:
sudo iptables-restore < /etc/iptables.rules
NOTE: With iptables 1.4.1.1-1 and above, a script allow you to test your new rules without risking to brick your remote server. If you are applying the rules on a remote server, you should consider testing it with:
sudo iptables-apply /etc/iptables.rules
After testing, if you have not added the iptables-save command above to your /etc/network/interfaces remember not to lose your changes:
sudo sh -c "iptables-save > /etc/iptables.rules"
More detailed Logging
For further detail in your syslog you may want create an additional Chain. This will be a very brief example of my /etc/iptables.rules showing how I setup my iptables to log to syslog:
# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006 *filter :INPUT ACCEPT :FORWARD ACCEPT :LOGNDROP - :OUTPUT ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j LOGNDROP -A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7 -A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7 -A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7 -A LOGNDROP -j DROP COMMIT # Completed on Sun Apr 23 05:32:09 2006
Note a new CHAIN called LOGNDROP at the top of the file. Also, the standard DROP at the bottom of the INPUT chain is replaced with LOGNDROP and add protocol descriptions so it makes sense looking at the log. Lastly we drop the traffic at the end of the LOGNDROP chain. The following gives some idea of what is happening:
-
--limit sets the number of times to log the same rule to syslog
-
--log-prefix "Denied..." adds a prefix to make finding in the syslog easier
-
--log-level 7 sets the syslog level to informational (see man syslog for more detail, but you can probably leave this)
Disabling the firewall
If you need to disable the firewall temporarily, you can flush all the rules using
sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -F
or create a script using text editor such as nano
sudo nano -w /root/fw.stop
echo "Stopping firewall and allowing everyone..." iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
Make sure you can execute the script
sudo chmod +x /root/fw.stop
You can run the script
sudo /root/fw.stop
Configuration on Startup for NetworkManager
NetworkManager includes the ability to run scripts when it activates or deactivates an interface. To save iptables rules on shutdown, and to restore them on startup, we are going to create such a script. To begin, press Alt+F2 and enter this command:
For Ubuntu:
gksudo gedit /etc/NetworkManager/dispatcher.d/01firewall
For Kubuntu:
kdesu kate /etc/NetworkManager/dispatcher.d/01firewall
Then, paste this script into your editor, save, and exit the editor.
if [ -x /usr/bin/logger ]; then LOGGER="/usr/bin/logger -s -p daemon.info -t FirewallHandler" else LOGGER=echo fi case "$2" in up) if [ ! -r /etc/iptables.rules ]; then ${LOGGER} "No iptables rules exist to restore." return fi if [ ! -x /sbin/iptables-restore ]; then ${LOGGER} "No program exists to restore iptables rules." return fi ${LOGGER} "Restoring iptables rules" /sbin/iptables-restore -c < /etc/iptables.rules ;; down) if [ ! -x /sbin/iptables-save ]; then ${LOGGER} "No program exists to save iptables rules." return fi ${LOGGER} "Saving iptables rules." /sbin/iptables-save -c > /etc/iptables.rules ;; *) ;; esac
Finally, we need to make sure NetworkManager can execute this script. In a terminal window, enter this command:
sudo chmod +x /etc/NetworkManager/dispatcher.d/01firewall
Распределенная атака отказа в обслуживании — DDos
Эта сетевая атака заключается в сбивании жертвы с нескольких исходных компьютеров, например, ботнет, состоящий из тысячи компьютеров, может атаковать определенную цель. Эти типы атак очень распространены, в них используются методы, которые мы объясняли ранее, такие как SYN Flood. Несмотря на то, что существует очень мощный сервер, способный обрабатывать миллионы запросов SYN Flood, если мы используем ботнет с сотнями или тысячами компьютеров, он не сможет его удерживать и в конечном итоге заблокируется. Эта атака «распространяется» между разными компьютерами, будь то компьютеры, другие зараженные серверы, взломанные устройства Интернета вещей и многое другое.
Вот несколько советов по уменьшению DDoS-атак:
- Правильно настройте межсетевой экран маршрутизатора.
- Блокируйте весь сетевой трафик, за исключением того, что нам специально разрешено.
- Отключите все службы, которые мы не используем.
- Часто проверяйте конфигурацию сети и имеющиеся у нас журналы.
- Надежная политика ведения журнала, позволяющая корреляцию событий (SIEM).
- Имейте хорошую политику паролей с соответствующими разрешениями.
- Ограничьте пропускную способность сети на порт, чтобы избежать атак из нашей собственной сети.
Таблица форвардинга
При настройке iptables мы уже использовали таблицу форвардинга, но единственное, что мы делали — это очищали правила командой
iptables -F FORWARD
В этой таблице не рекомендуется фильтровать трафик, рекомендуется ее использовать только для перенаправления трафика. Фильтрацию необходимо выполнять либо до форвардинга, либо уже после. В таблице FORWARD вы определяете, куда должны форвардиться пакеты, а куда нет. Например:
— разрешить форвардинг между eth0 и eth1
— разрешить форвардинг между eth0 и eth2
— запретить форвардинг между eth1 и eth2
Правила в таком случае могут выглядеть так:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT iptables -A FORWARD -i eth1 -o eth2 -j DROP iptables -A FORWARD -i eth2 -o eth1 -j DROP
либо еще короче:
iptables -A FORWARD -i eth1 -o eth2 -j DROP iptables -A FORWARD -i eth2 -o eth1 -j DROP
Настройка правил iptables
Перед настройкой правил, чтобы не заблокировать нужные сервисы, стоит посмотреть открытые порты на сервере при помощи команды:
# netstat -tulpn
Все правила iptables применяются сразу после выполнения команды по добавлению правила в firewall. Чтобы это проверить, можно сразу запретить доступ к 80 порту, если конечно на нем настроен web-сервер, для относительно безопасного наблюдения за действиями блокировки:
# iptables -A INPUT -p tcp -m tcp —dport 80 -j DROP
Теперь можно убедиться, что сайт, для доступа к которому используется 80 порт, стал недоступен. Флаг -A добавляет правило в самый конец выбранной цепочки. Поскольку в команде не указано имя таблицы правил (-t tablename), используется таблица по умолчанию: filter. Снять блокировку можно, как было описано ранее, путем запуска команды iptables -F, но что делать, если нужно удалить только одно правило, а все остальные оставить без изменений?
Удалить все правила из цепочки INPUT с параметром DROP:
# iptables -D INPUT -j DROP
Удалить только правило, заданное с помощью INPUT -p tcp -m tcp —dport 81 -j DROP
# iptables -D INPUT -p tcp -m tcp —dport 80 -j DROP
Ключ -D обозначает: удалить одно или более правил согласно следующему за ним условию.
Также, удалить правило, можно зная его номер. Просмотреть все правила с номерами строк, можно при помощи ключа —line-numbers, номер правила будет указан в колонке num:
# iptables -L -n -v —line-numbers
Флаги -L, -n и -v:
- -L: посмотреть список правил.
- -n: отображать IP адрес и порт числами, без этой опции IP-адреса будут по возможности переведены в имена доменов, что замедлит процесс отображения.
- -v: просмотр дополнительной информации, такой как: название интерфейса, суффиксы ‘K’, ‘M’ or ‘G’, опции и TOS маски.
Теперь удалить одно правило, зная его номер, можно так:
# iptables -D INPUT 1
Добавить правило на определенное место, например на первую строчку, можно, используя такой синтаксис:
# iptables -I INPUT 1 -s 4.4.4.4 -j ACCEPT
Все правила, записанные ранее, включая то, что было в строке 1, будут сдвинуты на строчку ниже.
Опция -Z сбрасывает в ноль счетчики пакетов и байт.
DROP или REJECT
DROP и REJECT отклоняют соединение, но REJECT еще дополнительно отправляет инициатору ICMP пакет, с сообщением, что попытка соединения отклонена. DROP — просто отбрасывает пришедший пакет, не отправляя никакого сообщения в ответ. В случае DoS-атаки, REJECT будет создавать избыточный трафик своими ответами, так что в случае отклонения соединения лучше всего использовать DROP.
В советуют использовать REJECT, для защиты от сканирования портов, поскольку DROP может оставлять открытые неиспользуемые сокеты на сервере.
Сброс правил: опция -F или -X
Во многих примерах для полной очистки правил используется сразу флаг -F и флаг -X:
# iptables -F
# iptables -X
И это правильно! Так как -F удаляет все пользовательские правила созданные в стандартных и пользовательских цепочках, а вот флаг -X удаляет пользовательские названия цепочек, созданные при помощи флага -N. Менять местами -F и -X не стоит, так как для удаления пользовательской цепочки, необходимо предварительно очистить её от правил, иначе цепочка удалена не будет и отобразиться сообщение об ошибке.
Проброс портов в iptables
Первое что нужно сделать, это включить переадресацию трафика на уровне ядра, если это еще не сделано. Для этого выполните:
Чтобы настройка сохранялась после перезагрузки используйте такую команду:
Мы не будем здесь подробно рассматривать правила iptables и значение каждой опции, поэтому перед тем, как читать дальше вам лучше ознакомиться со статьей iptables для начинающих. Дальше рассмотрим проброс портов iptables nat.
Настройка прохождения пакетов
Сначала мы рассмотрим как разрешить прохождение пакетов через маршрутизатор. Для этого в брандмауэре есть цепочка FORWARD. По умолчанию для всех пакетов применяется правило DROP, которое означает что все нужно отбросить. Сначала разрешим инициализацию новых соединений, проходящих от eth0 до eth1. Они имеют тип contrack и представлены пакетом SYN:
Действие ACCEPT означает, что мы разрешаем это соединение. Но это правило разрешает только первый пакет, а нам нужно пропускать любой следующий трафик в обоих направлениях для этого порта (80). поэтому добавим правила для ESTABLIHED и RLEATED:
Дальше явно установим что наша политика по умолчанию — DROP:
Это еще не проброс портов, мы только разрешили определенному трафику, а именно на порт 80, проходить через маршрутизатор на другие машины локальной сети. Теперь настроим правила, которые будут отвечать за перенаправление трафика.
Модификация пакетов в iptables
Далее мы настроим правила, которые будут указывать как и куда нужно перенаправить пакеты, приходящие на порт 80. Сейчас маршрутизатор может их пропускать в сеть, но он еще не знает куда. Для этого нам нужно будет настроить две вещи — модификацию адреса назначения (Destination) DNAT и модификацию адреса отправителя (Source) SNAT.
Правила DNAT настраиваются в цепочке PREROUTING, в таблице NAT. Эта операция изменяет адрес назначения пакета чтобы он достиг нужной нам цели, когда проходит между сетями. Клиенты будут отправлять пакеты нашему маршрутизатору, и им не нужно знать топологию внутренней сети. Пакет автоматически будет приходить нашему веб-серверу (192.168.1.2).
С помощью этого правила мы перенаправляем все пакеты, пришедшие на порт 80, к 192.168.1.2 опять же на порт 80:
Но это только половина работы. Пакет будет иметь исходный адрес клиента, а значит будет пытаться отправить ответ ему. Так как клиент ожидает получить ответ от маршрутизатора, то нормального TCP соединения не получиться. Чтобы решить эту проблему нужно модифицировать адрес источника и заменить его на адрес маршрутизатора 192.168.1.1. Тогда ответ придет маршрутизатору, а тот уже от своего имени передаст его в сеть.
Если вы хотите перенаправить трафик на порт 8080, то нужно указать его после ip адреса:
Также может понадобиться выполнить проброс диапазона портов iptables, для этого просто укажите диапазон, например, 1000:2000:
После добавления этого правила можете проверять работу перенаправление портов iptables будет выполняться и все будет отправляться так, как нужно.
Сохранение настроек iptables
Теперь, когда все настроено, нужно сохранить этот набор правил, чтобы он загружался автоматически при каждом старте. Для этого выполните:
Готово. Теперь проброс портов iptables ubuntu будет работать так, как нужно.
Обработка источника соединения
Идем дальше. соединение по определенным портам нам необходимо не со всем Интернетом, а с определенными машинами, с определенными IP-адресами. Поэтому мы можем немного усложнить правила, добавив в них адрес источника пакетов.
iptables -t filter -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT
Данное правило позволяет принимать пакеты на 22 порт по протоколу TCP только из источника с адресом 123.123.123.123, на это указывает параметр «-s» (source, источник). Таким образом вы можете ограничить соединения с сервером по SSH одним определенным IP-адресом, либо определенной подсетью, если укажете маску подсети, из которой разрешены соединения вместо отдельного IP-адреса.
Если у вас всегда используется один и тот же почтовый шлюз, через который ваш сервер отправляет почту, то вы можете, например, ограничить соединения с порта 25/tcp, указав этот шлюз в качестве источника.