Gần đây tôi đã gặp phải tình huống tôi cần hai địa chỉ IP trên cùng một mạng con được gán cho một máy chủ Linux để chúng tôi có thể chạy hai trang SSL / TLS. Cách tiếp cận đầu tiên của tôi là sử dụng bí danh IP, ví dụ như sử dụng eth0: 0, eth0: 1, v.v., nhưng quản trị viên mạng của chúng tôi có một số cài đặt khá nghiêm ngặt để bảo mật đã phá vỡ ý tưởng này:
- Họ sử dụng DHCP snooping và thông thường không cho phép địa chỉ IP tĩnh. Địa chỉ tĩnh được thực hiện bằng cách sử dụng các mục DHCP tĩnh, do đó, cùng một địa chỉ MAC luôn nhận được cùng một gán IP. Tính năng này có thể bị vô hiệu hóa trên mỗi tổng đài nếu bạn hỏi và bạn có lý do cho nó (rất may tôi có mối quan hệ tốt với những người trong mạng và điều này không khó thực hiện).
- Khi DHCP snooping bị tắt trên tổng đài, họ phải đặt một quy tắc cho công tắc cho biết địa chỉ MAC X được phép có địa chỉ IP Y. Thật không may, điều này cũng có tác dụng phụ là nói rằng địa chỉ MAC X chỉ được phép có Địa chỉ IP Y. Bí danh IP yêu cầu rằng địa chỉ MAC X được gán hai địa chỉ IP, vì vậy điều này không hoạt động.
Có thể có một cách xoay quanh những vấn đề này trên cấu hình chuyển đổi, nhưng trong nỗ lực duy trì mối quan hệ tốt với quản trị viên mạng, tôi đã cố gắng tìm cách khác. Có hai giao diện mạng có vẻ như bước hợp lý tiếp theo. Rất may, hệ thống Linux này là một máy ảo, vì vậy tôi có thể dễ dàng thêm giao diện mạng thứ hai (không cần khởi động lại, tôi có thể thêm - khá tuyệt). Một vài lần nhấn phím sau tôi có hai giao diện mạng hoạt động và cả hai đều lấy địa chỉ IP từ DHCP.
Nhưng sau đó, vấn đề xuất hiện: quản trị viên mạng có thể thấy (trên công tắc) mục ARP cho cả hai giao diện, nhưng chỉ giao diện mạng đầu tiên tôi đưa lên sẽ phản hồi ping hoặc bất kỳ loại lưu lượng TCP hoặc UDP nào.
Sau khi đào và chọc, đây là những gì tôi nghĩ ra. Nó có vẻ như để làm việc, nhưng nó cũng có vẻ là rất nhiều công việc cho một cái gì đó có vẻ như nó nên đơn giản. Bất kỳ ý tưởng thay thế ngoài đó?
Bước 1: Kích hoạt tính năng lọc ARP trên tất cả các giao diện:
# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf
Từ tệp mạng / ip-sysctl.txt trong tài liệu nhân Linux:
arp_filter - BOOLEAN
1 - Allows you to have multiple network interfaces on the same
subnet, and have the ARPs for each interface be answered
based on whether or not the kernel would route a packet from
the ARP'd IP out that interface (therefore you must use source
based routing for this to work). In other words it allows control
of which cards (usually 1) will respond to an arp request.
0 - (default) The kernel can respond to arp requests with addresses
from other interfaces. This may seem wrong but it usually makes
sense, because it increases the chance of successful communication.
IP addresses are owned by the complete host on Linux, not by
particular interfaces. Only for more complex setups like load-
balancing, does this behaviour cause problems.
arp_filter for the interface will be enabled if at least one of
conf/{all,interface}/arp_filter is set to TRUE,
it will be disabled otherwise
Bước 2: Thực hiện định tuyến dựa trên nguồn
Về cơ bản, tôi chỉ làm theo chỉ dẫn từ http://lartc.org/howto/lartc.rpdb.mult Môn-links.html , mặc dù trang đó được viết với một mục tiêu khác (liên quan đến hai ISP).
Giả sử rằng mạng con là 10.0.0.0/24, cổng là 10.0.0.1, địa chỉ IP cho eth0 là 10.0.0.100 và địa chỉ IP cho eth1 là 10.0.0.101.
Xác định hai bảng định tuyến mới có tên eth0 và eth1 trong / etc / iproute2 / rt_tables:
... top of file omitted ...
1 eth0
2 eth1
Xác định các tuyến đường cho hai bảng này:
# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1
Xác định quy tắc khi nào nên sử dụng bảng định tuyến mới:
# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1
Bảng định tuyến chính đã được DHCP chăm sóc (và thậm chí còn không rõ là nó rất cần thiết trong trường hợp này), nhưng về cơ bản nó tương đương với điều này:
# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101
Và Voila! Mọi thứ dường như chỉ hoạt động tốt. Gửi ping đến cả hai địa chỉ IP hoạt động tốt. Gửi ping từ hệ thống này sang các hệ thống khác và buộc ping sử dụng một giao diện cụ thể hoạt động tốt ( ping -I eth0 10.0.0.1
, ping -I eth1 10.0.0.1
). Và quan trọng nhất, tất cả lưu lượng TCP và UDP đến / từ một trong hai địa chỉ IP đều hoạt động như mong đợi.
Vì vậy, một lần nữa, câu hỏi của tôi là: có cách nào tốt hơn để làm điều này? Điều này có vẻ như rất nhiều công việc cho một vấn đề có vẻ đơn giản.
Cập nhật: Giải pháp trên kết thúc không đầy đủ. Mọi thứ hoạt động tốt nếu lưu lượng truy cập trên cùng một mạng con, nhưng giao tiếp với các mạng con khác sử dụng giao diện thứ 2 sẽ không hoạt động đúng. Thay vì đào một cái lỗ lớn hơn, cuối cùng tôi đã nói chuyện với các quản trị viên mạng và nhờ họ cho phép nhiều địa chỉ IP cho một giao diện và sử dụng bí danh IP (ví dụ: eth0 và eth0: 0).
ip
từ iproute2
để thêm nhiều hơn một địa chỉ vào cùng một giao diện.