.Net remoting и шлюз
От: Kostya33  
Дата: 12.03.15 07:59
Оценка:
Добрый день!
Есть приложение на .Net Remoting. При подключении к серверу из внутренней подсети все ок, при попытке зайти через внешний IP (который каким то образом форвардиться на внутренний адрес) получаю Exception
Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 10.0.0.10:54099, что вобщем то логично, т.к. 10.0.0.10 — это шлюз
Делал как тут
Автор: toshik2002
Дата: 20.04.09
, но что то не выходит каменный цветок.
Насколько я понимаю, мне нужно передать на сервер IP клиента, но где в серверной части нужно производить замену обратного адреса?
Свой код пока не выкладываю(если нужно выложу), т.к. простыня длинная и практически полностью совпадает с кодом по ссылке
Отредактировано 12.03.2015 8:02 Kostya33 . Предыдущая версия .
.net remoting
Re: .Net remoting и шлюз
От: andrey82  
Дата: 12.03.15 08:20
Оценка:
Здравствуйте, Kostya33, Вы писали:

K> При подключении к серверу из внутренней подсети все ок, при попытке зайти через внешний IP (который каким то образом форвардиться на внутренний адрес) получаю Exception

K>Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 10.0.0.10:54099, что вобщем то логично, т.к. 10.0.0.10 — это шлюз

Извне как происходит подключение ? На какой IP?
Вообще форвардинг обычно настраивается в виде
Внешний порт -> Внутренний IP : Внутренний порт
Номера портов внешнего и внутреннего могут совпадать (но необязательно).
Можно также начать с проверки доступности порта (т.е. настройки форвардинга и файерволлов)
telnet IP порт
Re[2]: .Net remoting и шлюз
От: Kostya33  
Дата: 12.03.15 08:29
Оценка:
Здравствуйте, andrey82, Вы писали:

A>Здравствуйте, Kostya33, Вы писали:


K>> При подключении к серверу из внутренней подсети все ок, при попытке зайти через внешний IP (который каким то образом форвардиться на внутренний адрес) получаю Exception

K>>Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 10.0.0.10:54099, что вобщем то логично, т.к. 10.0.0.10 — это шлюз

A>Извне как происходит подключение ? На какой IP?

A>Вообще форвардинг обычно настраивается в виде
A>Внешний порт -> Внутренний IP : Внутренний порт
A>Номера портов внешнего и внутреннего могут совпадать (но необязательно).
A>Можно также начать с проверки доступности порта (т.е. настройки форвардинга и файерволлов)
A>telnet IP порт

Извне приходит на интернетовский IP
Форвардинг примерно так и настроен
Телнетом можно подключиться из интернета и посмотреть на .Net овский exception (который от пустого запроса)

После того как клиент отправляет запрос на сервер, на сервере происходит активация объекта, я могу прочитать header'ы из своей реализации IServerChannelSink
После этого вызывается мой ITrackingHandler
Тут все ОК.

После этого сервер пытается установить обратное соединение, но вместо IP адреса клиента, ломиться на шлюз, и возникает ошибка.
Т.е. где-то в сервере нужно указать IP клиента, что бы сервер открывал обратное соединение туда
Re: .Net remoting и шлюз
От: Nikolay_Ch Россия  
Дата: 12.03.15 09:22
Оценка:
Здравствуйте, Kostya33, Вы писали:

K>Насколько я понимаю, мне нужно передать на сервер IP клиента, но где в серверной части нужно производить замену обратного адреса?

На клиенте есть конфигурация, где указан IP-адрес сервера. Подмените IP-адрес в биндинге на клиенте для начала.
Re[2]: .Net remoting и шлюз
От: Kostya33  
Дата: 12.03.15 12:02
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Здравствуйте, Kostya33, Вы писали:


K>>Насколько я понимаю, мне нужно передать на сервер IP клиента, но где в серверной части нужно производить замену обратного адреса?

N_C>На клиенте есть конфигурация, где указан IP-адрес сервера. Подмените IP-адрес в биндинге на клиенте для начала.
Не совсем понял о какой конфигурации идет речь.

у меня соединение с сервером устанавливается так:

string uri = String.Format(@"tcp://{0}:{1}", ip, port);
RemotingConfiguration.RegisterActivatedClientType(typeof(ServerImpRemotingProxy), uri);

server = new ServerImpRemotingProxy();


ServerImpRemotingProxy — это объект который будет создан на стороне сервера. Слово Proxy пусть не смущает, это просто объект, который реализует мой интерфейс


Еще есть такой код
Он тоже работает, но в uri и так правильный адрес сервера, подменять там нечего
    public class NmsIpClientSinkProvider : IClientChannelSinkProvider
    {
        private IClientChannelSinkProvider _nextProvider = null;
        private string _serverHostNameOrIp;

        public NmsIpClientSinkProvider(string hostNameorIp)
        {
            if (String.IsNullOrEmpty(hostNameorIp))
                throw new ArgumentNullException("hostNameorIp == null");

          _serverHostNameOrIp = hostNameorIp;
        }

        public IClientChannelSink CreateSink(IChannelSender channel, string url, object remoteChannelData)
        {

            if (!url.Contains(_serverHostNameOrIp)) 
            { 
                string oldIp = url.Substring(6).Remove(url.LastIndexOf(':') - 6);
                url = url.Replace(oldIp, _serverHostNameOrIp);
            } 

            IClientChannelSink nextSink = _nextProvider.CreateSink(channel, url, remoteChannelData);
            return (new NmsClientChannelSink(nextSink, _serverHostNameOrIp));
        }

        public IClientChannelSinkProvider Next
        {
            get { return _nextProvider; }
            set { _nextProvider = value; }
        }

    }
Отредактировано 12.03.2015 12:06 Kostya33 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.