我的網頁伺服器上有一個虛擬主機,其唯一且獨特的目標是返回客戶端 IP 位址:
petrus@bzn:~$ cat /home/vhosts/domain.org/index.php
<?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
這有助於我解決網路問題,尤其是涉及 NAT 時。因此,我並不總是擁有網域解析,即使透過其 IP 位址進行查詢,該服務也需要工作。
我這樣使用它:
petrus@hive:~$ echo "GET /" | nc 88.191.133.41 80
191.51.4.55
petrus@hive:~$ echo "GET /" | nc ydct.org 80
191.51.4.55
router#more http://88.191.133.41/index.php
88.191.124.254
但是我發現它至少不能在計算機上運行:
petrus@seth:~$ echo "GET /" | nc ydct.org 80
petrus@seth:~$
petrus@seth:~$ echo "GET /" | nc 88.191.133.41 80
petrus@seth:~$
我檢查的內容:
這與 ipv6 無關:
petrus@seth:~$ echo "GET /" | nc -4 ydct.org 80
petrus@seth:~$
petrus@hive:~$ echo "GET /" | nc ydct.org 80
2a01:e35:ee8c:180:21c:77ff:fe30:9e36
netcat
版本相同(平台除外,i386 與 x64):
petrus@seth:~$ type nc
nc est haché (/bin/nc)
petrus@seth:~$ file /bin/nc
/bin/nc: symbolic link to `/etc/alternatives/nc'
petrus@seth:~$ ls -l /etc/alternatives/nc
lrwxrwxrwx 1 root root 15 2010-06-26 14:01 /etc/alternatives/nc -> /bin/nc.openbsd
petrus@hive:~$ type nc
nc est haché (/bin/nc)
petrus@hive:~$ file /bin/nc
/bin/nc: symbolic link to `/etc/alternatives/nc'
petrus@hive:~$ ls -l /etc/alternatives/nc
lrwxrwxrwx 1 root root 15 2011-05-26 01:23 /etc/alternatives/nc -> /bin/nc.openbsd
在沒有管道的情況下使用時它可以工作:
petrus@seth:~$ nc ydct.org 80
GET /
2a01:e35:ee8c:180:221:85ff:fe96:e485
並且管道至少可以與測試服務一起使用(netcat
監聽 1234/tcp 並輸出到 stdout)
petrus@bzn:~$ nc -l -p 1234
GET /
petrus@bzn:~$
petrus@seth:~$ echo "GET /" | nc ydct.org 1234
petrus@seth:~$
我不知道這個問題是否與netcat
或更相關Apache
,但我很感激任何解決此問題的指示!
bzn
是伺服器,hive
是工作客戶端,也是seth
我遇到問題的客戶端。
編輯:它也適用於telnet
但telnet
不允許管道。
對 MickeyB 的回答的第二次編輯:
事實上,主機頭不會被傳輸,但正如上面的主機所見hive
,我已經將default
Apache 的虛擬主機配置為像ydct.org
虛擬主機一樣:
petrus@bzn:/etc/apache2/sites-available$ cat default
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName 88.191.133.41
ServerAlias 2a01:e1b:1:132:1a0a:a9ff:fec8:f0a9
DocumentRoot /home/vhosts/ydct.org/
</VirtualHost>
但是,它可以與curl
!
petrus@seth:~$ curl ydct.org
2a01:e35:ee8c:180:221:85ff:fe96:e485
輸出apache2 -S
發佈到http://pastebin.com/aSf446Jv
但我想知道為什麼它不起作用netcat
......
答案1
簡而言之,它是您正在運行的 netcat 版本。
我在我的機器上測試了命令字串,如下所示:
Mac OS X 獅子:
yvaine:sqlite user$ echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168
自由BSD:
[root@freebsd82 /usr/ports]# echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168
CentOS:
[root@kvm0001 ~]# echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168
Debian(版本 6)
root@debian:~# echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168
直到我進入 Ubuntu“lucid”(這顯然是你正在運行的)時,我才得到以下資訊:
root@ubuntu:~# echo -e "GET /" | nc 88.191.133.41 80
root@ubuntu:~#
看來 Ubuntu 預設使用 nc.openbsd 而不是 nc.traditional(這是 Debian 上的預設)。使用傳統版本後,我收到了所需的輸出:
root@ubuntu:~# echo -e "GET /" | nc.traditional 88.191.133.41 80
XX.XX.XX.168
奇怪的是,您的兩台客戶端電腦都有 nc.openbsd,但它們的行為不同。當然,其中一個可能有不同版本的 nc.openbsd 或完全不同版本的 Ubuntu。無論哪種方式,您都可以同步您的 nc.openbsd 版本或切換到 nc.traditional。
答案2
對我有用:)
michael@challenger:~$ echo -e "GET /\n" | nc 88.191.124.41 80
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
如果您嘗試存取虛擬主機,那麼您的做法是錯誤的。您需要傳送一個 Host: 標頭來識別您要使用的虛擬主機。
使用「我的 IP 是什麼」服務的最佳方法是curl。嘿,看,當我做你正在做的事情時,我也看到了同樣的問題:
michael@challenger:~$ echo -e "GET /" | nc ip.mydomain.ca 80
michael@challenger:~$ curl ip.mydomain.ca
192.168.0.135
修復你的虛擬主機!
michael@challenger:~$ curl -v 88.191.124.41
* About to connect() to 88.191.124.41 port 80 (#0)
* Trying 88.191.124.41... connected
* Connected to 88.191.124.41 (88.191.124.41) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.3 (x86_64-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: 88.191.124.41
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 25 Nov 2011 22:11:31 GMT
< Server: Apache/2.2.14 (Ubuntu)
< Last-Modified: Wed, 25 Aug 2010 08:11:38 GMT
< ETag: "840d09-b1-48ea16e57f5a6"
< Accept-Ranges: bytes
< Content-Length: 177
< Vary: Accept-Encoding
< Content-Type: text/html
< X-Pad: avoid browser bug
<
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
* Connection #0 to host 88.191.124.41 left intact
* Closing connection #0
答案3
設定等待時間並重試:
$ echo "GET /" | nc -w 3 88.191.124.41 80