Hai giao diện mạng và hai địa chỉ IP trên cùng một mạng con trong Linux


22

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:

  1. 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).
  2. 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).


Điểm khác biệt chính cần nhớ là IP không thuộc về giao diện, nó thuộc về máy. Vì vậy, chính xác là gửi một trong hai giao diện cho một trong hai thiết lập này, do đó tại sao nó đòi hỏi một số mánh khóe để không làm điều đó.
MikeyB

Tôi tin rằng định tuyến nguồn không cần thiết trong trường hợp này vì bộ lọc arp chỉ nên áp dụng khi chuyển đổi được gửi đến một giao diện / phải tìm nó trong số các cổng của nó. Tôi có thể sai, nhưng khi máy gửi dữ liệu về phía công tắc, IP trong trường nguồn (tiêu đề IP) không được kiểm tra, chỉ là arp gửi gói.
AndreasM

MikeyB là chính xác, định tuyến nguồn là cách duy nhất. Máy có thể chọn bất kỳ giao diện gửi đi nào mà nó muốn gửi lưu lượng, miễn là trên cùng một mạng con. Không quan trọng nếu IP không thực sự nằm trên giao diện đó hay không.
Patrick

2
AndreasM: Các gói đến không phải là vấn đề, đó là các gói gửi đi là vấn đề. Không có định tuyến nguồn, tất cả các gói đi sẽ sử dụng tuyến mặc định, được liên kết với một giao diện này hoặc giao diện khác. Mặc dù các gói đi sẽ có địa chỉ IP nguồn chính xác, các bộ lọc trên công tắc sẽ không cho phép chúng đi ra ngoài vì địa chỉ IP đó không thuộc về địa chỉ MAC của giao diện đó. Đối với chuyển đổi, có vẻ như một khách hàng đang cố gắng giả mạo IP của một khách hàng khác. (Đây là các công tắc 3 lớp thông minh).
Scott Duckworth

Các bí danh IP đã lỗi thời và một vụ hack, không phản ánh đúng thực tế, chưa kể đến việc gỡ xuống chính sẽ lấy đi tất cả các bí danh. Sử dụng iptừ iproute2để thêm nhiều hơn một địa chỉ vào cùng một giao diện.
pilona

Câu trả lời:


8

Có, cách tốt hơn là xây dựng trường hợp kinh doanh phù hợp và yêu cầu họ nới lỏng các quy tắc trên các công tắc để bạn có thể có nhiều IP trên một NIC.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.