Почему команда «curl» работает нормально, а «ping» - нет?

4

Я нахожу странное явление в своей корпоративной сети:
я могу curl google.comуспешно выполнить команду:

[root@localhost ~]# curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Но выполнить ping google.comне удалось:

[root@localhost ~]# ping google.com
PING google.com (173.194.33.174) 56(84) bytes of data.
^C
--- google.com ping statistics ---
1569 packets transmitted, 0 received, 100% packet loss, time 1568463ms

Я подозреваю, что сисадмин что-то сделал, но не уверен. Кто-нибудь может дать некоторые подсказки, как отладить эту проблему? Например, устанавливает ли системный администратор некоторые правила, которые могут фильтровать pingкоманды? Как я могу это проверить?

Нань Сяо
источник
2
ICMP заблокирован корпоративным брандмауэром, скорее всего. Можете ли вы успешно пинговать любой сайт?
Каран
@Karan: Нет. Не могу успешно пропинговать никакие иностранные сайты. Как это проверить?
Нань Сяо
Я не уверен с вашей стороны, как вы можете это подтвердить, поскольку конфигурация брандмауэра, безусловно, будет недоступна для вас, но это наиболее вероятная причина.
Каран

Ответы:

3

Вы можете проверить, не заблокирован ли ICMP, с помощью следующей perl-программы:

ping.pl (отредактировано для печати порта)

#!/usr/bin/env perl    
use strict;
use warnings;
use Net::Ping;

my @hosts = @ARGV;
die "usage: sudo perl ping.pl host\n" unless @ARGV;

my $timeout = 5;
my @proto = ("tcp", "udp", "icmp","syn");
foreach my $pro ( @proto ) {

    my $p = Net::Ping->new($pro);

    # default port    
    my $port = 7;
    $p->port_number($port);

    # tcp on https port
    if ( $pro eq "tcp"){
      $port = 443;
      $p->port_number($port);
    }

    print "\nProtocol $pro port $port\n";
    foreach my $host( @hosts ) {    
      if ($p->ping($host, $timeout)){
        print "$host is reachable\n";
      }
      else{
        print "$host is NOT reachable\n";
      }
    }
    $p->close();
    sleep(2);
}
exit;

#$ sudo perl ping.pl  google.com 

Protocol tcp port 443
google.com is reachable

Protocol udp port 7
google.com is NOT reachable

Protocol icmp port 7
google.com is reachable

Protocol syn port 7
google.com is reachable

вывод ping и curl (сеть видеотрон)

#$ ping -c 4 google.com
PING google.com (24.200.237.84) 56(84) bytes of data.
64 bytes from google-084.237.cache.videotron.ca (24.200.237.84):    icmp_seq=1 ttl=61 time=7.14 ms
64 bytes from google-084.237.cache.videotron.ca (24.200.237.84):    icmp_seq=2 ttl=61 time=10.1 ms
64 bytes from google-084.237.cache.videotron.ca (24.200.237.84):    icmp_seq=3 ttl=61 time=6.86 ms
64 bytes from google-084.237.cache.videotron.ca (24.200.237.84): icmp_seq=4 ttl=61 time=8.86 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 6.866/8.243/10.102/1.320 ms

#$ curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ca/?gfe_rd=cr&amp;ei=ArVmVbiOLajd8gfKq4DoCQ">here</A>.
</BODY></HTML>
Дэвид Л.
источник
Итак, если хост недоступен по какой-либо причине, это обязательно означает, что ICMP заблокирован на вашем конце?
Каран
@ Дэвид Л .: После выполнения сценария он выводит: "` [root @ mawent3 ~] # ./ping.pl google.com Протокол tcp google.com НЕ доступен. Протокол udp google.com НЕ доступен. Протокол icmp google. com НЕ ДОСТУПЕН Протокол syn google.com is достижим` ", что он может доказать?
Нань Сяо
@ Нань Сяо, как было предложено в комментариях к вашему вопросу, вероятно, ICMP заблокирован корпоративным брандмауэром
Дэвид Л.
@DavidL: Почему curlуспех? Кажется и то tcpи другое udpтоже заблокировано.
Нань Сяо
@Nan Xiao Perl-программа не выполняет такой запрос, как curl. Возможно, что межсетевой экран из вашей сети разрешает только подключение к порту 80. ping и curl дают результаты, отличные от моего ISP.
Дэвид Л.