сокет Java: слушать, прежде чем принять? - PullRequest
2 голосов
/ 18 октября 2011

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

Я использую сокет сервера TCP, принимая каждое соединение, затем проверяю IP-адрес, а затем либо закрываю соединение, либо продолжаю обработку клиента.

Я хотел бы знать, возможно ли в Java прослушивать входящие соединения на сокете TCP-сервера, а также принимать или отказываться каким-либо образом устанавливать связь tcp, учитывая IP-адрес запрашивающего клиента. Я имею в виду, не принимая и не закрывая клиентский сокет, что я и делаю.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 18 октября 2011

Без использования SecurityManager вы можете только принять, затем проверить входящий IP-адрес и сбросить соединение, если оно есть в списке запрещенных.С SecurityManager вы можете заставить его выбросить SecurityException и предоставить ему специальную обработку (например, запись запроса соединения в журнале безопасности в приложении).

Если вы не хотите, чтобы эти соединения даже попадали на ваш сервер (что, я предполагаю, главное), вы действительно хотите заблокировать его на уровне брандмауэра.Как только соединение попадает в ваше приложение, оно уже заняло память и ресурсы, необходимые для общения с вашим приложением, поэтому в этот момент вы уже потеряли игру DOS / DDOS.

Отбрасывание ее до или после принятияне имеет значения, потому что соединение уже достигло уровня приложения вашего приложения.Даже с SecurityManager это все же увеличивает нагрузку на ваш сервер.

2 голосов
/ 18 октября 2011

Возможно, вы сможете, но вы все равно не сможете помешать им получить доступ к вашей системе в вашем коде Java.

Лучше всего вместо использования Java использовать что-то вроде iptables или другой брандмауэр, чтобы сразу отбрасывать свои пакеты.

Ребята из serverfault, вероятно, могут помочь с этим лучше, чем SO.

1 голос
/ 18 октября 2011

Вы можете использовать SecurityManager с подходящим определением accept SocketPermissions, если вы можете не использовать адреса, определенные в файле .policy, или записать свой собственный объект политики.Я должен признать, что брандмауэр был бы лучшим решением.

...