특정 사용 사례에 맞게 EC2 인스턴스를 설정하려고 합니다. 따라서 공개적으로 노출된 IP 주소를 가진 2개의 ENI가 필요합니다. (둘 다 ping이 가능해야 함)
지금까지 다음 단계를 수행했습니다.
- 동일한 서브넷에 연결된 2개의 네트워크 인터페이스
- 인스턴스 실행
- 인스턴스의 각 ENI 카드에 연결된 탄력적 IP 주소 2개를 생성했습니다.
EC2 인스턴스 네트워크 인터페이스 섹션에서 다음 결과를 볼 수 있습니다.
하지만 ping을 할 수 없었습니다 3.104.193.180
.
또한 내 ip address
결과는 다음과 같습니다. . .
ubuntu@ip-172-31-37-139:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:ce:dd:28:5b:b8 brd ff:ff:ff:ff:ff:ff
inet 172.31.37.139/20 brd 172.31.47.255 scope global dynamic eth0
valid_lft 3460sec preferred_lft 3460sec
inet6 fe80::4ce:ddff:fe28:5bb8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:a6:9a:4a:98:c6 brd ff:ff:ff:ff:ff:ff
inet 172.31.41.29/20 brd 172.31.47.255 scope global dynamic eth1
valid_lft 3460sec preferred_lft 3460sec
inet6 fe80::4a6:9aff:fe4a:98c6/64 scope link
valid_lft forever preferred_lft forever
그래서 내 질문은 입니다. . .
- 다른 IP를 노출/핑 가능하게 하려면 어떻게 해야 합니까?
- 서버 내에서 탄력적 IP를 모두 어떻게 알 수 있나요?
답변1
특정 인터페이스와 연결된 공용 IP 주소를 얻으려면 먼저 인터페이스에서 MAC 주소를 가져온 다음 IMDS(Instance Metadata Service)에서 찾고 있는 정보를 검색하세요. 따라서 위의 예에서 eth1에는 MAC 주소가 있으므로 다음 06:a6:9a:4a:98:c6
을 사용하여 공용 IPv4 주소를 얻을 수 있습니다.
curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:1d:90:af:65:a3/public-ipv4s
더 많은 정보가 있습니다AWS 설명서
연결 문제와 관련하여 첫 번째 단계로 각 ENI와 연결된 VPC 라우팅, ACL 및 보안 그룹 구성을 다시 확인하십시오. 이러한 세부 정보는 잘못 구성되기 쉽고, 뭔가를 놓칠 경우 트래픽이 중단될 수 있습니다. 먼저 자세한 내용을 확인한 후 돌아와서 이 게시물의 나머지 부분을 읽어보세요. 인스턴스와 연결된 여러 ENI가 있는 경우 특히 발생하는 또 다른 미묘한 문제가 있으며 이것이 문제일 수 있습니다.
AWS VPC는 엄격한 스푸핑 방지 보호 기능을 구현합니다. 이는 어떤 이유로든 인스턴스가 손상된 경우 다양한 형태의 네트워크 공격에 참여하지 않도록 AWS와 고객을 보호하므로 좋은 것입니다. 그러나 여러 ENI를 인스턴스에 연결할 때 고려해야 할 사항입니다.
문제는 기본 라우팅 동작이목적지나가는 패킷의. 이는 인바운드 패킷에 대한 응답이 원래 패킷이 수신된 동일한 인터페이스를 통해 전송되지 않을 수 있음을 의미합니다. 그러나 VPC의 경우 이는 응답 패킷의 소스 주소가 ENI와 연결된 프라이빗 IP 주소와 일치하지 않는다는 점에서 "스푸핑된" 패킷으로 간주됩니다.
다음 인터페이스 구성 및 라우팅 테이블을 고려하십시오.
admin@ip-10-0-0-115:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
altname enp0s5
inet 10.0.0.115/24 brd 10.0.0.255 scope global dynamic ens5
valid_lft 2801sec preferred_lft 2801sec
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
altname enp0s6
inet 10.0.0.8/24 brd 10.0.0.255 scope global dynamic ens6
valid_lft 2889sec preferred_lft 2889sec
admin@ip-10-0-0-115:~$ ip ro
default via 10.0.0.1 dev ens5
10.0.0.0/24 dev ens5 proto kernel scope link src 10.0.0.115
10.0.0.0/24 dev ens6 proto kernel scope link src 10.0.0.8
이 경우 10.0.0.8은 ens6에 할당된 주소입니다. 이 IP 주소에 대한 인바운드 패킷은 ens6을 통해 수신되어 예상대로 처리됩니다. 그러나 해당 패킷에 대한 아웃바운드 응답은 위의 라우팅 테이블에 따라 라우팅되고 ens5를 통해 송신되며 VPC에 의해 삭제됩니다.
다음과 같이 테스트할 수 있습니다.
admin@ip-10-0-0-115:~$ ip ro get 8.8.8.8 from 10.0.0.8
8.8.8.8 from 10.0.0.8 via 10.0.0.1 dev ens5 uid 1000
cache
10.0.0.8이 ens6에 할당되어 있어도 장치는 ens5입니다. VPC는 이 트래픽을 삭제합니다!
패킷이 VPC를 통해 전달되도록 하려면 다음을 구현해야 합니다.정책 라우팅. 광범위하게 말하면 정책 라우팅은 시스템이 라우팅 결정을 내리기 위해 대상 이외의 추가 정보를 사용하는 상황을 나타냅니다. 이 경우 소스 IP 주소도 고려해야 합니다. 여기서 해야 할 일은 소스 주소가 10.0.0.8인 모든 나가는 패킷이 ens6을 통해 떠나는지 확인하는 것입니다.
Linux의 정책 라우팅은 일반적으로 명령을 사용하여 구성됩니다 ip(8)
. 위의 라우팅 테이블이 작동하는 인스턴스를 만들려면 ens6에 특정한 보조 라우팅 테이블을 생성해야 합니다. 보조 테이블 조작은 테이블 ID를 지정한다는 점을 제외하면 '기본' 테이블 조작과 동일하게 작동합니다. 따라서 이 경우 로컬 네트워크에 대한 경로를 추가하고 게이트웨이를 통해 테이블 10000에 대한 기본 경로를 다음과 같이 추가할 수 있습니다.
admin@ip-10-0-0-115:~$ sudo ip ro add 10.0.0.0/24 dev ens6 table 10000
admin@ip-10-0-0-115:~$ sudo ip ro add default via 10.0.0.1 table 10000
admin@ip-10-0-0-115:~$ ip ro show table 10000
default via 10.0.0.1 dev ens6
10.0.0.0/24 dev ens6 scope link
그리고 다음 표에 따라 10.0.0.8에서 나가는 트래픽을 라우팅하는 규칙을 만듭니다.
admin@ip-10-0-0-115:~$ sudo ip rule add from 10.0.0.8/32 table 10000 pref 10000
admin@ip-10-0-0-115:~$ ip rule
0: from all lookup local
10000: from 10.0.0.8 lookup 10000
32766: from all lookup main
32767: from all lookup default
10.0.0.8의 트래픽이 테이블 10000을 통해 라우팅된다는 것을 보여주는 규칙 10000이 있음을 확인하세요.
우리는 이것을 ip ro get
다시 확인할 수 있습니다:
admin@ip-10-0-0-115:~$ ip ro get 8.8.8.8 from 10.0.0.8
8.8.8.8 from 10.0.0.8 via 10.0.0.1 dev ens6 table 10000 uid 1000
cache
테이블 10000에 따라 라우팅되고 있지만 더 중요한 것은 ens6 장치를 통해 전송된다는 점입니다!
Amazon Linux는 인스턴스에 여러 ENI가 연결된 경우 이와 같은 정책 라우팅 규칙을 자동으로 설정합니다. Ubuntu가 지원하는지 잘 모르겠습니다. 따라서 해당 부분에 대해 약간의 조사를 수행하고 특정 상황에 맞게 자체 자동화를 구현해야 할 수도 있습니다.