ubuntu服务器只有ipv6监听服务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ubuntu服务器只有ipv6监听服务相关的知识,希望对你有一定的参考价值。
不仅只有IPv6,Ubuntu服务器还允许IPv4监听服务。例如,它可以从IPv4 / IPv6混合模式下的网络上接收和处理网络连接。 同时,它还支持从IPv4或IPv6地址发出的数据,对于针对某种特定协议支持的端口,两者都可以工作,无论是进入还是出去的数据都可以通过该端口处理。 参考技术A 如果Ubuntu服务器只监听IPv6协议,您可以在终端环境下执行命令如下:sudo ifconfig -a | grep inet6来查看服务器的IPv6地址。此外,您还可以在/etc/network/interfaces中更改服务器的IPv4参数,使其同时支持IPv4和IPv6协议。 参考技术B Ubuntu服务器可以安装apache2服务器,来支持IPv6网络连接。此外,可以在Apache2服务器上安装相关的模块来支持IPv6连接,例如mod_ipv6模块。此外,可以在Apache2服务器配置文件中将Listen 80等监听端口改为Listen [::]:80,以便支持IPv6连接。(我认为)Thrift 服务器只监听 ipv6
【中文标题】(我认为)Thrift 服务器只监听 ipv6【英文标题】:(I think) Thrift server is only listening on ipv6 【发布时间】:2020-03-17 23:41:05 【问题描述】:我是 Apache Thrift 的新手,正在玩 Apache 在此处提供的玩具 Delphi 客户端服务器示例:https://thrift.apache.org/tutorial/delphi
我们对名称以及端口和 IP 的设置方式进行了一些小改动,但其他方面基本相同。
在服务器中我们有以下代码:
PORT := StrToInt(ParamStr(1));
handler := TPhraseGeneratorHandler.Create;
processor := TPhraseGenerator.TProcessorImpl.Create( handler);
transport := TServerSocketImpl.Create( PORT);
server := TSimpleServer.Create( processor, transport);
WriteLn( 'Starting the server on port ' + PORT.ToString + '...');
server.Serve();
在客户端我们有以下代码:
var transport : ITransport;
protocol : IProtocol;
client : TPhraseGenerator.Iface;
phraseRequest : IPhraseRequest;
// Let the user pass in the parameters for host and port
HOST : String;
PORT : Integer;
begin
try
// Open a connection to the server using the host and port supplied by the user
HOST := ParamStr(1);
PORT := StrToInt(ParamStr(2));
WriteLn('Openning a connection to the server: ' + HOST + ' on port: ' + PORT.ToString);
transport := TSocketImpl.Create( HOST, PORT, 10000); // specifically add a timeout as our test server deliberately goes to sleep for 5000ms
protocol := TBinaryProtocolImpl.Create( transport);
client := TPhraseGenerator.TClient.Create( protocol);
transport.Open;
如果我们在同一台机器上打开客户端和服务器并使用'localhost',我们可以让它们进行通信。
但是,如果我们在不同的机器上打开它们并指定服务器的 ipv4 地址,我们就不能。
使用 netstat 我们得到以下结果:
D:\Temp>netstat -ano | findstr 9090
TCP [::]:9090 [::]:0 LISTENING 15368
我认为这表明服务器只监听 ipv6。
问:我说的对吗?如果是这样,我们怎样才能让它在 ipv4 上收听?
【问题讨论】:
【参考方案1】:我会说you are 100% correct。
相关部分来自CreateSocket()
:
// Pick the ipv6 address first since ipv4 addresses can be mapped
// into ipv6 space.
Res := Result.Res;
while Assigned(Res) do begin
if (Res^.ai_family = AF_INET6) or (not Assigned(Res^.ai_next)) then
Break;
Res := Res^.ai_next;
end;
FSocket := Winapi.Winsock2.socket(Res^.ai_family, Res^.ai_socktype, Res^.ai_protocol);
【讨论】:
如果您对@JensG 感兴趣,请在下方更新【参考方案2】:更新 我们已经弄清楚如何编辑 Delphi Thrift 代码以允许 ipv4。在这里发帖以防对其他人有帮助。
相关的步骤是Thrift.Sockets.pas文件中的procedure TServerSocket.Listen;。
procedure TServerSocket.Listen;
:
var
TempIntReader,
TempIntWriter: Winapi.Winsock2.TSocket;
One: Cardinal;
ErrnoCopy: Integer;
Ling: TLinger;
Retries: Integer;
AddrInfo: IGetAddrInfoWrapper;
SA: TSockAddrStorage;
Len: Integer;
// ### ADD THIS ###
Zero: Cardinal;
// ### END ADD ###
:
// Set SO_EXCLUSIVEADDRUSE to prevent 2MSL delay on accept
One := 1;
setsockopt(Socket, SOL_SOCKET, Integer(SO_EXCLUSIVEADDRUSE), @one, SizeOf(One));
// ignore errors coming out of this setsockopt on Windows. This is because
// SO_EXCLUSIVEADDRUSE requires admin privileges on WinXP, but we don't
// want to force servers to be an admin.
// ### ADD THIS ###
// set IPV6_V6ONLY=0 so that the server uses dualstack sockets
// i.e., we will get both IPv6 and IPv4-mapped IPv6 connections on the same socket
// (ignore errors)
Zero := 0;
setsockopt(Socket, IPPROTO_IPV6, IPV6_V6ONLY27, @Zero, SizeOf(Zero));
// ### END ADD ###
// Set TCP buffer sizes
if FTcpSendBuffer > 0 then begin
if setsockopt(Socket, SOL_SOCKET, SO_SNDBUF, @FTcpSendBuffer, SizeOf(FTcpSendBuffer)) = SOCKET_ERROR then begin
ErrnoCopy := WSAGetLastError;
LogDelegate(Format('TServerSocket.Listen() setsockopt() SO_SNDBUF %s', [SysErrorMessage(ErrnoCopy)]));
raise TTransportExceptionNotOpen.Create(Format('Could not set SO_SNDBUF: %s', [SysErrorMessage(ErrnoCopy)]));
end;
end;
【讨论】:
太棒了!是否可以发送拉取请求?出于法律原因,我不能只接受代码并自己提交。但我可以查看和合并拉取请求。 - github.com/apache/thrift以上是关于ubuntu服务器只有ipv6监听服务的主要内容,如果未能解决你的问题,请参考以下文章