Вызов соединения DefaultHttpClient отклонил соединение в том же коте с publi c ip - PullRequest
1 голос
/ 15 марта 2020

centos 7, tomcat 8.5.

a.war и rest.war равны в одном и том же коте .

a.war используйте следующий код для вызова rest.war:

import org.apache.http.impl.client.DefaultHttpClient;

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");  

StringEntity se = new StringEntity(json.toString());

se.setContentType("text/json");
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

httpPost.setEntity(se);

HttpResponse response = httpClient.execute(httpPost);

однако, если url из HttpPost(url) равно <public ip>:80, тогда httpClient.execute(httpPost) выдаст connection refused.

, а если url из HttpPost(url) это localhost:80 или 127.0.0.1:80, тогда httpClient.execute(httpPost) - это успех.

почему? и как решить эту проблему?

Примечание: если я получаю доступ к a.war из браузера с publi c ip как http://<public ip>/a на моем компьютере, все операции выполняются успешно.

у моего tomcat-коннектора есть:

<Connector  
            port="80"
                protocol="HTTP/1.1"  
                connectionTimeout="60000" 
                keepAliveTimeout="15000"
                maxKeepAliveRequests="-1"
                maxThreads="1000"  
                minSpareThreads="200"  
                maxSpareThreads="300"
                minProcessors="100" 
                maxProcessors="900" 
                acceptCount="1000" 
                enableLookups="false"
                executor="tomcatThreadPool"
                maxPostSize="-1"
                compression="on"
                compressionMinSize="1024"               
                redirectPort="8443" />

у моего сервера нет домена, есть только publi c ip, /etc/hosts это:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

обновлено некоторыми командами, запущенными на сервере:

ss -nltp

State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128          *:111                      *:*                   users:(("rpcbind",pid=643,fd=8))
LISTEN     0      128          *:80                       *:*                   users:(("java",pid=31986,fd=53))
LISTEN     0      128          *:22                       *:*                   users:(("sshd",pid=961,fd=3))
LISTEN     0      1      127.0.0.1:8005                     *:*                   users:(("java",pid=31986,fd=68))
LISTEN     0      128         :::111                     :::*                   users:(("rpcbind",pid=643,fd=11))
LISTEN     0      128         :::22                      :::*                   users:(("sshd",pid=961,fd=4))
LISTEN     0      80          :::3306                    :::*                   users:(("mysqld",pid=1160,fd=19))
netstat -nltp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      643/rpcbind         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      31986/java          
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      961/sshd            
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      31986/java          
tcp6       0      0 :::111                  :::*                    LISTEN      643/rpcbind         
tcp6       0      0 :::22                   :::*                    LISTEN      961/sshd            
tcp6       0      0 :::3306                 :::*                    LISTEN      1160/mysqld 
ifconfig

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1396428  bytes 179342662 (171.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1396428  bytes 179342662 (171.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

p2p1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.25  netmask 255.255.255.0  broadcast 192.168.1.255
        ether f8:bc:12:a3:4f:b7  txqueuelen 1000  (Ethernet)
        RX packets 5352432  bytes 3009606926 (2.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2839034  bytes 559838396 (533.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: p2p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether f8:bc:12:a3:4f:b7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.25/24 brd 192.168.1.255 scope global noprefixroute dynamic p2p1
       valid_lft 54621sec preferred_lft 54621sec
route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 p2p1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 p2p1
ip route

default via 192.168.1.1 dev p2p1 proto dhcp metric 100 
192.168.1.0/24 dev p2p1 proto kernel scope link src 192.168.1.25 metric 100
iptables -L -n -v --line-numbers

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Ответы [ 4 ]

3 голосов
/ 15 марта 2020

Возможно, вы настроили один из них:

  1. Брандмауэр публикует c IP-порты, чтобы ничего не проходило.
  2. Tomcat может связывать указанный c IP, например, localhost (см. Элементы Connector на сервере Tomcat. xml)
  3. Apache httpd, nginx или другой обратный прокси-сервер может обрабатывать различные имена виртуальных хостов, а также они могут обрабатывать localhost, отличный от publi c IP
  4. Переадресация портов - если вы перенаправляете только localhost: 80 на localhost: 8080 (порт tomcat по умолчанию), у вас может не быть ничего на publicip: 80, который также перенаправляет этот трафик c.

Редактировать после вашего комментария:

Входящий трафик c, кажется, в порядке, но исходящие у вас действительно есть эти проблемы. Добавление из комментария @ stringy05: проверьте, является ли рассматриваемый IP маршрутизируемым с вашего сервера: вы подключаетесь к любому IP с этого сервера , поэтому используйте другое средство для создания исходящего соединения, например, curl.

Объяснение для № 1 и № 3: Если вы подключаетесь к внешнему http-серверу, он будет обрабатывать запрос по-разному в зависимости от используемого имени хоста. Вполне возможно, что IP-адрес «имя хоста» блокируется либо брандмауэром высокого уровня, либо просто обрабатывается иначе, чем URL-адрес самого веб-сервера. В большинстве случаев вы можете проверить это, подключившись к соответствующему веб-серверу из любой другой системы, например, из вашего собственного браузера.

1 голос
/ 31 марта 2020

Я думаю, что тайм-аут curl объясняет это - у вас где-то есть правило брандмауэра, которое останавливает доступ сервера к IP-адресу publi c.

Если нет причин, по которым доступ к службе невозможен с использованием localhost или локального имени хоста, сделайте это, но если вам нужно вызвать службу через общедоступный c IP, тогда нужно выяснить, почему запрос получает тайм-аут с сервера.

Некоторые обычные подозреваемые:

  • Возможно, у сервера фактически нет доступа к inte rnet - вы можете curl https://www.google.com?
  • Возможно, требуется прямой прокси - администратор sys будет знать, что такое
  • Возможно, в некоторых инфраструктурах вашего сервера могут быть белые списки IP-адресов - подумайте, AWS группы безопасности, такие списки IP-списков балансировщика нагрузки. Чтобы это исправить, вам нужно знать IPL c вашего сервера curl https://canihazip.com/s и добавить его в белый список
1 голос
/ 30 марта 2020

Если Tomcat прослушивает (привязывает) ваши публичные c IP-адреса, он должен работать, но, возможно, ваши публичные c IP-адреса принадлежат какому-то другому устройству, например, маршрутизатору SOHO, чем ваша проблема похожа на это:

https://superuser.com/questions/208710/public-ip-address-answered-by-router-not-internal-web-server-with-port-forwardi

Но без DNS-имени вы не можете просто добавить строку в / etc / hosts, но вы можете добавить publi c IP- адрес одной из ваших карт сетевых интерфейсов (NI C), таких как lo (loopback), eth0, et c. как описано в одной из этих статей:

Например, вам необходим IP-адрес publi c 1.2.3.4 (который будет действовать только до следующей перезагрузки, и в худшем случае это может помешать вам подключиться к серверу, например, с помощью S SH!):

sudo ip addr add 1.2.3.4/32 dev lo

Может быть полезно иметь выходные данные этих команд, чтобы лучше понять ваши настройки, не стесняйтесь поделиться ими в своем вопросе с постоянно анонимными публикациями c IP-адреса):

Любой из этих (ss = stat сокета, более новая замена для старого доброго netstat):

  1. ss -nltp
  2. netstat -nltp

И один из них:

  1. ifconfig
  2. ip addr show

И, наконец, один из них:

  1. route
  2. ip route

Не думаю, что нам нужно знать конфигурацию вашего брандмауэра, но если вы используете ее, это может быть интересно Посмотрите на него, пока вы на нем:

iptables -L -n -v --line-numbers

1 голос
/ 23 марта 2020

Попробуйте поместить ваши публичные c доменные имена в локальный файл / etc / hosts вашего сервера, например: 127.0.0.1 localhost YOURPUBLI C .DOMAIN.NAME

Таким образом, ваш Java Код не должен пытаться использовать внешние IP-адреса, а вместо этого подключается напрямую к Tomcat.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...