Как разрешить отказ в соединении на экземпляре EC2 и включить связь между сервером и клиентом между двумя VPC?

У меня два VPC (VPC1, VPC2) в разных регионах. Каждый VPC имеет два экземпляра EC2. На VPC1 у меня есть общедоступная и частная подсети (subnet1 и subnet2 соответственно), каждая со своей собственной таблицей маршрутизации, а на VPC2 у меня есть одна частная подсеть (subnet3). Кроме того, я включил пиринг VPC между двумя моими VPC через частные подсети.

Я также добавил к VPC1 шлюзы Интернета и NAT, чтобы иметь доступ к Интернету.

На VPC1 я запустил два экземпляра EC2: клиентский экземпляр, который работает в частной подсети, и public_ec2_subnet1, который работает в общедоступной подсети. На VPC2 у меня есть два экземпляра EC2, server2, который работает в частной подсети (subnet3) на VPC2, и server1, который работает в общедоступной подсети на default VPC of the region, NOT ON THE SAME VPC

На клиентском экземпляре EC2 я добавил файл java с именем который принимает IP-адрес в качестве аргумента, и как на server1, так и на server2 я добавил еще один файл 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 в и запустите Java-код сервера, и он ждет соединения
  • Я использую экземпляр public_ec2_subnet1 для SSH в экземпляре клиента и запускаю код EchoClient.java с общедоступным IP-адресом server1; однако соединение всегда возвращает тайм-аут
  • Я останавливаю server1 и открываю другой терминал и SSH в экземпляре public_ec2_subnet1 для SSH в экземпляр клиента, а затем я SSH в Server2, поскольку он находится в частной подсети, и запускаю код сервера
  • Я запускаю клиентский код с помощью Server2 поскольку пиринг VPC подключен, а подсеть 3 является частной, но это также дает мне ответ на тайм-аут.

Я добавил 0.0.0.0/0 и :: / 0 во входящие и исходящие правила для для экземпляр, и я добавил его только для для экземпляры.

Когда я пытаюсь использовать Консоль AWS для просмотра server1 (общедоступного) в браузере, мне отказывают в соединении.

Я провел небольшое исследование, и все решение, которое я нашел, заключалось в добавлении правил для входящих и исходящих сообщений. Я не уверен, почему клиент и любой из серверов не могут общаться.

Не мог бы кто-нибудь пролить свет на этот вопрос? Дайте мне знать, если вам понадобится дополнительная информация.

Обновление_1

Правило NACL подсети1:

Правило NACL подсети 2:

Правило NACL подсети 3:

Подсеть по умолчанию в правиле NACL VPC2:

0 ответов

Другие вопросы по тегам