Доброго дня. Скажите п-та, есть ли возможность как-либо ограничивать чужой софт в MS Windows в использовании локальных портов при TCP соединении? Т.е. грубо говоря, у меня есть обычный telnet. Я захожу им на google.com 80. ОС выделяет случайный локальный порт для соединения и ассоциирует этот порт с конкретным клиентским сокетом. Ну практически случайный (1024-65536, минус уже используемые). Как можно ограничить этот выбор? Скажем, я хочу, чтобы все клиентские софтины, работающие через winsock, использовали порты с 12345 до 54321. Копал msdn - не нашел((
если я не ошибаюсь то когда определяешь сокет то там можно этот самый порт прописать вручную, а если поставить 0 то система его сама выберет, как вариант Похукать winsock и вручную задавать порт там где он определён как 0.
ИМХО в этих: Код (Text): SOCKET WSAAPI socket( __in int af, __in int type, __in int protocol ); int connect( __in SOCKET s, __in const struct sockaddr *name, __in int namelen ); негде указать локальный порт. Кроме того, похукать winsock в приложении возможности нет...
Я хочу, чтобы эта "политика выделения локального порта" распространялось на все приложения, работающие в данной ОС с winsock.
Т.е. запретить исходящий траффик со всех портов, которые не входят в нужный диапазон? )) И пусть себе винда методом "проб и ошибок" выбирает нужные порты. Авось и обучится)))
а зачем воабще это нужно? ведь локальный порт никакой роли не играет, поэтому и выбирается случайно, надо смотреть на порты которые биндят или с которыми пытаются соеденится
Да вот мне понадобилось... Ну или на фаерволе, например, между 2х сетей оставили только определенный диапазон портов.
Span, как-то ты не так подходишь к задаче. Winodows, так же как и unix, использует Berkeley Sockets модель - прога может сделать: - connect() и получить socket автоматом - bind(), узнать локальный порт и потом connect() - bind(конкретный_порт) и потом connect() Так что заставить использовать конкретный порт можно либо свою прогу либо прогу в которой есть для этого опцайка. Если же ты хочешь что б traffic шёл через конкретный порт, то придётся использовать tunnel. Например SocksV - ssh2 клиент (putty, ssh/cygwin).
Можно настроить SNAT, чтобы транслировались порты исходящих соединений в нужный диапазон. Не уверен правда, что встроенный фаервол windows так умеет. А можно создать вагон сокетов и забиндить их на те порты, которые не должны использоваться
Пишешь свой туннель, который слушает на порте, совпадающем с портом удаленного компа, и с помощью bind+connect эта прога задает нужный локальный порт. Редиректишь нужный софт на твой туннель с помощью hosts
Хукаешь "connect", до вызова самой функции берешь первый параметор (socket), bind'ишь на любой порт и этот (socket) возвращаешь connect'у.