0

我在不同地区有两个 VPC(VPC1、VPC2)。每个 VPC 有两个 EC2 实例。在 VPC1 上,我有一个公有子网和一个私有子网(分别为 subnet1 和 subnet2),每个子网都有自己的路由表,在 VPC2 上,我有一个私有子网(subnet3)。此外,我还通过私有子网在我的两个 VPC 之间启用了 VPC 对等互连。

我还向 VPC1 添加了 Internet 和 NAT 网关,以便能够访问 Internet。

在 VPC1 上,我启动了两个 EC2 实例,一个在私有子网上运行的客户端实例,一个在公共子网上运行的 public_ec2_subnet1。在 VPC2 上,我有两个 EC2 实例,server2 在 VPC2 上的私有子网 (subnet3) 上运行,server1 在 VPC2 上的公共子网上运行default VPC of the region, NOT ON THE SAME VPC

在客户端的 EC2 实例上,我添加了一个名为的 java 文件EchoClient.java,该文件以 IP 地址作为参数,在 server1 和 server2 上,我添加了另一个名为的 java 文件,该文件EchoServer.java在其所在实例的端口 10008 上运行。

EchoClient.java:

import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws IOException {

        String serverHostname = new String ("127.0.0.1");

        if (args.length > 0)
           serverHostname = args[0];
        System.out.println ("Attemping to connect to host " +
        serverHostname + " on port 10008.");

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            // echoSocket = new Socket("taranis", 7);
            echoSocket = new Socket(serverHostname, 10008);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + serverHostname);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for " + "the connection to: " + serverHostname);
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;

        System.out.print ("input: ");
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("echo: " + in.readLine());
            System.out.print ("input: ");
        }

        out.close();
        in.close();
        stdIn.close();
        echoSocket.close();
    }
}

EchoServer.java:

import java.net.*; 
import java.io.*; 

public class EchoServer 
{ 
 public static void main(String[] args) throws IOException 
   { 
    ServerSocket serverSocket = null; 

    try { 
         serverSocket = new ServerSocket(10008); 
    }catch (IOException e){ 
         System.err.println("Could not listen on port: 10008."); 
         System.exit(1); 
    } 

    Socket clientSocket = null; 
    System.out.println ("Waiting for connection.....");

    try { 
         clientSocket = serverSocket.accept(); 
    }catch (IOException e){ 
         System.err.println("Accept failed."); 
         System.exit(1); 
    } 

    System.out.println ("Connection successful");
    System.out.println ("Waiting for input.....");

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

    String inputLine; 

    while ((inputLine = in.readLine()) != null){ 
         System.out.println ("Server: " + inputLine); 
         out.println(inputLine); 

         if (inputLine.startsWith("Bye.")) break; 
    } 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 
   } 
} 

这是我在实例上运行代码的过程:

  • 我通过 SSH 连接到的第一个终端server1并运行服务器 java 代码,它等待连接
  • 我使用 public_ec2_subnet1 实例通过 SSH 连接到客户端实例并使用 server1 的公共 IP 地址运行 EchoClient.java 代码;但是,连接总是返回超时
  • 我停止 server1,并打开另一个终端和 SSH 到 public_ec2_subnet1 实例以 SSH 到客户端实例,然后我 SSH 到 Server2,因为它位于私有子网上并运行服务器代码
  • 我使用 Server2 运行客户端的代码,private IP因为 VPC 对等互连已连接且子网 3 是私有的,但这也给了我一个超时响应。

例如,我在入站和出站规则中添加了 0.0.0.0/0 和 ::/0 ,并且仅针对实例添加SSH (TCP), HTTP (TCP), HTTPS (TCP)了它。Server1SSH (TCP)client, server2

当我尝试使用 AWS 控制台在浏览器上查看 server1(公共)时,它给了我一个连接被拒绝。

我做了一些研究,发现的所有解决方案都是添加入站和出站规则。我不确定为什么客户端和任何一个服务器都无法通信。

有人可以解释一下这件事吗?如果您需要更多信息,请与我们联系。

更新_1

Subnet1 NACL 规则:

在此处输入图像描述

Subnet2 NACL 规则:

在此处输入图像描述

Subnet3 NACL 规则:

在此处输入图像描述

VPC2 NACL 规则上的默认子网:

在此处输入图像描述

4

0 回答 0