2016-01-24 2 views
0

Я использую IPAcccessHandler в пристани для ограничения доступа к запросам, поступающим из определенных доменов. Тем не менее, я действительно застрял в двух проблемах:Как использовать имена хостов вместо IP-адресов в причале?

1- Кажется, что IPAccessHandler только принимает IP-адреса в белый или черный список, хотя это Javadocs говорит, что можно блокировать по URL-адресам. Это XML-фрагмент моего молы-ipaccess.xml:

<Set name="black"> 
    <Array type="String"> 
     <Item>google.com</Item> 
    </Array> 
    </Set> 

Теперь, если я бегу причалом я получаю следующее исключение (т.е. молы не запускается):

Caused by: java.lang.IllegalArgumentException: Invalid IP address pattern: google.com 

Но если Я использую IP-адрес (например, 127.0.0.1), тогда причал начинается нормально.

2 Теперь скажите, что я начал причал, заблокировав доступ с IP 127.0.0.1, а затем, если попытаюсь запросить 127.0.0.1 в моем браузере, я получу правильную запрещенную ошибку. Бит, если я пытаюсь запросить http://localhost, то я получаю эту ошибку:

HTTP ERROR: 500 

Problem accessing /. Reason: 

    java.lang.IllegalArgumentException: Invalid IP address: 0:0:0:0:0:0:0:1 

Я пытался в течение двух дней, до сих пор без каких-либо удачи! Любая помощь высоко ценится!

ответ

0

IPAccessHandler использует только IP-адреса, отсюда и название.

Было бы крайне неэффективно (и неправильно) использовать имена хостов, либо как конфигурацию на стороне IPAccessHandler, либо проверку входящего запроса.

Позволяет использовать этот код Java для изучения того, что я имею в виду.

package net; 

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class MultiDns 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      String hostname = "www.google.com"; 
      System.out.printf("Hostname: %s%n",hostname); 
      for (InetAddress addr : InetAddress.getAllByName(hostname)) 
      { 
       System.out.printf(" - %s [%s]%n",addr.getHostAddress(),InetAddress.getByAddress(addr.getAddress()).getHostName()); 
      } 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Результаты этого поиска в google.com для меня показывают следующее ...

Hostname: www.google.com 
- 74.125.25.106 [pa-in-f106.1e100.net] 
- 74.125.25.99 [pa-in-f99.1e100.net] 
- 74.125.25.104 [pa-in-f104.1e100.net] 
- 74.125.25.147 [pa-in-f147.1e100.net] 
- 74.125.25.105 [pa-in-f105.1e100.net] 
- 74.125.25.103 [pa-in-f103.1e100.net] 
- 2607:f8b0:400e:c00:0:0:0:67 [pf-in-x67.1e100.net] 

Так как я живу в Аризоне, я получаю выше результаты, но если бы вы жили в Европе, или в Азии (в качестве примеров), вы получите разные результаты.

И результаты, которые вы видите сегодня, скорее всего, будут разными позже.

Кроме того, когда вы берете IP-адреса, возвращающиеся из запроса на google.com, вы увидите, что вы не можете разрешить google.com обратно с этих IP-адресов (они возвращают результаты для 1e100.net addresses).

Нет связи 1: 1 между именем хоста и IP в любом смысле, где использование имени хоста для контроля доступа имеет смысл.

Даже если добавить имя хоста в сторону конфигурации, вам нужно запросить, что имя хоста для его изобр на каждый запрос знать, если IP входящий запрос является в настоящее время разрешен или запрещен. Это слишком дорогостоящее действие.

Возможно, вы думаете, что Jetty может просто использовать ttl/expiration запроса dns, чтобы ограничить количество раз, когда он выполняет запрос DNS для этого домена. Увы, Java не имеет доступа к информации ttl ответа DNS.

Смежные вопросы