我在使用专用服务器时遇到了问题,我不知道这是否是默认行为,但问题在于此:
如果我使用 localhost 连接到位于服务器上的服务,该服务将获取外部 IP 作为源 IP。
举个例子,我使用 netcat 监听 127.0.0.1:4444
xxxxxx # nc -vv -l -s 127.0.0.1 -p 4444
listening on [127.0.0.1] 4444 ...
让我们检查一下是否正常:
xxxxxx ~ # netstat -atnp | grep 4444
tcp 0 0 127.0.0.1:4444 0.0.0.0:* LISTEN 14038/nc
好的,让我们连接:
xxxxxx ~ # nc -vv 127.0.0.1 4444
localhost [127.0.0.1] 4444 (?) open
返回到正在监听进程的 tty,我得到了这个:
connect to [127.0.0.1] from xxxxxx.net [176.31.xxx.xx] 50354
这就是问题所在。我有一个服务器守护进程,它必须在本地主机上监听,并在客户端连接时检查 ip 是否为 127.0.0.1,但由于某种原因,当我连接到本地主机时,它会报告外部 ip...
如果我对 IPv6 执行相同操作,它会按预期工作...将连接检测为本地主机(::1)。
一些有用的信息:
“localhost” 可以毫无问题地解析为 127.0.0.1
xxxxxx ~ # ping -c1 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.086 ms
我认为我的 hosts 文件上没有什么奇怪的东西......
xxxxxx ~ # grep -v ^# /etc/hosts
127.0.0.1 localhost localhost.localdomain
176.31.xxx.xx xxxxxx.net ns1.xxxxxx.net
::1 ip6-localhost ip6-loopback
feo0::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
ifconfig 报告一切正常......
eth0 Link encap:Ethernet HWaddr e0:69:95:d8:30:a1
inet addr:176.31.xxx.xx Bcast:176.31.108.255 Mask:255.255.255.0
inet6 addr: 2001:41d0:8:xxxx::/64 Scope:Global
inet6 addr: 2001:41d0:8:xxxx:x:xx:xx:xx/64 Scope:Global
inet6 addr: fe80::e269:95ff:fed8:30a1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16916 errors:0 dropped:0 overruns:0 frame:0
TX packets:16914 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8410679 (8.0 MiB) TX bytes:10539881 (10.0 MiB)
Interrupt:28 Base address:0xe000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:5570 errors:0 dropped:0 overruns:0 frame:0
TX packets:5570 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:744490 (727.0 KiB) TX bytes:744490 (727.0 KiB)
答案1
解决了
感谢@Cakemox 为我提供的建议iptables
。我有以下规则导致了意外行为:
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination xxx.xxx.xxx.xxx:1234
/sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
我将以适当的方式解决该重定向,以避免将来出现问题......