Как работает NAT?
Чтобы иметь возможность общаться с другими компьютерами в сети компьютер должен иметь уникальный ip адрес. Но поскольку количество адресов уменьшалось нужно было придумать технологию, которая позволяла бы давать один адрес нескольким машинам. И была придумана технология NAT или Network Address Translation.
Все работает очень просто. Компьютер имеет свой адрес в локальной сети, он не виден из интернета. Когда ему нужно отправить пакет, он отправляет его роутеру, затем роутер подменяет адрес отправителя на свой и передает пакет дальше к цели. Параллельно роутер запоминает с какого локального компьютера был отправлен пакет на этот адрес. Дальше ответный пакет приходит роутеру, он подменяет адрес назначения на адрес нужного компьютера и отдает пакет в локальную сеть.
Недостаток в том, что инициировать подключение извне нельзя, потому что маршрутизатор просто еще не знает к кому обращаются. Тут на помощь приходит проброс портов. Мы можем сказать роутеру: при поступлении пакетов на порт 80 перенаправлять их на порт 80 компьютера 192.168.1.2. Теперь адрес отправителя и порт будет заменяться на указанный нами и пакет будет передан туда, куда нужно. Если на маршрутизаторе установлен Linux, то все это можно настроить с помощью iptables.
Как открыть порт, если уже есть правила
Довольно часто возникает ситуация, когда вам нужно открыть порт Linux, а iptables уже содержит набор правил, запрещающих доступ к портам. Иногда вы добавляете правило, все как нужно, с помощью описанной выше команды, но не замечаете никакого эффекта. Рассмотрим почему так происходит.
Допустим, программа или предыдущий администратор для надежности добавили в конец цепочки правило такого вида:
Как вы понимаете, это значит, что все пакеты, которые до него доходят, будут отброшены. Ваше правило добавляется в конец цепочки, уже после этого. Естественно, что к нему уже никакие пакеты не дойдут, потому что они были отброшены ранее. Чтобы обойти эту проблему нужно использовать опцию -I (INSERT) вместо -A (ADD), она добавляет правило в начало цепочки и все будет работать. Осталось открыть порты Linux:
Теперь смотрим список правил и проверяем:
Как просмотреть статус UFW?
По умолчанию UFW в неактивном состоянии т.е. нет правил брандмауэра не настроен и весь трафик разрешен.Чтобы увидеть статус, введите следующую команду:
$ sudo ufw status
Настройка политики по умолчанию
По умолчанию, когда UFW активируется он блокирует весь входящий трафик на межсетевой экран / сервер.Только исходящий трафик разрешен.Вы можете просмотреть правила по умолчанию UFW, введя следующую команду:
$ grep ‘DEFAULT_’ /etc/default/ufw
Пример результата:
DEFAULT_INPUT_POLICY=»DROP» DEFAULT_OUTPUT_POLICY=»ACCEPT» DEFAULT_FORWARD_POLICY=»DROP» DEFAULT_APPLICATION_POLICY=»SKIP»
Политика по умолчанию работает хорошо для серверов и ноутбуков / рабочих станции, так как вам нужно только открыть ограниченное количество входящих портов.Это хорошая политика, она закрывает все порты на сервере / брандмауэра, и вам нужно только открыть порты один за другим.Вы можете выполнить следующие команды, чтобы установить политику, блокировать все входящие соединения и разрешить только исходящие соединения от сервера / межсетевого экрана:
$ sudo ufw default allow outgoing $ sudo ufw default deny incoming
Создание первого правила брандмауэра, чтобы разрешить подключение к SSH (TCP-порт 22)
Введите следующую команду, чтобы разрешить SSH-соединения с сервером:
$ sudo ufw allow ssh
ИЛИ
sudo ufw allow 22/tcp
Скажем, если вы работаете в SSH на порту 2020, введите следующую команду:
$ sudo ufw allow 2020/tcp
Следующие правила открывают доступ к TCP SSH порт 22 только на 10.8.0.1 (т.е. ваш сервер SSH слущает на IP 10.8.0.1 порт 22) из любого места:
$ ufw allow proto tcp from any to 10.86.115.66 port 22
Настройка проброса портов в VirtualBox для SSH
SSH – сервер обычно прослушивает 22 порт, поэтому нам необходимо пробросить подключение именно на 22 порт.
Шаг 1
Для того чтобы пробросить порт, запускаем VirtualBox и заходим в настройки нашей виртуальной машины с Ubuntu Server. Например, выбираем нужную машину и нажимаем кнопку «Настроить», данный пункт также доступен, если нажать правой кнопкой мыши по выбранной виртуальной машине.
Шаг 2
Затем переходим в раздел настроек «Сеть», и открываем вкладку с включенным адаптером. Тип подключения, как Вы помните, «NAT» — для доступа в Интернет.
Шаг 3
Далее щелкаем на пункт «Дополнительно», чтобы отобразить дополнительные настройки данного адаптера, и после этого нажимаем на кнопку «Проброс портов».
В итоге у нас откроется окно «Правила проброса портов». Для добавления нового правила нажимаем на иконку с плюсиком.
Шаг 5
На данном этапе Вы уже должны знать IP адрес гостевой операционной системы и порт, который прослушивает SSH сервер (по умолчанию это 22 порт). В Ubuntu Server IP адрес можно узнать с помощью команды ifconfig (по умолчанию это 10.2.0.15).
Описание колонок таблицы с правилами:
- Имя – название правила, в нашем случае разумно назвать SSH;
- Протокол – протокол, по которому будет происходить взаимодействие. В обычных случаях это – TCP;
- IP хоста – IP адрес Вашего реального компьютера, можно указать 127.0.0.1 или оставить данное поле пустым;
- Порт хоста – любой свободный порт Вашего компьютера, который будет использоваться для перенаправления на нужный порт в гостевой ОС. Я указал 2222;
- IP гостя – здесь указываем IP адрес гостевой операционной системы на который будет происходить перенаправление, в моем случае это 10.2.0.15;
- Порт гостя – порт гостевой ОС, на который нам необходимо пробрасывать наши запросы. В нашем случае это 22 порт, который прослушивает SSH сервер.
После заполнения таблицы с правилом, нажимаем «ОК».
Шаг 6
На этом настройка проброса портов закончена, теперь мы можем проверить работу данного правила (проброса). Для этого сначала запускаем виртуальную машину с Ubuntu Server, а затем программу PuTTY. На вкладке Session выбираем тип соединения SSH и в поле Host Name пишем локальный адрес компьютера (хоста), которой мы указывали в колонке «IP хоста» в правилах проброса портов, если ничего не указывали, то пишите 127.0.0.1. В поле порт указываем номер порта, который мы указывали в колонке «Порт хоста», т.е. 2222. Нажимаем кнопку «Open».
Если после этого Вы получили приглашение на ввод логина, то это значит, что подключение работает, и Вы, соответственно, можете вводить учетные данные от гостевой операционной системы.
У меня на этом все, надеюсь, материал был Вам полезен, пока!
Нравится20Не нравится
Удаленное перенаправление портов SSH
Удаленная переадресация портов позволяет вам подключиться с удаленного компьютера к локальному компьютеру. По умолчанию SSH не разрешает удаленное перенаправление портов. Вы можете включить это с помощью директивы GatewayPorts в главном файле конфигурации SSHD: /etc/ssh/sshd_config на удаленном хосте.
Откройте файл для редактирования, используя ваш любимый редактор командной строки.
$ sudo vim/etc/ssh/sshd_config
Найдите требуемую директиву, раскомментируйте ее и установите ее значение , как показано на скриншоте.
GatewayPorts yes
Включение удаленного перенаправления портов SSH
Сохраните изменения и выйдите. Затем вам необходимо перезапустить sshd, чтобы применить последнее изменение, которое вы сделали.
$ sudo systemctl restart sshd OR $ sudo service sshd restart
Затем запустите следующую команду для перенаправления порта 5000 на удаленном компьютере на порт 3000 на локальном компьютере.
$ ssh -f -N admin@server1.example.com -R 5000:localhost:3000
Как только вы поймете этот метод туннелирования, вы можете легко и безопасно выявить локальный сервер разработки, особенно за NAT и брандмауэрами в Интернете по защищенным туннелям. Аналогичным образом работают туннели, такие как Ngrok, pagekite, localtunnel и многие другие.
Виртуальный адаптер хоста VirtualBox
Еще один способ получить доступ к виртуальной машине извне – использовать виртуальный адаптер хоста. Тут вы можете настроить все более подробно, а также получить отдельный ip для машины, что дает больше возможностей. Сначала нужно создать виртуальный адаптер. Для этого откройте меню “Файл”, затем “Настройки”:
Тут нужно перейти на вкладку “Сеть”, затем “Виртуальные адаптеры”:
Дальше нажмите кнопку “+”, чтобы в списке появился пункт vboxnet0. Тут готово, нажмите несколько раз “Ok” чтобы закрыть это окно. Дальше откройте контекстное меню вашей виртуальной машины, потом “Настроить”, а затем “Сеть”:
Тут вам нужно в выпадающем списке заменить “NAT” на “Виртуальный адаптер хоста”. В поле имя, выберите “vboxnet0”:
Теперь можете запускать виртуальную машину и смотреть ее ip адрес:
По нему гостевая система будет доступной из внешней. Внешняя система теперь тоже полностью доступна из гостевой по адресу 192.168.56.1:
Как открыть порт в Убунту
Теперь рассмотрим нашу вторую часть сегодняшнего обсуждения. Прежде всего вам потребуется запустить консоль для ввода команд и скриптов. Далее, пробуем следующие две комбинации, которые позволят вам открыть определённый порт. Стоит отметить, что все выполняемые действия производятся на ваш страх и риск, так как они предназначены для опытных пользователей. Любые неверные шаги или же неблагополучные манипуляции могут привести вас к неприятным последствиям. Например, есть вероятность потерять важные файлы и данные или же поломать что-нибудь в строе системы. Приступайте к следующим действиям только при полной уверенности своих сил и возможностей.
Способ первый
Ниже рассматриваются примеры для порта 7777:
- Итак, добавляем в нашу консоль правило: iptables -t filter -A INPUT -i eth0 -p tcp —dport 7777 -j ACCEPT.
- Если так не получилось, то стоит проверить настройки конфигурации файрволла, только потом ввести следующее значение: iptables -L. После этого для открытия нужного порта используете консольную команду: iptables -A INPUT -p tcp —dport 777 -j ACCEPT.
- Если же и эта команда вам не помогла, то воспользуйтесь следующей: sudo iptables -A INPUT -p tcp —dport 7777-j ACCEPT.
Стоит отметить, однако, очень важный момент. Дело в том, что файрволл iptables имеется абсолютно во всех дистрибутивах Linux. Более того, правила их являются также одинаковыми, но зато настройка и запуск может различаться. Вот почему может понадобиться наличие универсального способа. Вероятнее всего, что опытные пользователи не применят его, но вот обычные юзеры вполне могут воспользоваться им.
Способ второй
- Для начала стоит проверить наличие iptables в вашей ОС. Для этого делаем следующую команду в консоли: iptables -list. После этого вы получите необходимые вами данные.
- Наиболее приемлемым вариантом будет закрытие всех портов, необходимых операционке. Далее, устанавливая правила, откройте порты Linux для игры, трансфера документов и веб-сёрфинга. Чтобы сделать это, убедитесь в наличие iptables. После этого создайте файл /etc/iptables.sh с суперпользовательскими правами. Содержание файла будет следующее:
Этот скрипт подходит для всех дистрибутивов Linux, в том числе и Ubuntu. Поэтому можно не волноваться по поводу несовместимости кодов и их работы в операционной системе. Но вдруг если ни один из этих методов вам не помог, потребуется дополнительная диагностика. Например, вы можете посмотреть, не занят ли случайно необходимый порт другим приложением. Если ответ будет положительным, то понадобится закрыть все утилиты, связанные с ним. Только потом можно будет повторить свои попытки со скриптами и кодами.
Таблица форвардинга
При настройке 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
Проверьте открытые порты с netcat
Netcat (или nc) – это инструмент командной строки, который может читать и записывать данные через сетевые подключения, используя протоколы TCP или UDP.
С netcatего помощью можно сканировать один порт или диапазон портов.
Например, для поиска открытых портов TCP на удаленном компьютере с IP-адресом 10.10.8.8 в диапазоне 20-80 вы должны использовать следующую команду:
nc -z -v 10.10.8.8 20-80
Опция -z указывает ncсканировать только открытые порты, без отправки каких – либо данных и -v для более подробной информации.
Вывод будет выглядеть примерно так:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused Connection to 10.10.8.8 22 port [tcp/ssh] succeeded! ... Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Если вы хотите, чтобы на экране выводились только строки с открытыми портами, вы можете отфильтровать результаты с помощью команды grep.
nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded! Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Для сканирования UDP-портов передайте параметр -u в команду nc:
nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
Перенаправление пакетов на другой порт
Перенаправление портов можно использовать для самых разных задач. Например, перенаправление пользователей из разных сетей на разные экземпляры веб-сервера, перенаправление порта на другой, если изменился порт какого-то сервиса, настройка прозрачного проксирования и так далее. Общая идея в том, что пакеты с определенного порта перенаправляются на другой порт на том же сетевом интерфейсе той же самой машины, либо на loopback’е.
Для перенаправления порта, например, 80, с внешнего интерфейса на порт 80 на loopback-интерфейсе мы можем использовать правило
iptables -t nat -A PREROUTING -d 192.168.0.1/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
Это правило позволит перенаправить пакеты на loopback, изменив назначение пакета путем трансляции адреса (Destination NAT), и после этого можно будет их отфильтровать в цепочке, которая будет задана для loopback-интерфейса. Естественно, нужно будет сделать и обратную трансляцию:
iptables -t nat -A POSTROUTING -s 127.0.0.1/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.1
Таким образом, происходит обратный процесс, при этом изменяется Source NAT, то есть, транслируется адрес источника соединения.
Перенаправление портов
Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту.
Пусть – обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес и порт .
Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
#!/bin/bashEXT_IP="xxx.xxx.xxx.xxx" INT_IP="xxx.xxx.xxx.xxx" EXT_IF=eth0 INT_IF=eth1 FAKE_PORT=$1 LAN_IP=$2 SRV_PORT=$3 iptables -t nat -A PREROUTING -d $EXT_IP -p tcp -m tcp --dport $FAKE_PORT -j DNAT --to-destination $LAN_IP:$SRV_PORTiptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j SNAT --to-source $INT_IPiptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IPiptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j ACCEPT |
Динамическая переадресация портов
Динамическая переадресация портов позволяет создать сокет на локальном (ssh-клиентском) компьютере, который действует как прокси-сервер SOCKS. Когда клиент подключается к этому порту, соединение перенаправляется на удаленный компьютер (сервер ssh), который затем перенаправляется на динамический порт на конечном компьютере.
Таким образом, все приложения, использующие прокси-сервер SOCKS, будут подключаться к серверу SSH, и сервер будет перенаправлять весь трафик в его фактическое место назначения.
В Linux, macOS и других системах Unix для создания динамической переадресации портов (SOCKS) передайте параметр клиенту :
Используются следующие параметры:
- — IP-адрес и номер порта локального компьютера. Если опущен, клиент ssh привязывается к localhost.
- — удаленный пользователь SSH и IP-адрес сервера.
Типичным примером динамической переадресации портов является туннелирование трафика веб-браузера через SSH-сервер.
Следующая команда создаст туннель SOCKS на порту :
Перенаправление портов должно быть настроено отдельно для каждого приложения, которое вы хотите туннелировать трафик через него.
Статистика открытых портов в Linux через ss
Однако, ss делает это проще и быстрее, чем netstat. Кроме того, ss даёт более подробные сведения о TCP-подключениях и о состояниях соединений, чем большинство других инструментов. Утилита ss позволяет просматривать информацию об используемых сокетах в системе.
Эта команда обладает схожим функционалом к netstat, но есть и уникальные возможности. Например можно фильтровать вывод по установленным соединениям с определенным портом.
Список процессов, использующие соединения в данный момент
Список сокетов в режиме прослушивания
Пример фильтра — список всех соединений к порту 80
Ручная переадресация портов на роутере TP-Link и Asus.
Для начала нужно определиться с номером порта, который мы хотим открыть. Например, мы хотим сделать проброс портов для торрента. Идем в настройки программы по уже знакомому пути и смотрим в строку «Порт входящих соединений». Запишите номер из окна для генерации и снимите все галочки кроме пункта «В исключения брандмауэра». Не забудьте применить сделанные изменения.
Теперь нужно узнать MAC-адрес своего устройства. В нашем случае это компьютер и его физический адрес нам понадобиться позже. Нажмите кнопку «Пуск» — «Панель управления» — «Центр управления сетями и общим доступом» — «Подключение по локальной сети» и нажмите кнопку «Сведения…». В поле «Физический адрес» вы увидите MAC-адрес своего компьютера.
Теперь зайдите в интерфейс маршрутизатора. Здесь первым делом, нам нужно для своего компьютера задать статический IP-адрес. Далее путь для каждого сетевого устройства свой.
TP-Link. В правом меню найдите «Привязка IP- и MAC-адресов» и перейдите на вкладку «Таблица ARP». Здесь отображены все устройства, которые подключены к нашей сети, а в столбце «Состояние» показан статус привязки (несвязанно). Поскольку мы уже знаем MAC-адрес компьютера, то в строке с физическим адресом видим присвоенный ему IP сервером DHCP. Его мы впишем на следующей вкладке.
Поднимитесь на вкладку выше с названием «Параметры привязки» и активируйте «Связывание ARP» и нажмите «Сохранить». Далее следует нажать кнопку «Добавить новую…» и задать параметры необходимые настройки. В новом окне нужно прописать физический адрес компьютера (MAC), присвоенный ему IP и нажать кнопку «Сохранить».
Теперь MAC- и IP- адреса связаны между собой для персонального компьютера. Об этом также свидетельствует вкладка «Таблица ARP». Если у Вас много устройств в сети и вы желаете им всем задать статический IP, то можно в «Таблице ARP» нажать кнопку «Связать все» предварительно активировав «Связывание ARP».
Осталось задать параметры для проброса портов. Зайдите в «Переадресация» (Forwarding) на вкладку «Виртуальные серверы» (Virtual Servers) и нажмите кнопку «Добавить новую» (Add New…). Теперь прописываем известные нам параметры. В поле «Порт сервиса» (Service Port) и «Внутренний порт» (Internal Port) указываем порт торрент-клиента, а в «IP-адрес» присвоенный IP компьютеру. В выпадающем списке «Протокол» (Protocol) выбираем «Все» (All) и в поле «Состояние» (Status) ставим «Включено» и нажимаем «Сохранить».
После этого для компьютера будет зарезервирован прописанный нами порт и P2P клиент сможет обмениваться входящими и исходящими пакетами.
О принципе по которому работает роутер можно узнать здесь.
Asus. Нажмите в боковом меню «Локальная сеть» и перейдите на вкладку «DHCP-сервер». В самом низу страницы активируйте пункт «Включить назначения вручную». Ниже есть поле «Список присвоенных вручную IP-адресов в обход DHCP». Вот он то нам и нужен. В выпадающем списке поля «MAC-адрес» нужно выбрать физический адрес компьютера, который мы узнали заранее. Поскольку у меня включен DHCP, то в поле «IP-адрес» автоматически подставился текущий IP компьютера.
Осталось кликнуть по кружку «Добавить/Удалить» и нажать кнопку «Применить». Роутер перезагрузится и после каждого подключения к сети, компьютер будет иметь один и тот же IP-адрес.
Теперь в административной панели в боковом меню кликните по «Интернет» и перейдите на вкладку «Переадресация портов». В строке «Включить переадресацию портов» переставьте точку в положение «Да». Далее нужно опуститься в блок «Список переадресованных портов» и в поле «Имя службы» указать uTorrent, поскольку мы открываем порт для этой программы. В строке «Диапазон портов» указываем номер порта P2P клиента, который мы узнали заранее.
В поле «Локальный IP-адрес» выбираем статический IP-адрес компьютера, который мы только что привязали и в строке «Локальный порт» снова указываем порт Torrent-клиента. В выпадающем списке «Протокол» выбираем BOTH (оба протокола). Осталось кликнуть по кружку «Добавить» и кнопку «Применить». После презегрузки порт будет открыт для раздачи и закачки файлов из интернета от программы uTorrent.
Теперь вы имеете представление о том, как настроить проброс портов на роутере TP-Link и Asus. Безусловно автоматический способ намного удобнее, чем ручной и многие люди используют функцию UPnP, но правильнее задавать все настройки в ручную. Однако, это дело каждого и вы вольны выбрать способ, который вам ближе.
Если возникнут какие-то проблемы, то вы всегда можете сбросить установки роутера до заводских и настроить его заново. Если у Вас есть желание дополнить статью, то милости просим в комментарии. Пока!
Перенаправление портов в Linux
Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту. Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT. Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
Предположим, у вас есть веб-сервер в локальной сети, который должен быть доступным из дикого интернета только по https (443/tcp). Причин не использовать VPN или отдельный IP для отдельного сервера может быть много. Например, архитектура сети, отсутствие свободных IP, веб-сервер — гостевая виртуальная машина, а наш шлюз — хост )) Ну, не знаю, сами придумайте ситуацию.
Причем мы хитрые и хотим, чтобы наш веб сервер из интернета не был виден на 443 порту, а был доступен, скажем, на 1293 порту (примерно вот так: https://1.2.3.4:1293). Итак, мы хотим перенаправить входящие из интернет на порт 1293 на порт 443 сервера в локальной сети.
Перенаправление портов в Linux
Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту. Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT. Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
Предположим, у вас есть веб-сервер в локальной сети, который должен быть доступным из дикого интернета только по https (443/tcp). Причин не использовать VPN или отдельный IP для отдельного сервера может быть много. Например, архитектура сети, отсутствие свободных IP, веб-сервер — гостевая виртуальная машина, а наш шлюз — хост )) Ну, не знаю, сами придумайте ситуацию.
Причем мы хитрые и хотим, чтобы наш веб сервер из интернета не был виден на 443 порту, а был доступен, скажем, на 1293 порту (примерно вот так: https://1.2.3.4:1293). Итак, мы хотим перенаправить входящие из интернет на порт 1293 на порт 443 сервера в локальной сети.
Статистика открытых сетевых соединений в Linux через команду «netstat»: описание ее атрибутов
Это базовая утилита линукс, которая не требует скачивания и установки, так как имеется практически во всех дистрибутивах операционной системы. Она позволяет быстро проверить доступность порта на Linux и показать открытие сетевые соединения.
Пользоваться командой можно и безо всяких атрибутов, но для максимально подробного отображения нужной информации без них не обойдись. Параметры у утилиты следующие:
- «-l / —listening» — проверка прослушиваемых соединений;
- «-p / —program» — отображение названия программы и ее PID’а;
- «-t / —tcp» — отображение TCP-соединений;
- «-u / —udp» — отображение UDP-соединений;
- «-n / —numeric» — показ IP-адресов в виде чисел.
Важно! Если соединение открытое и ожидает подключения, то оно обладает типом «listen» и рядом с ним будет указан айпи-адрес, используемый для выполнения этого подключения. Значение IP может быть любым (*/0.0.0.0) или конкретным (в этом случае оно будет указано)
Пример использования «netstat»
Просмотр правил Iptables
Прежде чем что-либо менять, нужно понять каким образом система работает сейчас. Возможно, для лучшего понимания материала вам сначала стоит ознакомиться со статьей iptables для начинающих. Для просмотра текущих правил iptables выполните такую команду:
Здесь мы видим три цепочки OUTPUT, INPUT и FORWARD, за открытые порты отвечает цепочка INPUT, именно через нее проходят все входящие пакеты. Сейчас политика по умолчанию – ACCEPT, это значит, что подключение ко всем портам разрешено. Здесь нам нужно настроить все самим и это будет проще если бы какая-либо программа уже создала свои настройки, но этот вариант мы тоже рассмотрим ниже.
Как открыть порт iptables с нуля
Если в iptables уже есть какие-либо правила и вы хотите их удалить просто выполните:
Теперь нам нужно добавить правила, которые разрешат обмен данными между любыми портами на локальном интерфейсе lo, это нужно чтобы не вызвать системных ошибок:
Если кратко, то здесь добавляется два правила в цепочки INPUT и OUTPUT, разрешающие отправку и прием данных из интерфейса lo
Еще одно интересное и важное правило, которое многие упускают. Нужно запрещать только новые соединения, а пакеты для уже открытых нужно разрешать
Иначе получится, что мы отправляем серверу запрос (цепочка OUTPUT открыта), соединение открывается, но сервер не может нам ответить, потому что все пакеты отбрасываются в INPUT. Поэтому нужно разрешить все пакеты с состоянием ESTABLISHED и RELATED. Для этого есть модуль state:
Теперь самое интересное, рассмотрим как открыть порт 22 и 80 для протокола TCP:
Опция -A сообщает, что нужно добавить пакет в конец цепочки, -p – указывает протокол, а –dport или Destination Port (порт назначения) указывает из какого порта пакеты нужно принимать. Теперь вы можете снова посмотреть список правил:
Вывод очень упрощен и понять здесь что-то сложно, например, может показаться что у нас два одинаковых правила, хотя это не так. Чтобы отобразить более подробную информацию используйте:
Чтобы все это в действительности заработало, осталось поменять политику по умолчанию на DROP:
Все, можете проверять. Все пользователи смогут получить доступ к портам 22 и 80, а к остальным доступа не будет.
Наш пример
Предположим, вы хотите переслать запросы, отправляемые на {80,443} на сервер, прослушивающий 192.168.1.100:{80,443}. : Как настроить ufw для перенаправления http-трафика на другой IP-адрес: порт
Все запросы для порта 202.54.1.1 80 и 443 необходимо перенаправить на другой внутренний сервер.
DNAT
Если у вас есть сервер во внутренней сети, который вы хотите сделать доступным извне, вы можете использовать -j DNAT-адрес цепи PREROUTING в NAT, чтобы указать IP-адрес и порт назначения, где могут быть входящие пакеты, запрашивающие подключение к вашей внутренней службе. Синтаксис:
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d {PUBLIC_IP} --dport 80 -j DNAT --to {INTERNAL_IP}:80
или
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d {PUBLIC_IP} --dport 443 -j DNAT --to {INTERNAL_IP}:443
Постобработка и IP-Masquerading
Чтобы разрешить узлам локальной сети с частными IP-адресами связываться с внешними общедоступными сетями, настройте брандмауэр для маскировки IP-адресов, который маскирует запросы от узлов локальной сети с IP-адресом внешнего устройства брандмауэра, например eth0. Синтаксис:
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
или
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
Как настроить ufw для перенаправления порта
Вам нужно отредактировать файл /etc/ufw/before.rules, введите:
$ sudo vi etc/ufw/before.rules
Затем настройте ufw для перенаправления http-трафика на другой (LAN) IP: порт. В верхнем файле добавьте:
*nat :PREROUTING ACCEPT # forward 202.54.1.1 port 80 to 192.168.1.100:80 # forward 202.54.1.1 port 443 to 192.168.1.100:443 -A PREROUTING -i eth0 -d 202.54.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 -A PREROUTING -i eth0 -d 202.54.1.1 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443 # setup routing -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE COMMIT
Сохраните и закройте файл. Измените /etc/sysctl.conf:
$ sudo vi /etc/sysctl.conf
Установите / отредактируйте следующим образом:
Net.ipv4.ip_forward = 1
Сохраните и закройте файл. Обновить изменения:
$ sudo sysctl -p
Наконец, перезапустите брандмауэр, чтобы включить маршрутизацию:
$ sudo systemctl restart ufw
Убедитесь, что разрешены порты 80 и 443, иначе ufw заблокирует запросы, перенаправленные на внутренние 192.168.1.100:{80,443}:
$ sudo ufw allow proto tcp from any to 202.54.1.1 port 80 $ sudo ufw allow proto tcp from any to 202.54.1.1 port 443
Проверьте новые настройки:
$ sudo ufw status $ sudo iptables -t nat -L -n -v
Наконец, убедитесь, что в вашем домене указанаDNS ‘a’ запись , установлена на 202.54.1.1.
Динамическое перенаправление портов SSH
Это третий тип переадресации портов. В отличие от локальной и удаленной переадресации портов, которые позволяют обмениваться данными с одним портом, это делает возможным полный набор TCP-коммуникаций в разных портах. Динамическая переадресация портов настраивает ваш компьютер как прокси-сервер SOCKS, который по умолчанию прослушивает порт 1080.
Для начинающих, SOCKS — это интернет-протокол, который определяет, как клиент может подключаться к серверу через прокси-сервер (SSH в этом случае). Вы можете включить динамическую переадресацию портов с помощью опции .
Следующая команда запустит прокси SOCKS на порту 1080, что позволит вам подключиться к удаленному хосту.
$ ssh -f -N -D 1080 admin@server1.example.com
С этого момента вы можете заставить приложения на вашем компьютере использовать этот прокси-сервер SSH, отредактировав их настройки и настроив их на использование, чтобы подключиться к удаленному серверу
Обратите внимание, что прокси-сервер SOCKS перестанет работать после закрытия сеанса SSH
Форвардинг портов на другую машину
По сути форвардинг портов на другую машину не отличается от форварда портов в пределах одной машины, но по существу это не одно и то же, поскольку пакеты будут передаваться не в пределах одной машины, как в случае с loopback-интерфейсом, когда фактически пакеты транслируются в пределах сетевого стека. Обычно форвардинг портов производится с определенного порта внешнего интерфейса на определенный порт машины во внутренней сети, поэтому между сетевыми интерфейсами должен быть настроен форвардинг. Например, проброс порта 3389 для работы удаленного рабочего стола (RDP) с внешнего сетевого интерфейса (192.168.100.25) на порт 3389 на одну из машин во внутренней сети (192.168.0.15):
iptables -t nat -A PREROUTING -d 192.168.100.25/32 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.15:3389 iptables -t nat -A POSTROUTING -s 192.168.0.15/32 -p tcp -m tcp --dport 3389 -j SNAT --to-source 192.168.100.25