我们有一个运行Ubuntu 12.04 LTS,Tomcat 7和Oracle Java的networking服务器。 到目前为止,我们一直在端口80和443上提供IPv4地址的Web应用程序(80个redirect到443)。
我试图使通过IPv6也在同一端口上的Tomcat服务相同的应用程序。 OS正确configuration为IPv6,它具有自己的全球范围的IPv6地址。
不工作的是Tomcat / Java不监听IPv6。 这是netstat -tlpn的输出:
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 957/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2686/java tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1058/postgres tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1243/master tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 2686/java tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 2686/java tcp6 0 0 :::2222 :::* LISTEN 957/sshd tcp6 0 0 :::5432 :::* LISTEN 1058/postgres tcp6 0 0 ::1:25 :::* LISTEN 1243/master
正如你所看到的,Java只在tcp连接上侦听,而postgres和ssh在同一个端口上也接受tcp6连接。
我在Tomcat的启动脚本中发现了一个属性java.net.preferIPv4Stack = true,但是当我将它设置为false时,tomcat开始只监听tcp6本地,端口8005.我需要它也监听::: 443和: :: 80。 它也从IPv4连接消失,但我相信:::可以绑定IP v4和v6。
我应该提到,我不是一个Java程序员,我的责任只是服务器本身。 另外我不想做太多的实验,因为这是一个生产服务器。
任何帮助是极大的赞赏! 干杯
– 编辑 –
这里是完整的server.xml文件,剥离了默认的评论:
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="443" /> <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/etc/tomcat7/ssl/tomcat.keystore" keystorePass="secretpass"/> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine>
经过几个小时的研究,我发现问题是authbind。 它可以将tomcat绑定到仅用于IPv4的低于1024的端口,并且不适用于IPv6(它应该在较新的内核上,但在此机器上使用3.2内核)。
当我将/ etc / default / tomcat7中的authbind转为并在8080上修改了我的server.xml来侦听,然后redirect到443并在8443上侦听时,tomcat开始监听IPv6。
通过iptablesredirect端口也只能用于IPv4,因为ip6tables支持nat,而且只能从内核3.7redirect。
然后我使用了一个名为xinetd的守护进程将stream量从80redirect到8080,从443redirect到8443。现在一切正常。