首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过AWS Nat网关的连接问题

通过AWS Nat网关的连接问题
EN

Stack Overflow用户
提问于 2020-09-01 22:16:16
回答 1查看 1.8K关注 0票数 2

我在私有子网上有一个带有Spring应用程序的Amazon 2应用服务器。在公共子网的应用服务器前面有一个Nat网关。应用程序发送带有连接的请求:将保持活动的头发送到远程主机,远程主机用相同的头发送一个响应。所以我可以通过netstat看到一个已建立的连接。

代码语言:javascript
运行
复制
netstat -t | grep <remote server ip>
tcp6       0      0 ip-172-30-4-31.eu:57324 <remote server ip>:http       ESTABLISHED

由于35秒内没有通信量,Nat网关根据本文档关闭了连接:https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-troubleshooting.html#nat-gateway-troubleshooting-timeout,但应用程序服务器上的连接仍然处于已建立状态,因此对远程服务器的下一个请求提供给我:

代码语言:javascript
运行
复制
java.net.SocketException: Connection reset

我尝试在sysctl.conf中的应用服务器上进行更改,几乎同时关闭与Nat网关的连接:

代码语言:javascript
运行
复制
net.ipv4.tcp_keepalive_time=351
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=2

但是什么都没有发生,并且通过tcpdump从应用服务器转储到远程服务器的流量不会使我保持存活的数据包。那么,除了删除应用程序中的连接头之外,我还能做些什么来避免这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-02 16:05:05

问题是因为使用了打开套接字的方法。我使用了:

代码语言:javascript
运行
复制
Request.Post(mainProperties.getPartnerURL())
                .addHeader("Signature", SecurityHelper.getSignature(requestBody.getBytes("UTF-8"),
                        mainProperties.getPartnerKey()))
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .connectTimeout(mainProperties.getRequestTimeoutMillis())
                .bodyByteArray(requestBody.getBytes(UTF_8))
                .execute().returnContent().asString();

但我已经将so_keepalive param设置为套接字。可以使用HttpClient来完成:

代码语言:javascript
运行
复制
    SocketConfig socketConfig = SocketConfig.custom()
            .setSoKeepAlive(true)
            .build();

    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(mainProperties.getRequestTimeoutMillis())
            .build();

    CloseableHttpClient httpClient = HttpClientBuilder.create()
            .setDefaultSocketConfig(socketConfig)
            .setDefaultRequestConfig(requestConfig)
            .build();
            
    HttpPost post = new HttpPost(mainProperties.getPartnerURL());

    post.addHeader("Signature", SecurityHelper.getSignature(requestBody.getBytes("UTF-8"),
                mainProperties.getPartnerKey()));
    post.addHeader("Content-Type", "text/xml");
    post.setEntity(new StringEntity(requestBody, UTF_8));

    CloseableHttpResponse response = httpClient.execute(post);
    return EntityUtils.toString(response.getEntity(), UTF_8);

然后将my sysctl.conf (应用更改所需的sysctl -p )中的sysctl.conf set应用到一个新连接中,可以这样检查它:

代码语言:javascript
运行
复制
netstat -o | grep <remote-host>
tcp6       0      0 ip-172-30-4-233.e:50414 <remote-host>:http ESTABLISHED **keepalive (152.12/0/0)**

因此,TCP-保持活跃的数据包发送350秒后,从最后一个数据包,没有响应关闭建立的连接。所有tcp保持活动的数据包都可以通过tcp转储看到:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63696142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档