(Jetty編) Solr にアクセス可能なIPアドレスを制限する。
今回はテクニカルなメモです。
クライアントのIPアドレスで、Solr でアクセス可能かどうかを制限したい要件って結構あると思います。Apache とか Tomcat なら楽勝なのですが、デフォルトの Jetty でやってみると意外とハマったのでメモ。
環境
- Apache Solr 4.9
- Jetty 8.1.0
- Windows Server 2010
やりかた
まず、以下の設定を jetty.xml に加えます。この中に、アクセス可能なIPアドレスを記載します。
jetty.xml
<Item> <!-- <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> --> <New class="org.eclipse.jetty.server.handler.IPAccessHandler"> <Call name="addWhite"> <Arg>127.0.0.1</Arg> </Call> <Call name="addWhite"> <Arg>160.14.100.</Arg> </Call> <Call name="addWhite"> <Arg>160.14.106.</Arg> </Call> <Call name="addWhite"> <Arg>160.14.105.</Arg> </Call> <Set name="handler"> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Set> </New> </Item>
上記の設定だけだと localhost でアクセスした時に以下のように怒られました。IPAccessHandler は残念ながら、IPv6 には対応していないので、上記のアドレス欄に IPv6 のアドレスや localhost と記載することは出来ません。
WARN - 2014-08-13 10:04:28.753; org.eclipse.jetty.server.AbstractHttpConnection; /solr/ java.lang.IllegalArgumentException: Invalid IP address: 0:0:0:0:0:0:0:1 at org.eclipse.jetty.util.IPAddressMap$IPAddrPattern.match(IPAddressMap.java:237) at org.eclipse.jetty.util.IPAddressMap.getLazyMatches(IPAddressMap.java:152) at org.eclipse.jetty.server.handler.IPAccessHandler.isAddrUriAllowed(IPAccessHandler.java:289) at org.eclipse.jetty.server.handler.IPAccessHandler.handle(IPAccessHandler.java:194) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:368) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:942) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1004) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.IllegalArgumentException: Invalid octet: 0:0:0:0:0:0:0:1 at org.eclipse.jetty.util.IPAddressMap$OctetPattern.match(IPAddressMap.java:343) at org.eclipse.jetty.util.IPAddressMap$IPAddrPattern.match(IPAddressMap.java:230) ... 17 more
そこで、起動時に以下のオプションを引き渡し、IPv6 をリッスンしないようにします。これで OK でした。
-Djava.net.preferIPv4Stack=true
IPv6 が使えなくなりますが、まあ、大体のケースではOKでしょう。。
[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)
- 作者: 大谷純,阿部慎一朗,大須賀稔,北野太郎,鈴木教嗣,平賀一昭,株式会社リクルートテクノロジーズ,株式会社ロンウイット
- 出版社/メーカー: 技術評論社
- 発売日: 2013/11/29
- メディア: 大型本
- この商品を含むブログ (6件) を見る