Справка - Поиск - Участники - Войти - Регистрация
Полная версия: Проброс порта
Частный клуб Алекса Экслера > Наши сети притащили
aik
4 марта 2016, 09:08
Я не особый специалист по маршрутизации, потому нужна помощь.

Есть компьютер с линуксом и реальным ip (1.2.3.4), есть ip-камера с приватным ip (192.168.248.250).
Нужно из интернета получить доступ к админке камеры. То есть, хочется стучаться, допустим, на 801 порт линукса и попадать на 80 порт камеры.

Как реализовать? Что-то найденными строчками из гугла реализовать не получается.
ViolatorDM
4 марта 2016, 09:23

aik написал: Есть компьютер с линуксом и реальным ip

Прямо в этот ПК Интернет приходит? Без маршрутизатора?
Тогда на ПК надо какой-нибудь прокси-сервер поднимать, который будет входящие запросы на порт обрабатывать.
aik
4 марта 2016, 09:30

ViolatorDM написал:
Прямо в этот ПК Интернет приходит? Без маршрутизатора?

Да, прямо в этот ПК.


ViolatorDM написал:
Тогда на ПК надо какой-нибудь прокси-сервер поднимать, который будет входящие запросы на порт обрабатывать.

А iptables или что-то подобное для проброса портов не годится?
ViolatorDM
4 марта 2016, 10:29

aik написал: А iptables или что-то подобное для проброса портов не годится?

Годится
aik
4 марта 2016, 10:40

ViolatorDM написал:
Годится

Да вот что-то не получается, пробовал я этот вариант.
alibek
4 марта 2016, 10:52

aik написал: Нужно из интернета получить доступ к админке камеры.

От камеры зависит.
На каких-то камерах достаточно прокинуть порт 80.
На каких-то нужно прокидывать 4-5 портов.
А на каких-то (обычно китайских) все далеко не тривиально.


aik написал: Как реализовать?

Если Linux и используется iptables, то примерно так (в виде bash-скрипта):
CODE

#!/bin/sh

IPT=`which iptables`

IF_INT=eth1 #LAN-интерфейс
IF_EXT=eth0 #WAN-интерфейс

IP_EXT=`ip -o -4 addr show dev $IF_EXT | sed -ne 's/.*inet \(.*\) brd.*/\1/p'`
IP_EXT=${IP_EXT%/*}

IP_CAM=192.168.248.250
NET_LOCAL=192.168.0.0/16 #Подсеть LAN

FW="$IPT -t filter"
NAT="$IPT -t nat"
MARK="$IPT -t mangle"


## Настройка фильтров по умолчанию
$FW -F
$FW -X
$FW -Z
$FW -P INPUT DROP
$FW -P OUTPUT ACCEPT
$FW -P FORWARD DROP


## Блокировать некорректные и поврежденные пакеты
$FW -N INVALID
$FW -A INVALID -p tcp ! --syn -m state --state NEW -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL ALL -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL NONE -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL SYN -m state --state ESTABLISHED -j DROP
$FW -A INVALID -p icmp --fragment -j DROP
$FW -A INVALID -m state --state INVALID -j DROP
$FW -A INVALID -d 255.255.255.255 -j DROP
$FW -A INVALID -j RETURN


## Правила фильтрации
$FW -A INPUT -i $IF_LOOP -j ACCEPT
$FW -A INPUT -j INVALID
$FW -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Блокировать недопустимые подсети на внешнем интерфейсе
$FW -A INPUT -i $IF_EXT    -s 10.0.0.0/8      -j DROP  # Private, class A
$FW -A INPUT -i $IF_EXT    -s 172.16.0.0/12   -j DROP  # Private, class B
$FW -A INPUT -i $IF_EXT    -s 192.168.0.0/16  -j DROP  # Private, class C
$FW -A INPUT -i $IF_EXT    -s 224.0.0.0/4     -j DROP  # Multicast, class D
$FW -A INPUT -i $IF_EXT    -s 240.0.0.0/5     -j DROP  # Reserved, class E
$FW -A INPUT -i $IF_EXT    -s 169.254.0.0/16  -j DROP  # Link-local
$FW -A INPUT -i $IF_EXT    -s 127.0.0.0/8     -j DROP  # Loopback

# Разрешить ICMP на внешнем интерфейсе
$FW -A INPUT -i $IF_EXT -p icmp --icmp-type 0 -j ACCEPT

# Дропнуть остальное, записать в лог
$FW -A INPUT -j LOG --log-prefix "INPUT DROP: "


## Правила трансляции

# Открыть порты на внешнем интерфейсе - скорее всего не нужно
#$FW -A FORWARD -i $IF_EXT -o $IF_INT -p tcp --dport 80 -j ACCEPT
#$FW -A FORWARD -i $IF_EXT -o $IF_INT -p tcp --dport 554 -j ACCEPT
#$FW -A FORWARD -i $IF_EXT -o $IF_INT -p tcp --dport 37777 -j ACCEPT
#$FW -A FORWARD -i $IF_EXT -o $IF_INT -p udp --dport 37778 -j ACCEPT

#Разрешить трансляции NAT
$FW -A FORWARD -i $IF_EXT -o $IF_INT -m state --state ESTABLISHED,RELATED -j ACCEPT
$FW -A FORWARD -i $IF_INT -o $IF_EXT -p icmp -j ACCEPT
$FW -A FORWARD -i $IF_INT -o $IF_EXT -p tcp  -j ACCEPT
$FW -A FORWARD -i $IF_INT -o $IF_EXT -p udp  -j ACCEPT

# Дропнуть остальное, записать в лог
$FW -A FORWARD -j LOG --log-prefix "FORWARD DROP: "

# Настроить трансляцию
$NAT -F
$NAT -X
$NAT -Z

# Проброс портов через PNAT
$NAT -A PREROUTING  -i $IF_EXT -p tcp -d $IP_EXT –-dport 801 -j DNAT –to-destination $IP_CAM:80

# NAT-трансляция для исходящего трафика LAN
$NAT -A POSTROUTING -i $IF_INT -o $IF_EXT -s $NET_LOCAL -j SNAT --to-source $IP_EXT


## Finish
$IPT -L -vnx

Проверить не на чем, но должно быть близко к истине.
aik
4 марта 2016, 10:59

alibek написал:
От камеры зависит.

длинк 7010


alibek написал:
IF_INT=eth1 #LAN-интерфейс
IF_EXT=eth0 #WAN-интерфейс

Вот это настораживает. У меня всего один интерфейс.
alibek
4 марта 2016, 11:59

aik написал: У меня всего один интерфейс. 

А как тогда камера подключена?
alibek
4 марта 2016, 12:00

aik написал: длинк 7010

На сайте написано, что она облачная.
То есть ей можно дать интернет и управлять через облако D-Link.
aik
4 марта 2016, 12:05

alibek написал:
А как тогда камера подключена?

Кабелем. smile.gif

Для простоты вопроса считайте, что от провайдера приходит кабель, втыкается в свитч. В нём камера с приватным ip и линуксосервер с реальным.


alibek написал:
То есть ей можно дать интернет и управлять через облако D-Link.

Мне не только управление надо, мне ещё и до видеопотока надо добраться. Напрямую, без длинковских облаков.
alibek
4 марта 2016, 12:27

aik написал: Для простоты вопроса считайте, что от провайдера приходит кабель, втыкается в свитч. В нём камера с приватным ip и линуксосервер с реальным.

В такой схеме правильно не сделать.
В таком случае на сервере нужно завести два IP-адреса на одном физическом интерфейсе. IP-адрес с внешним IP будет интерфейсом eth0, IP-адрес с внутренним IP будет псевдоинтерфейсом eth0:0.


aik написал: Мне не только управление надо, мне ещё и до видеопотока надо добраться.

Видеопоток — это скорее всего RTSP, порт 554.

Что-то типа такого:
CODE

#!/bin/sh

IPT=`which iptables`
FW="$IPT -t filter"
NAT="$IPT -t nat"
MARK="$IPT -t mangle"
IP_WAN=1.2.3.4
IP_LAN=192.168.248.254
IP_CAM=192.168.248.250
NET_LAN=192.168.0.0/16

$FW -F
$FW -X
$FW -Z
$FW -P INPUT DROP
$FW -P OUTPUT ACCEPT
$FW -P FORWARD DROP
$FW -N INVALID
$FW -A INVALID -p tcp ! --syn -m state --state NEW -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL ALL -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL NONE -j DROP
$FW -A INVALID -p tcp --tcp-flags ALL SYN -m state --state ESTABLISHED -j DROP
$FW -A INVALID -p icmp --fragment -j DROP
$FW -A INVALID -m state --state INVALID -j DROP
$FW -A INVALID -d 255.255.255.255 -j DROP
$FW -A INVALID -j RETURN
$FW -A INPUT -i lo -j ACCEPT
$FW -A INPUT -j INVALID
$FW -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$FW -A INPUT -p icmp --icmp-type 0 -j ACCEPT
$FW -A INPUT -j LOG --log-prefix "INPUT DROP: "

$FW -A FORWARD ! -s $NET_LAN -d $NET_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
$FW -A FORWARD -s $NET_LAN ! -d $NET_LAN -p icmp -j ACCEPT
$FW -A FORWARD -s $NET_LAN ! -d $NET_LAN -p tcp  -j ACCEPT
$FW -A FORWARD -s $NET_LAN ! -d $NET_LAN -p udp  -j ACCEPT
$FW -A FORWARD -j LOG --log-prefix "FORWARD DROP: "

$NAT -F
$NAT -X
$NAT -Z
$NAT -A PREROUTING  -d $IP_WAN -p tcp –-dport 10010 -j DNAT –to-destination $IP_CAM:80
$NAT -A PREROUTING  -d $IP_WAN -p tcp –-dport 10011 -j DNAT –to-destination $IP_CAM:554
$NAT -A POSTROUTING -s $NET_LAN ! -d $NET_LAN -j SNAT --to-source $IP_WAN


На сервере должен быть прописан IP 1.2.3.4 (от провайдера) со шлюзом по умолчанию и IP 192.168.248.254/24.
На камере должен быть прописан IP 192.168.248.250/24, в качестве шлюза должен быть указан 192.168.248.254.
Веб-интерфейс камеры: http://1.2.3.4:10010
Видеопоток: rtsp://1.2.3.4:10011

Как вариант, можно на камере и на сервере включить UPnP, тогда камера сама все настроит.
Но я на серверах никогда не использовал UPnP, поэтому не скажу, как его включать.
aik
4 марта 2016, 12:42

alibek написал:
В такой схеме правильно не сделать.

Совсем никак?

Тут еще про ssh-туннели рассказывают, ковыряюсь, но пока не понял, какой стороной их куда втыкать. smile.gif


alibek написал:
В таком случае на сервере нужно завести два IP-адреса на одном физическом интерфейсе.

Это можно, приватных ip провайдер даст сколько угодно.


alibek написал:
Видеопоток — это скорее всего RTSP, порт 554.

Ссылка на поток - http://..../video/mjpg.cgi или как-то так. Так что у меня подозрение, что он всё же на 80 порту живёт.


alibek написал:
На камере должен быть прописан IP 192.168.248.250/24, в качестве шлюза должен быть указан 192.168.248.254.

Шлюзом у камеры стоит 248.1

Трасса от меня до камеры
:~> traceroute 192.168.248.250
traceroute to 192.168.248.250 (192.168.248.250), 30 hops max, 60 byte packets
1 * * *
2 grand22-router (192.168.73.119) 0.620 ms 0.622 ms 0.613 ms
3 webcam (192.168.248.250) 0.973 ms 1.086 ms 1.081 ms
alibek
4 марта 2016, 12:53

aik написал: Совсем никак?

Можно, я пример привел (два IP на интерфейсе).
Но это коряво и не очень правильно.
Правильно — разносить разные сегменты сети по разным интерфейсам.
Разная адресация в одном сегменте в принципе работает, но может быть подвержена трудно определяемым глюкам.


aik написал: Это реально, приватных ip можно просить сколько угодно.

Зачем просить? Просто использовать любые удобные IP-адреса.
По идее провайдер на порту доступа сам заблокирует все пакеты с приватным адресом отправителя,


aik написал: Ссылка на поток - http://..../video/mjpg.cgi или как-то так. Так что у меня подозрение, что он всё же на 80 порту живёт.

MJPEG это не лучший вариант.
Камера поддерживает H.264, лучше использовать его.
Адрес потока вроде как rtsp://IPADDRESS:PORT/live1.sdp


aik написал: Шлюзом у камеры стоит 248.1

Шлюзом у камеры должен быть указан линукс-сервер, чтобы сетевой трафик пошел именно через него и подвергся NAT-трансляции.
alibek
4 марта 2016, 12:55

aik написал: Трасса от меня до камеры

Э...
Это сильно отличается от "Для простоты вопроса считайте, что от провайдера приходит кабель, втыкается в свитч. В нём камера с приватным ip и линуксосервер с реальным.".
Если камера и сервер в разных сегментах, то настройки сильно зависят от схемы.
Так что нужна схема сети L2/L3.
alibek
4 марта 2016, 13:00

aik написал: Тут еще про ssh-туннели рассказывают, ковыряюсь, но пока не понял, какой стороной их куда втыкать.

Сильно сомневаюсь, чтобы камера это умела.
Если уж так хочется туннели, то можно использовать PPPoE (камера это умеет). Но обычно без этого вполне можно и нужно обойтись.
Chief
4 марта 2016, 13:19

alibek написал: Сильно сомневаюсь, чтобы камера это умела.

Это умеет линукс. От камеры этого и не надо. На то он и тонель...smile.gif
Но от второго ip в любом случае не отвертется...
Chief
4 марта 2016, 13:21

alibek написал: Но обычно без этого вполне можно и нужно обойтись.

Кстати не согласен.
ssh-тонель гораздо безопаснее прямого проброса портов...
И поднимать его специально не надо, надо поднять только ssh, дальше все делается с клиентской стороны.
aik
4 марта 2016, 13:38

alibek написал:
Зачем просить?

Ну так сеть-то провайдерская, а не моя. Так что всякие левые ip на интерфейсах, смотрящих наружу, будут заблокированы, как минимум. А могут и порт прикрыть до окончания разбирательства.


alibek написал:
MJPEG это не лучший вариант.

Это просто адрес скрипта, который видео отдаёт. Кодек там любой может быть.


alibek написал:
Это сильно отличается от "Для простоты вопроса

Я думал, что это упростит объяснение. Камера стоит на месте, сервер иногда переносят в пределах провайдерской сети. Его сетевые настройки при этом не меняется, провайдер где-то у себя маршрутизацию крутит по моей просьбе.


alibek написал:
Сильно сомневаюсь, чтобы камера это умела.

То есть для того, чтобы прокинуть для камеру ssh-туннель, на ней должен работать ssh-сервер, так?
aik
4 марта 2016, 13:42

alibek написал:
Если уж так хочется туннели, то можно использовать PPPoE (камера это умеет)

Кто такой pppoe я тоже не особо в курсе.
В конфигурации есть только имя и пароль. Подозреваю, что ip сервера либо намертво вшито в протокол, либо сервер ищется у себя в сегменте.
Chief
4 марта 2016, 13:57

aik написал: То есть для того, чтобы прокинуть для камеру ssh-туннель, на ней должен работать ssh-сервер, так?

Нет.
http://club443.ru/t/92400/p/22290351
Конкретно эти скрипты для RDP, но сменить порты не проблема, я полагаю.
Специально же тему поднимал...
aik
4 марта 2016, 14:22

Chief написал:
Конкретно эти скрипты для RDP, но сменить порты не проблема, я полагаю.

start putty.exe -v -ssh -2 -P 22 -C -l login -pw password -L 3393:192.168.1.2:3389 IP

Я так понимаю, что для линукса оно должно выглядеть примерно так?
ssh -L 801:192.168.248.250:80 aik@localhost

Если да, то не выходит.
Chief
4 марта 2016, 15:01

aik написал: Я так понимаю, что для линукса оно должно выглядеть примерно так?

Для сервера? Нет. На сервере нужен только поднятый ssh, это батник именно для КЛИЕНТСКОЙ машины.
То есть для любой сторонней.
ssh-тонель не надо отдельно настраивать, надо только иметь данные по логину паролю (или логин и ключ), внешний ip и соответственно, внутренний, куда подключаемся. Ну и порт, понятное дело. Поднятый ssh-сервер АВТОМАТИЧЕСКИ позволяет делать тонель.
aik
4 марта 2016, 15:13

Chief написал:
Для сервера? Нет. На сервере нужен только поднятый ssh, это батник именно для КЛИЕНТСКОЙ машины.

Ясно. Тогда такой вариант не подходит. Ну то есть если для админки он еще сойдёт, то вот для забирания видеопотока не прокатит.
Chief
4 марта 2016, 15:17

aik написал: то вот для забирания видеопотока не прокатит.

Почему?
Я так камеры подключал.
Да и сейчас подключены в одной конторе, просто не я теперь обслуживаю - логин/пароль не знаю, да и ip не сохранил...
aik
4 марта 2016, 15:24

Chief написал:
Почему?
Я так камеры подключал.

Удобство использования нулевое.
Chief
4 марта 2016, 15:29

aik написал: Удобство использования нулевое.

В смысле? Неудобно иметь допрограмму, которую даже ставить не надо?
Неудобно запускать допбатник?
Так в нем запуск браузера с нужными параметрами тоже прописать можно.
aik
4 марта 2016, 16:06

Chief написал:
В смысле? Неудобно иметь допрограмму, которую даже ставить не надо?
Неудобно запускать допбатник?

Ну вот представь - при заходе на страничку вместо того, чтобы сразу смотреть картинку с камеры, каждый человек должен будет скачивать и запускать программу.
Chief
4 марта 2016, 16:32

aik написал: Ну вот представь - при заходе на страничку вместо того, чтобы сразу смотреть картинку с камеры, каждый человек должен будет скачивать и запускать программу.

А это надо большому количеству человек? Тогда да. Хотя putty весит не о чем - но своеобразное неудобство есть.
alibek
4 марта 2016, 17:00

aik написал: Ну вот представь - при заходе на страничку вместо того, чтобы сразу смотреть картинку с камеры, каждый человек должен будет скачивать и запускать программу. 

Это не лучшее решение. Так каждый человек будет тянуть свою копию видеопотока и грузить канал.

Если нарисуешь схему сети, где будут указаны сервер, камера, 192.168.73.119, 192.168.248.1, другие сетевые устройства и соединения между ними, попробую нарисовать настройки iptables.
aik
4 марта 2016, 17:41

Chief написал:
А это надо большому количеству человек?

Да, вебкамера.


alibek написал: каждый человек будет тянуть свою копию видеопотока и грузить канал.

Именно. И камера рано или поздно от такой нагрузки подвиснет.


alibek написал:
Если нарисуешь схему сети,

Сложно. С моей стороны две розетки, в одну воткнут сервер, в другую - камера. С другой стороны - провайдерская сеть.
Хотя попробую что-нибудь нарисовать, но уже после праздников.

alibek
4 марта 2016, 18:19
Самый важный вопрос — камера и сервер коммутируются до оператора или за оператором? То есть там действительно свитч перед операторским портом, в который включаются сервер и камера, или свитч является операторским и 192.168.248.0/24 это операторская сеть?
aik
4 марта 2016, 18:44

alibek написал: свитч является операторским и 192.168.248.0/24 это операторская сеть?

Операторская.
alibek
4 марта 2016, 21:24
Понятно. В таком случае ситуация другая.

Камера (192.168.248.250) всегда доступна с сервера или требуются какие-то специальные настройки сети оператора и сервера, чтобы она была доступна?
aik
4 марта 2016, 21:57

alibek написал: Понятно. В таком случае ситуация другая.

Камера (192.168.248.250) всегда доступна с сервера или требуются какие-то специальные настройки сети оператора и сервера, чтобы она была доступна?

Если нет проблем со связью, то доступ есть всегда.

Я пока в качестве альтернативного решения пытаюсь организовать транскодинг на сервере, но что-то пока не выходит.
alibek
5 марта 2016, 00:44
То есть ситуация примерно такая?

Оператор предоставляет доступ в интернет с выделением публичного IP-адреса 1.2.3.4. Кроме того, у оператора есть локальная сеть 192.168.248.0/24 и в пределах сети оператора он обеспечивает связь в локальной подсети.
Все так?

В этом случае тут не нужен проброс портов, потому что в контексте линукс-сервера он тут неприменим.
Тогда можно использовать следующие варианты.
1. Организовать туннель до сервера и доступ к камере с сервера. Это тот самый SSH-туннель. Но я бы его не советовал.
2. Сделать NAT-трансляцию на камеру на оборудовании оператора. Правда это не решает проблему загрузки канала несколькими пользователями.
3. Видеопоток ретранслируется на сервере (например с помощью VLC), веб-интерфейс камеры проксируется через Apache или Nginx (такой прокси называется backend proxy или обратный прокси).
aik
5 марта 2016, 10:58

alibek написал: есть локальная сеть 192.168.248.0/24

На самом деле у него много приватных подсетей. К примеру, если я сейчас попрошу приватный айпи, то мне, скорее всего, дадут что-то в районе 192.168.200.х


alibek написал: 3. Видеопоток ретранслируется на сервере (например с помощью VLC)

Пытаюсь, но пока что-то не выходит.
Когда-то работало (с 930 камерой), но потом перестало после замены на 7010.
После этого транслировал через софт от Ivideon, но с месяц назад и он накрылся. Да и с айпадами-айфонами не работал. Нашел вроде сервис, у которого плеер поддерживает html5, но ему надо отдать поток напрямую.

Самый простой вариант, конечно, попросить у провайдера реальный адрес для камеры, но в силу дефицита адресов может и не дать даже за деньги, провайдер небольшой, адресов не так много.
alibek
5 марта 2016, 13:39
С сервера должен открываться веб-интерфейс камеры (в браузере http://192.168.248.250) и RTSP-поток (в VLC rtsp://192.168.248.250/live1.sdp). Они открываются?
aik
5 марта 2016, 16:59
Подсказали рабочий вариант:

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 801 -j DNAT --to 192.168.0.250:порт_админки_камеры
iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.250 --dport порт_админки_камеры -j SNAT --to 1.2.3.4
net.ipv4.ip_forward=1

Проверил - до админки добрался, с видео разберусь, как вернусь из Питера.
Эта версия форума - с пониженной функциональностью. Для просмотра полной версии со всеми функциями, форматированием, картинками и т. п. нажмите сюда.
Invision Power Board © 2001-2017 Invision Power Services, Inc.
модификация - Яро & Серёга
Хостинг от «Зенон»Сервера компании «ETegro»