В данной статье мы с Вами рассмотрим возможность программы VirtualBox пробрасывать порты в гостевую операционную систему, для того чтобы иметь доступ к ней с хоста, т.е. с реальной машины, например, в тех случаях, когда подключение (сеть) в гостевой ОС в VirtualBox работает в режиме «NAT».
Данная возможность будет полезна, например, когда Вам нужен одновременно и доступ к Интернету в гостевой операционной системе, и доступ к каким-нибудь сервисам в гостевой ОС с хоста.
Доступ к Интернету в гостевой ОС можно получить с помощью выбора типа подключения «NAT», но как Вы, наверное, знаете, при этом теряется доступ к сервисам гостевой ОС с реального Вашего компьютера. Данную проблему как раз и решает проброс портов.
Рассматривать проброс портов мы будем на примере случая, когда Вы создали виртуальную машину в VirtualBox и установили в нее серверную операционную систему, например Linux Ubuntu Server, при этом Вы настроили сеть в режиме NAT для доступа в Интернет, но доступа к гостевой операционной системе (Ubuntu Server) у Вас нет.
Например, Вы не можете подключиться к ней по SSH со своего компьютера, или обратиться к Web серверу, или даже просто скопировать команду и вставить в консоль. Поэтому давайте пробросим порт в гостевую ОС, например, для того чтобы подключится к ней по SSH всем известной программой PuTTY.
С помощью нее мы сможем без проблем управлять сервером и в случае необходимости копировать команды в нее.
Для сведения.
PuTTY – это бесплатная клиентская программа для удаленного подключения, например к серверам по протоколам SSH, Telnet и другим. Она позволяет управлять удаленным компьютером.
PuTTY — это клиентская часть, серверная должна быть реализована на удаленной стороне, например, в нашем случае в Ubuntu Server должен быть установлен SSH сервер.
Скачать PuTTY можно с официального сайта — www.putty.org.
Настройка проброса портов в VirtualBox для SSH
SSH – сервер обычно прослушивает 22 порт, поэтому нам необходимо пробросить подключение именно на 22 порт.
Шаг 1
Для того чтобы пробросить порт, запускаем VirtualBox и заходим в настройки нашей виртуальной машины с Ubuntu Server. Например, выбираем нужную машину и нажимаем кнопку «Настроить», данный пункт также доступен, если нажать правой кнопкой мыши по выбранной виртуальной машине.
Шаг 2
Затем переходим в раздел настроек «Сеть», и открываем вкладку с включенным адаптером. Тип подключения, как Вы помните, «NAT» — для доступа в Интернет.
Шаг 3
Далее щелкаем на пункт «Дополнительно», чтобы отобразить дополнительные настройки данного адаптера, и после этого нажимаем на кнопку «Проброс портов».
Шаг 4
В итоге у нас откроется окно «Правила проброса портов». Для добавления нового правила нажимаем на иконку с плюсиком.
Шаг 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».
- Если после этого Вы получили приглашение на ввод логина, то это значит, что подключение работает, и Вы, соответственно, можете вводить учетные данные от гостевой операционной системы.
- У меня на этом все, надеюсь, материал был Вам полезен, пока!
Источник: https://info-comp.ru/sisadminst/597-port-forwarding-in-virtualbox.html
Как выполнить проброс портов в Ubuntu Server
Термин «проброс портов» активно используют в своей терминологии профессионалы, а для новичков подобный жаргон часто остаётся непонятным. Это технология, которая позволяет работать с компьютером в локальной сети из интернета.
При этом в локальной сети может находиться маршрутизатор, который использует преобразование сетевых адресов. Таким образом, происходит перенаправление трафика с определённых портов по внешнему адресу на определённый адрес ПК во внутренней сети.
С Ubuntu проброс портов достаточно несложен в исполнении.
Проброс портов может понадобиться при организации пиринговой сети.
Подход проброса портов часто используется, когда нужно организовать на локальном компьютере сервер с доступом из любой точки мира, создать пиринговую сеть, или же использовать такое соединение для игр с большим количеством реальных игроков. Мы рассмотрим несколько основных способов реализации такой функции.
Средствами маршрутизатора
На некоторых маршрутизаторах есть возможность быстро включить поддержку проброса. Допустим, на устройствах D-Link она носит название «виртуальный сервер». Как правило, такая настройка выполняется через web-оболочку.
- Откройте браузер. В адресной строке наберите 192.168.0.1.
- Введите имя пользователя и пароль.
- Если на вашем маршрутизаторе есть Мастер настройки, запустите его и выберите задачу «Настройка виртуального сервера». Или же попробуйте найти такую функцию в разделах настроек «Межсетевой экран (Брандмауэр, firewall).
- В появившихся окнах задайте все необходимые параметры сервера. Как правило, это:
- Интерфейс. Здесь нужно выбрать соединение для связи между компьютерами.
- Внутренний IP. Это адрес сервера в местной сети.
- Внешний (удалённый) IP. Адрес сервера, с которого будет осуществляться доступ.
- Имя настройки. Имя для набора параметров.
- Сохраните введённые настройки.
Такой подход позволяет создать перенаправление средствами роутера. Он применим к любой операционной системе, в том числе, к Убунту Сервер.
С использованием hamachi
Этот способ ориентирован именно на Ubuntu, где проброс портов будет выполняться с помощью Hamachi. Хамачи позволяет построить VPN. Другими словами — это программа для работы с виртуальными частными сетями.
Допустим, в разных сетях существует группа удалённых друг от друга ПК, а связь в сети выполняется через VPN Hamachi. Сама программа должна быть установлена на сервере. После этого можно настраивать проброс портов.
Идея в том, что ПК из других локальных сетей будут обращаться напрямую только к серверу. Он, в свою очередь, будет перенаправлять их на нужный ПК внутри сети, на котором будет находиться необходимый порт.
Для выполнения инструкций потребуется компьютер с установленной Ubuntu Server.
Установка Хамачи. Для начала, загрузите пакет с официального сайта:
wget https://secure.logmein.com/labs/logmein-hamachi_2.1.0.119-1_amd64.deb
Инсталлируйте нужный пакет:
sudo apt-get install lsb
Теперь проведите сборку пакета, который был загружен:
dpkg -i logmein-hamachi_2.1.0.119-1_amd64.deb
Можно запустить соответствующую службу, а также саму программу:
service logmein-hamachi starthamachi login
Присвойте личному компьютеру имя в Хамачи. После этого подключитесь к нужной сети:
hamachi set-nick $NAME.hamachi join $NAME_NETWORK
Введите все нужные данные для доступа к сети.
Теперь рассмотрим, как на базе созданного подключения прокинуть порт. Воспользуемся утилитой Rinetd. Для начала нужно загрузить саму утилиту:
sudo apt-get install rinetd
Теперь в файлы конфигурации потребуется внести изменения:
nano /etc/rinetd.conf
Сам файл, открываем при помощи редактора nano. В конце документа нужно добавить строчку:
(IP-интерфейса сервера) (прослушиваемый порт) (адрес внешнего ПК) (порт внешнего ПК)
Вставлять значения нужно без скобок, с пробелами. Для каждого подключения нужно добавить свою строку, по порядку. Теперь нужно выполнить перезапуск службы:
service rinetd restart
Теперь потребуется отключить межсетевой экран:
sudo ufw disable
Вот и всё. В завершение процесса нужно перезагрузить сервер, после чего можно проверить подключения. Проброшенный трафик можно будет контролировать при помощи дополнительных утилит.
С использованием squid
Squid — это прокси-сервер для Ubuntu. Мы уже рассматривали, как прокинуть порт на Ubuntu Сервер, Squid — также хороший инструмент для этого. Он поможет, когда необходим максимальный контроль сетевого трафика. Squid можно установить по команде:
sudo apt-get install squid3
Настройка программы выполняется правкой директив, расположенных в файле:
/etc/squid/squid.conf
О других особенностях использования Squid вы сможете узнать на официальном сайте.
Заключение
Проброс портов оказался не так уж и сложен, не правда ли? Убунту Сервер имеет ещё много возможностей по управлению сервером. Если у вас есть вопросы по другим программам для Убунту, и вы не знаете, кого спросить — задайте их в х к этой статье!
Источник: https://nastroyvse.ru/opersys/lix/kak-sdelat-probros-portov-ubuntu-server.html
Как настроить ufw для перенаправления трафика 80/443 на внутренний сервер, размещенный в локальной сети
Я использую UFW для защиты своей сети. Как перенаправить TCP HTTP-порт # 80 и 443 на внутренний сервер, размещенный по адресам 192.168.1.100:80 и 192.168.1.100:443, используя UFW на сервере Ubuntu Linux?
UFW — акроним для несложного брандмауэра.
Он используется для управления брандмауэром Linux и предназначен для обеспечения простого в использовании интерфейса для пользователя.
В этом учебном руководстве вы узнаете, как перенаправить входящий трафик на ваш сервер с ufw по порту 80/443 на порт 80/443 на другом внутреннем сервере, размещенном в вашей локальной сети / VLAN .
Наш пример
Предположим, вы хотите переслать запросы, отправляемые на {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 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
/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 -o eth0 -j MASQUERADE |
или
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -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
$ sudo vi etc/ufw/before.rules |
Затем настройте ufw для перенаправления http-трафика на другой (LAN) IP: порт. В верхнем файле добавьте:
*nat
:PREROUTING ACCEPT [0:0]
# 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
*nat:PREROUTING ACCEPT [0:0]# 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 MASQUERADECOMMIT |
Сохраните и закройте файл. Измените /etc/sysctl.conf:
$ sudo vi /etc/sysctl.conf
$ sudo vi /etc/sysctl.conf |
Установите / отредактируйте следующим образом:
Net.ipv4.ip_forward = 1
Сохраните и закройте файл. Обновить изменения:
$ sudo sysctl -p
Наконец, перезапустите брандмауэр, чтобы включить маршрутизацию:
$ sudo systemctl restart ufw
$ 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 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
$ sudo ufw status$ sudo iptables -t nat -L -n -v |
Наконец, убедитесь, что в вашем домене указанаDNS ‘a’ запись , установлена на 202.54.1.1.
Услуги администрирования серверов, настройка сети, [email protected]
Источник: https://itfb.com.ua/kak-nastroit-ufw-dlya-perenapravleniya-porta-80-443-na-vnutrennij-server-razmeshhennyj-v-lokalnoj-seti/
Проброс портов iptables в Linux
С увеличением количества компьютеров, необходимое количество IP адресов увеличивалось и диапазона IPv4 начало не хватать. Тогда была разработана технология NAT, которая позволяет нескольким компьютерам объединяться в локальную сеть и быть доступными из внешней сети по IP адресу маршрутизатора.
Когда пакет приходит на маршрутизатор, выполняется выяснение какому устройству он был адресован и замена ip адресата на нужный. Кроме переопределения IP получателя и отправителя, NAT может изменять порты.
Это называется проброс портов и может быть полезно если вы создали частную сеть, но все же хотите пропускать некоторые виды трафика. Всем этим можно управлять с помощью iptables.
В этой статье мы рассмотрим как выполняется проброс портов iptables в Linux.
Как работает NAT?
Чтобы иметь возможность общаться с другими компьютерами в сети компьютер должен иметь уникальный ip адрес. Но поскольку количество адресов уменьшалось нужно было придумать технологию, которая позволяла бы давать один адрес нескольким машинам. И была придумана технология NAT или Network Address Translation.
Все работает очень просто. Компьютер имеет свой адрес в локальной сети, он не виден из интернета.
Когда ему нужно отправить пакет, он отправляет его роутеру, затем роутер подменяет адрес отправителя на свой и передает пакет дальше к цели.
Параллельно роутер запоминает с какого локального компьютера был отправлен пакет на этот адрес. Дальше ответный пакет приходит роутеру, он подменяет адрес назначения на адрес нужного компьютера и отдает пакет в локальную сеть.
Недостаток в том, что инициировать подключение извне нельзя, потому что маршрутизатор просто еще не знает к кому обращаются. Тут на помощь приходит проброс портов.
Мы можем сказать роутеру: при поступлении пакетов на порт 80 перенаправлять их на порт 80 компьютера 192.168.1.2. Теперь адрес отправителя и порт будет заменяться на указанный нами и пакет будет передан туда, куда нужно.
Если на маршрутизаторе установлен Linux, то все это можно настроить с помощью iptables.
Проброс портов в iptables
- Первое что нужно сделать, это включить переадресацию трафика на уровне ядра, если это еще не сделано. Для этого выполните:
- echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
- Чтобы настройка сохранялась после перезагрузки используйте такую команду:
sudo sysctl -w net.ipv4.ip_forward=1
Мы не будем здесь подробно рассматривать правила iptables и значение каждой опции, поэтому перед тем, как читать дальше вам лучше ознакомиться со статьей iptables для начинающих. Дальше рассмотрим проброс портов iptables nat.
Настройка прохождения пакетов
Сначала мы рассмотрим как разрешить прохождение пакетов через маршрутизатор. Для этого в брандмауэре есть цепочка FORWARD. По умолчанию для всех пакетов применяется правило DROP, которое означает что все нужно отбросить. Сначала разрешим инициализацию новых соединений, проходящих от eth0 до eth1. Они имеют тип contrack и представлены пакетом SYN:
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp —syn —dport 80 -m conntrack —ctstate NEW -j ACCEPT
Действие ACCEPT означает, что мы разрешаем это соединение. Но это правило разрешает только первый пакет, а нам нужно пропускать любой следующий трафик в обоих направлениях для этого порта (80). поэтому добавим правила для ESTABLIHED и RLEATED:
- sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT - Дальше явно установим что наша политика по умолчанию — DROP:
- sudo iptables -P FORWARD DROP
Это еще не проброс портов, мы только разрешили определенному трафику, а именно на порт 80, проходить через маршрутизатор на другие машины локальной сети. Теперь настроим правила, которые будут отвечать за перенаправление трафика.
Модификация пакетов в iptables
Далее мы настроим правила, которые будут указывать как и куда нужно перенаправить пакеты, приходящие на порт 80. Сейчас маршрутизатор может их пропускать в сеть, но он еще не знает куда. Для этого нам нужно будет настроить две вещи — модификацию адреса назначения (Destination) DNAT и модификацию адреса отправителя (Source) SNAT.
Правила DNAT настраиваются в цепочке PREROUTING, в таблице NAT. Эта операция изменяет адрес назначения пакета чтобы он достиг нужной нам цели, когда проходит между сетями. Клиенты будут отправлять пакеты нашему маршрутизатору, и им не нужно знать топологию внутренней сети. Пакет автоматически будет приходить нашему веб-серверу (192.168.1.2).
С помощью этого правила мы перенаправляем все пакеты, пришедшие на порт 80, к 192.168.1.2 опять же на порт 80:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp —dport 80 -j DNAT —to-destination 192.168.1.2
Но это только половина работы. Пакет будет иметь исходный адрес клиента, а значит будет пытаться отправить ответ ему.
Так как клиент ожидает получить ответ от маршрутизатора, то нормального TCP соединения не получиться. Чтобы решить эту проблему нужно модифицировать адрес источника и заменить его на адрес маршрутизатора 192.
168.1.1. Тогда ответ придет маршрутизатору, а тот уже от своего имени передаст его в сеть.
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 80 -d 192.168.1.2 -j SNAT —to-source 192.168.1.1
Если вы хотите перенаправить трафик на порт 8080, то нужно указать его после ip адреса:
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 80 -d 192.168.1.2 -j SNAT —to-source 192.168.1.1:8080
Также может понадобиться выполнить проброс диапазона портов iptables, для этого просто укажите диапазон, например, 1000:2000:
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp —dport 1000:2000 -d 192.168.1.2 -j SNAT —to-source 192.168.1.1
После добавления этого правила можете проверять работу перенаправление портов iptables будет выполняться и все будет отправляться так, как нужно.
Сохранение настроек iptables
Теперь, когда все настроено, нужно сохранить этот набор правил, чтобы он загружался автоматически при каждом старте. Для этого выполните:
sudo service iptables-persistent save
Готово. Теперь проброс портов iptables ubuntu будет работать так, как нужно.
Выводы
В этой статье мы рассмотрели как выполняется перенаправление портов iptables. Процесс включает в себя разрешение на проходящий трафик на уровне ядра, разрешение определенного типа трафика, а также настройку адресов источника и назначения для правильного прохождения пакетов.
На завершение, видео о том, что такое NAT:
Источник: https://losst.ru/probros-portov-iptables-v-linux
Как в Linux сделать проброс портов?
Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью iptables.
Порты в Linux
Как мы уже знаем, каждое устройство (компьютер, ноутбук, мобильный телефон, и т.д.) в сети имеет свой собственный IP-адрес.
Он уникален для каждого отдельного устройства и дает возможность организовывать сетевые соединения между устройствами. Тем не менее, на отдельном устройстве может быть запущено несколько сетевых приложений одновременно.
Порты предоставляют возможность идентифицировать такие сетевые приложения на отдельно взятом компьютере.
Порт — это числовой идентификатор программы или процесса, которые обслуживают сетевые соединения на заданном сетевом адресе (IP-адресе).
Например, некоторые Интернет-сервера имеют несколько одновременно работающих сетевых приложений, таких как веб-сервер (для организации доступа к веб-сайтам на этом сервере), почтовый сервер (для организации получения и отправки сообщений электронной почты) и FTP-сервер (для передачи файлов). Самому физическому серверу в данном случае назначен его уникальный IP-адрес, но если мы попытаемся создать соединение с сервером только по его IP, возникнет проблема неоднозначности — мне не знаем с каким именно приложением мы должны соединиться для обмена данными.
Проброс портов в Linux
На шлюз приходит пакет, который мы должны перенаправить на нужный сервер в локальной сети перед принятием решения о маршрутизации, то есть — в цепочке PREROUTING таблицы nat.
Проверка диска на ошибки в Linux
iptables -t nat -A PREROUTING —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
Перенаправление портов в Linux
Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту.
Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT.
Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
#!/bin/bash
EXT_IP=»xxx.xxx.xxx.xxx» # внешний, реальный IP-адрес шлюза;
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_PORT
iptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j SNAT —to-source $INT_IP
iptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j ACCEPT
Предположим, у вас есть веб-сервер в локальной сети, который должен быть доступным из дикого интернета только по https (443/tcp). Причин не использовать VPN или отдельный IP для отдельного сервера может быть много. Например, архитектура сети, отсутствие свободных IP, веб-сервер — гостевая виртуальная машина, а наш шлюз — хост )) Ну, не знаю, сами придумайте ситуацию.
Linux установка даты и времени
Причем мы хитрые и хотим, чтобы наш веб сервер из интернета не был виден на 443 порту, а был доступен, скажем, на 1293 порту (примерно вот так: https://1.2.3.4:1293). Итак, мы хотим перенаправить входящие из интернет на порт 1293 на порт 443 сервера в локальной сети.
IPT=»/sbin/iptables»
IF_EXT=»eth0″ # Внешний сетевой адаптер
IF_INT=»eth1″ # Внутренний сетевой адаптер
IP_EXT=»1.2.3.4″ # Внешний IP
IP_INT=»192.168.1.1″ # Внутренний IP
FAKE_PORT=»1293″ # Фейковый порт, доступен из интернет
LOCAL_SRV=»192.168.1.28″ # Web сервер в LAN
SRV_PORT=»443″ # Настоящий порт
# NAT
$IPT -t nat -A PREROUTING -i $IF_EXT -p tcp -d $IP_EXT —dport $FAKE_PORT -j DNAT —to $LOCAL_SRV:$SRV_PORT
# FORWARD
$IPT -A FORWARD -i $IF_EXT -o $IF_INT -d $LOCAL_SRV -p tcp —dport $SRV_PORT -j ACCEPT
Перенаправление с одного ip на другой в Linux
Не всегда перенаправление совершается из/в локальную сеть. Бывает, что необходимо сделать проброс соединения на какой-то сервер, используя промежуточный.
Это может быть необходимо для дополнительной фильтрации подключаемых клиентов, для разделения нагрузки и других задач. Есть хост с публичным IP-адресом (1.1.1.
1), ему может быть сопоставлено доменное имя, для которого могут быть выпущены SSL-сертификаты и прочее.
Нужно, чтобы клиенты, обращающиеся на 1.1.1.1:25, направлялись бы на 2.2.2.2:25, с 1.1.1.1:443 — на 3.3.3.3:443, а с ip 4.4.4.4 обращения на порт 3535 шли бы на 3.3.3.3:22. 1.1.1.1, 2.2.2.2, 3.3.3.
3 — это публичные IP-адреса (а могут быть и внутренними, не важно, могут быть от разных ISP и вообще, в разных местах).
Подключающимся клиентам это знать незачем, не придется ничего перенастраивать в почтовых программах и т.п.
- #!/bin/sh
- IF_EXT=»eth0″
IPT=»/sbin/iptables» - # flush
$IPT —flush
$IPT -t nat —flush
$IPT -t mangle —flush
$IPT -X - # loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT - # default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP - # allow forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# NAT
$IPT -t nat -A PREROUTING -i $IF_EXT -p tcp —dport 25 -j DNAT —to 2.2.2.2:25
$IPT -t nat -A PREROUTING -i $IF_EXT -p tcp —dport 443 -j DNAT —to 3.3.3.3:443
$IPT -t nat -A PREROUTING -i $IF_EXT -p tcp -s 4.4.4.4 —dport 3535 -j DNAT —to 3.3.3.3:22
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
# FORWARD
$IPT -A FORWARD -m state —state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_EXT -s 4.4.4.4 -d 3.3.3.3 -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_EXT -d 2.2.2.2 -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_EXT -d 3.3.3.3 -j ACCEPT
- # log
#$IPT -A FORWARD -j LOG —log-prefix » —FORWARD-LOG— « - # INPUT
$IPT -A INPUT -p tcp ! —syn -m state —state NEW -j DROP
$IPT -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT - # ssh
$IPT -A INPUT -p tcp —dport 22 -j ACCEPT - # OUTPUT
$IPT -A OUTPUT -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT
Если что-то не так, вы должны понимать, что пакет все же пришел на 1.1.1.1:25. А вот потом не ушел. Он не должен попасть никуда, кроме FORWARD.
Поэтому для отлова отбрасываемого трафика в цепочке FORWARD раскомментируйте правило лога (есть в примере) и просматривайте события в реальном времени (например, «tail -f /var/log/messages»). В соответствии с тем, что вы увидите в логе, испрвьте ваши правила iptables.
Все должно получиться. Когда это произойдет, не забудьте выключить логирование (иначе размер лог-файла станет огромным).
Как подсчитать количество файлов в папке?
Источник: https://www.linux16.ru/articles/kak-v-linux-sdelat-probros-portov.html
Проброс и перенаправление портов в iptables
Проброс трафика за NAT или проброс трафика на другой сервер
Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью iptables.
Определимся с переменными, которые будут использоваться в статье:
$EXT_IP — внешний, реальный IP-адрес шлюза;$INT_IP — внутренний IP-адрес шлюза, в локальной сети;$LAN_IP — внутренний IP-адрес сервера, предоставляющего службы внешнему миру;$SRV_PORT — порт службы. Для веб-сервера равен 80, для SMTP — 25 и т.д.;eth0 — внешний интерфейс шлюза. Именно ему присвоен сетевой адрес $EXT_IP;eth1 — внутренний интерфейс шлюза, с адресом $INT_IP;
Проброс портов
На шлюз приходит пакет, который мы должны перенаправить на нужный сервер в локальной сети перед принятием решения о маршрутизации, то есть — в цепочке PREROUTING таблицы nat.
iptables -t nat -A PREROUTING —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP |
Рассмотрим пример
iptables -t nat -A PREROUTING —dst 1.2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.1.50 |
Если входящий пакет пришёл извне на шлюз (1.2.3.4), но предназначен веб-серверу (порт 80), то адрес назначения подменяется на локальный адрес 192.168.1.50. И впоследствии маршрутизатор передаст пакет в локальную сеть.
Дальше принимается решение о маршрутизации. В результате пакет пойдёт по цепочке FORWARD таблицы filter, поэтому в неё надо добавить разрешающее правило. Оно может выглядеть, например, так:
iptables -I FORWARD 1 -i eth0 -o eth1 -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j ACCEPT |
Рассмотрим пример
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.0.22 -p tcp -m tcp —dport 80 -j ACCEPT |
Пропустить пакет, который пришёл на внешний интерфейс, уходит с внутреннего интерфейса и предназначен веб-серверу (192.168.1.50:80) локальной сети.
С одной стороны, этих двух правил уже достаточно для того, чтобы любые клиенты за пределами локальной сети успешно подключались к внутреннему серверу. С другой — а что будет, если попытается подключиться клиент из локальной сети? Подключение просто не состоится: стороны не поймут друг друга.
Допустим, 192.168.1.31 — ip-адрес клиента внутри локальной сети.
- Пользователь вводит в адресную строку браузера адрес example.com;
- Сервер обращается к DNS и разрешает имя example.com в адрес 1.2.3.4;
- Маршрутизатор понимает, что это внешний адрес и отправляет пакет на шлюз;
- Шлюз, в соответствии с нашим правилом, подменяет в пакете адрес 1.2.3.4 на 192.168.1.50, после чего отправляет пакет серверу;
- Веб-сервер видит, что клиент находится в этой же локальной сети (обратный адрес пакета — 192.168.1.31) и пытается передать данные напрямую клиенту, в обход шлюза;
- Клиент игнорирует ответ, потому что он приходит не с 1.2.3.4, а с 192.168.1.50;
- Клиент и сервер ждут, но связи и обмена данными нет.
Есть два способа избежать данной ситуации.
Первый — разграничивать обращения к серверу изнутри и извне, для этого создать на локальном DNS-сервере А-запись для example.com указывающую на 192.168.1.50
Второй — с помощью того же iptables заменить обратный адрес пакета.Правило должно быть добавлено после принятия решения о маршрутизации и перед непосредственной отсылкой пакета. То есть — в цепочке POSTROUTING таблицы nat.
iptables -t nat -A POSTROUTING —dst $LAN_IP -p tcp —dport $SRV_PORT -j SNAT —to-source $INT_IP |
Рассмотрим пример
iptables -t nat -A POSTROUTING —dst 192.168.1.50 -p tcp —dport 80 -j SNAT —to-source 192.168.1.1 |
Если пакет предназначен веб-серверу, то обратный адрес клиента заменяется на внутренний адрес шлюза.Этим мы гарантируем, что ответный пакет пойдёт через шлюз.
Надо дополнительно отметить, что это правило важно только для внутренних клиентов. Ответ внешним клиентам пойдёт через шлюз в любом случае.
Но, пока что, для нормальной работы этого недостаточно. Предположим, что в качестве клиента выступает сам шлюз.В соответствии с нашими предыдущими правилами он будет гонять трафик от себя к себе и представлять исходящие пакеты транзитными.
Исправляем это:
iptables -t nat -A OUTPUT —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP |
Рассмотрим пример
iptables -t nat -A OUTPUT —dst 1.2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.1.50 |
Теперь для удобства запилим скрипт, чтобы не прописывать правила каждый раз вручную.
rules.sh
EXT_IP=»xxx.xxx.xxx.xxx» INT_IP=»xxx.xxx.xxx.xxx» EXT_IF=eth0 INT_IF=eth1 LAN_IP=$1 SRV_PORT=$2 iptables -t nat -A PREROUTING —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IPiptables -t nat -A POSTROUTING —dst $LAN_IP -p tcp —dport $SRV_PORT -j SNAT —to-source $INT_IPiptables -t nat -A OUTPUT —dst $EXT_IP -p 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 |
Теперь, чтобы обеспечить доступ извне к локальному FTP по адресу 192.168.1.52, достаточно набрать в консоли от имени супер-пользователя:
./rules.sh 192.168.1.52 20,21 |
Перенаправление портов
- Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту.
- Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT.
- Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
EXT_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 |
Источник: https://bogachev.biz/2016/01/13/probros-i-perenapravlenie-portov-v-iptables/
Проброс портов (port forwarding) в Linux используя iptables
В этой статье поговорим о том, как можно перенаправить трафик с IP адреса (белого) на другой IP адрес (серый) использую утилиту iptables.
Начальные данные
У нас имеется компьютер под управлением linux, выступающий в роли маршрутизатора с одним внешним интерфейсом enp0s3 для доступа в Интернет (80.81.82.83) и внутренним enp0s8 интерфейсом Локальной сети (10.0.7.1). Требуется пробросить tcp порт (2121) с белого ip-адреса на серый ip-адрес Локальной сети порт (21).
Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp и т.д.), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью утилиты iptables.
Алгоритм проброса портов в iptables
В принципе все довольно просто, необходимо добавить всего два правила в таблицу маршрутизации iptables. Но для начала нам нужно включить форвардинг пакетов на нашем сервере:
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Для автоматического включения открываем файл /etc/sysctl.conf и ищем там строку #net.ipv4.ip_forward=1, убираем знак .
sudo nano /etc/sysctl.conf net.ipv4.ip_forward=1
Настройка port forwarding на Linux
Итак, приступим. Для выполнения поставленной задачи, перенаправление порта 2222 на порт 22 другой машины, необходимо добавить следующие правила iptables:
sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
Это правило разрешает прохождение входящих пакетов внутрь сети.
Теперь опишем форвардинг (forwarding) пакетов:
sudo iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 —dport 2222 -j DNAT —to-destination 10.0.7.2:22sudo iptables -t nat -A POSTROUTING -p tcp -s 10.0.7.2 —sport 22 -j SNAT —to-source 80.81.82.83:2222
- Первая строка подменяет IP адрес приемника (белый IP) на внутренний (серый IP)
- Вторая адрес отправителя (серый IP) на внешний (белый IP).
- 10.0.7.2 — IP адрес машины в локальной сети, на который перенаправляет трафик.
- 80.81.82.83 — внешний IP адрес нашего сервера.
Для сохранения наших правил необходимо создать файл и подгружать его при каждой перезагрузки системы, иначе правила iptables которые мы написали слетять. Для этого набираем в терминале следующее:
sudo nano /etc/nat
содержимое файла:
#!/bin/sh # Перенаправляем ssh с 2222 на 22 IP-10.0.7.2 iptables -t nat -A PREROUTING -p tcp -d 80.81.82.83 —dport 2222 -j DNAT —to-destination 10.0.7.2:22
iptables -t nat -A POSTROUTING -p tcp -s 10.0.7.2 —sport 22 -j SNAT —to-source 80.81.82.83:2222
Далее открываем файл interfaces
sudo nano /etc/network/interfaces
И добавляем в конце следующую строчку:
pre-up /etc/nat
Данное выражение подгрузить правила iptables после перезагрузки системы.
Как посмотреть правила iptables
Посмотреть текущие правила iptables можно с помощью команды:
sudo iptables -L -t nat
Пример:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp — anywhere 80.81.82.83 tcp dpt:2222 to:10.0.7.2:22
Chain POSTROUTING (policy ACCEPT)
SNAT tcp — 10.0.7.2 anywhere tcp spt:ssh to:80.81.82.83:2222
Вот и все, на этом рассмотрение проброса портов в операционных системах под управлением Linux с помощью iptables завершено.
Источник: https://obu4alka.ru/probros-portov-port-forwarding-v-linux-ispolzuya-iptables.html
Серверная » Проброс и перенаправление портов средствами iptables
Допустим, мы находимся в локальной сети и от внешнего мира отделены шлюзом под управлением Linux.
В этой же локальной сети находятся сервера, которые должны предоставлять услуги внешнему миру. Например, web-сервер, ftp, почтовый сервер или все вместе одновременно.
Понятно, что доступ извне должен осуществляться через внешний адрес шлюза. И в зависимости от типа входящего соединения (которое определяется портом, например 80 — веб сервер, 21 — FTP), шлюз должен перенаправлять его на соответствующий сервер локальной сети.
Это и есть проброс портов.
Рассмотрим, как реализовать его средствами iptables.
Вначале договоримся о сокращениях и умолчаниях:
$EXT_IP — внешний, реальный IP-адрес шлюза
$INT_IP — внутренний IP-адрес шлюза, в локальной сети
$LAN_IP — внутренний IP-адрес сервера, предоставляющего службы внешнему миру
$SRV_PORT — порт службы. Для веб-сервера равен 80, для SMTP — 25 и т.д.
eth0 — внешний интерфейс шлюза. Именно ему присвоен сетевой адрес $EXT_IP
eth1 — внутренний интерфейс шлюза, с адресом $INT_IP
А для облегчения понимания, в таких блоках будем рассматривать конкретную ситуацию:
1.2.3.4 — внешний адрес шлюза
192.168.0.1 — внутренний адрес шлюза
В локальной сети работает веб-сервер (порт 80) для сайта webname.dom
192.168.0.22 — внутренний адрес веб-сервера
Проброс портов
Итак, пакет пришёл на шлюз. Мы должны перенаправить его на нужный сервер локальной сети перед принятием решения о маршрутизации, то есть — в цепочке PREROUTING таблицы nat.
iptables -t nat -A PREROUTING —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
iptables -t nat -A PREROUTING —dst 1.2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.22
Читай: если входящий пакет пришёл извне на шлюз (1.2.3.4), но предназначен веб-серверу (порт 80), то адрес назначения подменяется на локальный адрес 192.168.0.22. И впоследствии маршрутизатор передаст пакет в локальную сеть.
Дальше принимается решение о маршрутизации. В результате пакет пойдёт по цепочке FORWARD таблицы filter, поэтому в неё надо добавить разрешающее правило. Оно может выглядеть, например, так:
iptables -I FORWARD 1 -i eth0 -o eth1 -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j ACCEPT
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.0.22 -p tcp -m tcp —dport 80 -j ACCEPT
Пропустить пакет, который пришёл на внешний интерфейс, уходит с внутреннего интерфейса и предназначен веб-серверу (192.168.0.22:80) локальной сети.
С одной стороны, этих двух правил уже достаточно для того, чтобы любые клиенты за пределами локальной сети успешно подключались к внутреннему серверу. С другой — а что будет, если попытается подключиться клиент из локальной сети? Подключение просто не состоится: стороны не поймут друг друга.
Допустим, 192.168.0.333 — ip-адрес клиента внутри локальной сети.
- сотрудник вводит в адресную строку браузера адрес webname.dom
- компьютер обращается к DNS и разрешает имя webname.dom в адрес 1.2.3.4
- маршрутизатор понимает, что это внешний адрес и отправляет пакет на шлюз
- шлюз, в соответствии с нашим правилом, подменяет в пакете адрес 1.2.3.4 на 192.168.0.22, после чего отправляет пакет серверу
- веб-сервер видит, что клиент находится в этой же локальной сети (обратный адрес пакета — 192.168.0.333) и пытается передать данные напрямую клиенту, в обход шлюза
- клиент игнорирует ответ, потому что он приходит не с 1.2.3.4, а с 192.168.0.22
- клиент и сервер ждут, ведут себя как «две целки на морозе», связи и обмена данными нет
Есть два способа избежать подобной ситуации.
Первый — чётко разграничивать обращения к серверу изнутри и извне.
Создать в локальном DNS-сервере A-запись для webname.dom, указывающую на 192.168.0.22.
Второй — с помощью того же iptables заменить обратный адрес пакета.
Правило должно быть добавлено после принятия решения о маршрутизации и перед непосредственной отсылкой пакета. То есть — в цепочке POSTROUTING таблицы nat.
iptables -t nat -A POSTROUTING —dst $LAN_IP -p tcp —dport $SRV_PORT -j SNAT —to-source $INT_IP
iptables -t nat -A POSTROUTING —dst 192.168.0.22 -p tcp —dport 80 -j SNAT —to-source 192.168.0.1
Если пакет предназначен веб-серверу, то обратный адрес клиента заменяется на внутренний адрес шлюза.
Этим мы гарантируем, что ответный пакет тоже пойдёт через шлюз.
Надо дополнительно отметить, что это правило важно только для внутренних клиентов. Ответ внешним клиентам пойдёт через шлюз в любом случае.
Но, пока что, для нормальной работы этого недостаточно. Предположим, что в качестве клиента выступает сам шлюз.
В соответствии с нашими предыдущими правилами он будет гонять трафик от себя к себе же и представлять исходящие пакеты транзитными. Так и с ума сойти недолго. Исправляем это:
iptables -t nat -A OUTPUT —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
iptables -t nat -A OUTPUT —dst 1.2.3.4 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.22
Вот теперь — всё. Получившийся результат можно оформить в виде скрипта, чтобы не делать каждый раз всё вручную.
Кстати.
Если подключение к сети интернет осуществляется, например, через pppoe, то внешним интерфейсом будет pppN, он и должен быть вписан в правила iptables. Потому что в этом случае интерфейс eth0 будет использоваться только для установки связи с pppoe-сервером.
script.sh
#!/bin/bash
EXT_IP=»xxx.xxx.xxx.xxx» # Он всё равно чаще всего один и тот же.
INT_IP=»xxx.xxx.xxx.xxx» # См. выше.
EXT_IF=eth0 # Внешний и внутренний интерфейсы.
INT_IF=eth1 # Для шлюза они вряд ли изменятся, поэтому можно прописать вручную.
LAN_IP=$1 # Локальный адрес сервера передаём скрипту первым параметром,
SRV_PORT=$2 # а тип сервера, в смысле какой порт (или набор портов) открывать — вторым
# Здесь желательно сделать проверку ввода данных, потому что операции достаточно серьёзные.
iptables -t nat -A PREROUTING —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
iptables -t nat -A POSTROUTING —dst $LAN_IP -p tcp —dport $SRV_PORT -j SNAT —to-source $INT_IP
iptables -t nat -A OUTPUT —dst $EXT_IP -p tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j ACCEPT
Теперь, чтобы обеспечить доступ извне к локальному FTP по адресу 192.168.0.56, достаточно набрать в консоли от имени суперпользователя:
./script.sh 192.168.0.56 20,21
Экономия времени и сил налицо.
Перенаправление портов
Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту.
Конечно, можно заставить сам веб-сервер слушать нестандартный порт, но если он используется рядовыми сотрудниками внутри локальной сети, то мы элементарно столкнёмся с человеческим фактором.
Сотрудникам будет очень тяжело объяснить, что теперь для доступа к корпоративному сайту надо после его имени вводить набор цифр через двоеточие.
- Именно из-за человеческого фактора перенаправление портов используется, в основном, специалистами, для удалённого администрирования.
- Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT.
- Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
#!/bin/bash
EXT_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_PORT
iptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j SNAT —to-source $INT_IP
iptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp —dport $SRV_PORT -j DNAT —to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp —dport $SRV_PORT -j ACCEPT
По сути изменилась только первая строчка, поскольку только она отвечает за первичную обработку входящих пакетов. Дальше всё следует по стандартной процедуре таблиц и цепочек правил.
Изменения в остальных правилах сделаны для наглядности и их сути не меняют.
Источник: http://www.it-simple.ru/?p=2250