Основы TCP / IP: релевантность порта назначения - PullRequest
3 голосов
/ 18 августа 2011

Хорошо, это немного стыдно, но у меня просто довольно "нубский" вопрос.

В клиентских серверных соединениях TCP, где моей системой является клиент, обращающийся к удаленному серверу, скажем, через порт XX, разве клиент не открывает случайный порт YY в своей системе для связи с удаленным портом XX? Поэтому, когда мы кодируем, мы указываем порт назначения XX правильно?

Для клиента сам порт YY выбирается при создании сокета, не так ли?

Могу ли я в любом случае контролировать / ограничивать / контролировать любого клиента, разговаривающего с конкретным сервером? (Как, например, клиенты разговаривают с серверами на определенных обслуживающих портах ??)

Есть ли какое-либо правило IPTABLE или какое-либо правило брандмауэра, ограничивающее клиента? Можно ли вообще это сделать ??

Сохранены ли порты назначения в структурах сокетов? Если да, то где ??

Спасибо!

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Сначала серверная сторона создает слушающий сокет с цепочкой socket(2), bind(2) и listen(2) звонки, затем ожидание входящих клиентских запросов на соединение с вызовом accept(2). После подключения клиента (socket(2), а затем connect(2) на стороне клиента) и стеков TCP / IP клиента и компьютеров сервера завершите трехстороннее рукопожатие , accept(2) возвращает новый дескриптор сокета - это конец сервера подключенного сокета . И bind(2) на стороне сервера, и connect(2) на стороне клиента принимают адрес и порт сервера .

Теперь полное TCP-соединение описывается четырьмя числами - адрес сервера, порт сервера, адрес клиента и порт клиента. Первые два, очевидно, должны быть известны клиенту до попытки подключения (в противном случае, куда мы пойдем?). Адрес клиента и порт, хотя и могут быть указаны явно с помощью bind(2), обычно назначаются динамически - адрес является IP-адресом исходящего сетевого интерфейса, как определено таблица маршрутизации и порт, выбранный вне диапазона эфемерные порты .

Команда netstat(8) показывает установленные соединения. Добавление флага -a позволяет видеть прослушивающие сокеты, флаг -n отключает разрешение DNS и службы, поэтому вы просто видите числовые адреса и порты.

Linux iptables(8) позволяет вам ограничивать доступ к клиентам. Вы можете ограничить использование портов источника и назначения, адресов и т. Д.

Вы можете получить локальную привязку сокета с помощью вызова getsockname(2), удаленная привязка задается с помощью getpeername(2).

Надеюсь, это немного прояснит.

1 голос
/ 18 августа 2011

Да, вы можете создать правило брандмауэра для предотвращения исходящих TCP-подключений к порту XX.Например, некоторые организации запрещают исходящий TCP-порт 25, чтобы предотвратить отправку спама с сетевых компьютеров на удаленные SMTP-серверы.

...