Để lấy địa chỉ IP công cộng được liên kết với một giao diện nhất định, trước tiên, hãy lấy địa chỉ MAC từ giao diện, sau đó truy xuất thông tin bạn đang tìm kiếm từ Dịch vụ siêu dữ liệu phiên bản (IMDS). Vì vậy, trong ví dụ của bạn ở trên, eth1 có
Địa chỉ MAC 06:a6:9a:4a:98:c6
, vì vậy bạn có thể lấy địa chỉ IPv4 công khai bằng:
cuộn tròn http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:1d:90:af:65:a3/public-ipv4s
Có thêm thông tin trong tài liệu AWS
Về vấn đề kết nối của bạn, bước đầu tiên, hãy kiểm tra kỹ định tuyến VPC, ACL và cấu hình nhóm bảo mật được liên kết với từng ENI của bạn. Những chi tiết này rất dễ định cấu hình sai và có thể dẫn đến giảm lưu lượng truy cập nếu bạn bỏ lỡ điều gì đó. Hãy kiểm tra những chi tiết đó trước, sau đó quay lại và đọc phần còn lại của bài đăng này. Có một vấn đề tế nhị khác đặc biệt xuất hiện khi bạn có nhiều ENI được liên kết với một phiên bản và đó có thể là vấn đề của bạn.
AWS VPC triển khai các biện pháp bảo vệ chống giả mạo nghiêm ngặt. Đây là một điều tốt vì nó bảo vệ AWS và khách hàng của mình khỏi việc tham gia vào các hình thức tấn công mạng khác nhau trong trường hợp một phiên bản bị xâm phạm vì lý do nào đó. Tuy nhiên, đó là điều bạn cần tính đến khi gắn nhiều ENI vào phiên bản.
Vấn đề là hành vi định tuyến cơ bản chỉ được điều khiển bởi điểm đến của một gói đi. Điều này có nghĩa là phản hồi đối với gói gửi đến có thể không được truyền qua cùng một giao diện mà gói ban đầu đã được nhận. Nhưng đối với VPC, đây được coi là gói "giả mạo", trong đó địa chỉ nguồn trong gói phản hồi không khớp với bất kỳ địa chỉ IP riêng nào được liên kết với ENI.
Xem xét cấu hình giao diện và bảng định tuyến sau:
admin@ip-10-0-0-115:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 trạng thái qdisc noqueue nhóm UNKNOWN mặc định qlen 1000
máy chủ phạm vi inet 127.0.0.1/8 lo
hợp lệ_lft mãi mãi ưa thích_lft mãi mãi
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc trạng thái mq nhóm LÊN mặc định qlen 1000
tên thay thế enp0s5
inet 10.0.0.115/24 brd 10.0.0.255 phạm vi toàn cầu động ens5
hợp lệ_lft 2801 giây ưa thích_lft 2801 giây
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq trạng thái nhóm LÊN mặc định qlen 1000
tên thay thế enp0s6
inet 10.0.0.8/24 brd 10.0.0.255 phạm vi toàn cầu động ens6
hợp lệ_lft 2889 giây ưa thích_lft 2889 giây
admin@ip-10-0-0-115:~$ ip ro
mặc định qua 10.0.0.1 dev ens5
10.0.0.0/24 dev ens5 liên kết phạm vi kernel proto src 10.0.0.115
10.0.0.0/24 dev ens6 liên kết phạm vi kernel proto src 10.0.0.8
Trong trường hợp này, 10.0.0.8 là địa chỉ được gán cho ens6. Một gói gửi đến địa chỉ IP này sẽ được nhận qua ens6 và được xử lý như mong đợi. Nhưng một phản hồi gửi đi cho gói đó sẽ được định tuyến theo bảng định tuyến ở trên và sẽ đi ra qua ens5 và bị VPC loại bỏ.
Bạn có thể kiểm tra điều này như thế này:
admin@ip-10-0-0-115:~$ ip ro nhận 8.8.8.8 từ 10.0.0.8
8.8.8.8 từ 10.0.0.8 qua 10.0.0.1 dev ens5 uid 1000
bộ đệm
Lưu ý rằng thiết bị là ens5, mặc dù 10.0.0.8 được gán cho ens6! VPC sẽ giảm lưu lượng truy cập này!
Để đảm bảo các gói của bạn được VPC phân phối, bạn cần triển khai định tuyến chính sách. Nói chung, định tuyến chính sách đề cập đến tình huống mà hệ thống của bạn sử dụng thông tin bổ sung ngoài đích đến để đưa ra quyết định định tuyến. Trong trường hợp này, bạn cũng cần tính đến địa chỉ IP nguồn. Những gì chúng ta cần làm ở đây là đảm bảo rằng bất kỳ gói gửi đi nào có địa chỉ nguồn là 10.0.0.8 đều rời khỏi ens6.
Định tuyến chính sách trong Linux thường được cấu hình bằng cách sử dụng ip(8)
chỉ huy. Để làm cho phiên bản với bảng định tuyến ở trên hoạt động, bạn sẽ muốn tạo một bảng định tuyến phụ dành riêng cho ens6. Thao tác với bảng phụ hoạt động giống như thao tác với bảng 'chính', ngoại trừ bạn chỉ định ID bảng.Vì vậy, trong trường hợp này, chúng ta có thể thêm một tuyến đến mạng cục bộ và một tuyến mặc định qua cổng vào bảng 10000 như sau:
admin@ip-10-0-0-115:~$ Sudo ip ro add 10.0.0.0/24 dev ens6 bảng 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 hiện bảng 10000
mặc định qua 10.0.0.1 dev ens6
Liên kết phạm vi 10.0.0.0/24 dev ens6
Và tạo quy tắc để định tuyến lưu lượng gửi đi từ 10.0.0.8 theo bảng này:
admin@ip-10-0-0-115:~$ Sudo quy tắc ip thêm từ 10.0.0.8/32 bảng 10000 pref 10000
admin@ip-10-0-0-115:~$ quy tắc ip
0: từ tất cả tra cứu cục bộ
10000: từ 10.0.0.8 tra cứu 10000
32766: từ tất cả tra cứu chính
32767: từ tất cả tra cứu mặc định
Lưu ý sự hiện diện của quy tắc 10000 cho thấy lưu lượng truy cập từ 10.0.0.8 sẽ được định tuyến qua bảng 10000.
Chúng tôi có thể xác nhận điều này với nhận ip ro
lần nữa:
admin@ip-10-0-0-115:~$ ip ro nhận 8.8.8.8 từ 10.0.0.8
8.8.8.8 từ 10.0.0.8 đến 10.0.0.1 dev ens6 bảng 10000 uid 1000
bộ đệm
Lưu ý rằng nó đang được định tuyến theo bảng 10000, nhưng quan trọng hơn là nó sẽ được gửi qua thiết bị ens6!
Amazon Linux tự động thiết lập các quy tắc định tuyến chính sách như thế này khi bạn có nhiều ENI được đính kèm với phiên bản của mình. Tôi không biết liệu Ubuntu có làm được không, vì vậy bạn có thể cần thực hiện một số nghiên cứu về mặt đó và có thể thực hiện tự động hóa của riêng mình cho tình huống cụ thể của bạn.