Как разрешить отказ в соединении на экземпляре 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 с именем
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: