Định tuyến nguồn Linux, Mô hình hệ thống kết thúc mạnh / Mô hình máy chủ mạnh?


11

Máy Linux đa năng có thể triển khai Mô hình ES mạnh thực sự không?

Trường hợp sử dụng cụ thể

Tôi có một hệ thống với năm giao diện khác nhau, mỗi giao diện được kết nối với cùng một mạng con, do đó cùng một cổng vào Internet.

  • Tôi muốn lắng nghe trên từng giao diện riêng biệt trên cùng một cổng và đảm bảo rằng các gói luôn đi ra cùng giao diện mà chúng đi vào và đảm bảo rằng các gói cố gắng đi vào giao diện "sai" sẽ bị loại bỏ.
  • Tôi muốn có thể liên kết với từng giao diện và thực hiện các kết nối đi đến các điểm đến Internet luôn bắt nguồn từ cùng một IP nguồn mà tôi ràng buộc. Ví dụ,
    curl - giao diện giao diện_ip http://ipecho.net/plain
    phải luôn hiển thị cùng một địa chỉ IP mà tôi ràng buộc --interface.
  • Các tuyến tĩnh có thể có vấn đề do sử dụng DHCP trên một trong các giao diện này.

RFC 1122

Từ RFC 1122 - Yêu cầu đối với máy chủ Internet - Các lớp truyền thông, Phần 3.3.4.2 - Yêu cầu nhiều lần :

Những người triển khai máy chủ Internet đã sử dụng hai mô hình khái niệm khác nhau cho nhiều giai đoạn, được tóm tắt ngắn gọn trong cuộc thảo luận sau đây. Tài liệu này không ủng hộ mô hình nào được ưa thích; mỗi nơi dường như có một nơi. Sự gần gũi này được phản ánh trong các vấn đề (A) và (B) là tùy chọn.

  •   Mô hình ES mạnh

      Mô hình Strong ES (End System, tức là máy chủ) nhấn mạnh sự khác biệt của máy chủ / cổng (ES / IS) và do đó sẽ thay thế PHẢI cho CÓ THỂ trong các vấn đề (A) và (B) ở trên. Nó có xu hướng mô hình hóa một máy chủ nhiều khối như một tập hợp các máy chủ logic trong cùng một máy chủ vật lý.

      Đối với (A), những người đề xuất mô hình Strong ES lưu ý rằng các cơ chế định tuyến Internet tự động không thể định tuyến một datagram tới giao diện vật lý không tương ứng với địa chỉ đích.

      Trong mô hình Strong ES, tính toán tuyến đường cho một datagram đi là ánh xạ:

         route(src IP addr, dest IP addr, TOS) -> gateway
    

    Ở đây, địa chỉ nguồn được bao gồm dưới dạng tham số để chọn một cổng có thể truy cập trực tiếp trên giao diện vật lý tương ứng. Lưu ý rằng mô hình này yêu cầu một cách hợp lý rằng nhìn chung có ít nhất một cổng mặc định và tốt nhất là nhiều mặc định cho mỗi địa chỉ nguồn IP.


  •   Mô hình ES yếu

      Quan điểm này nhấn mạnh đến sự khác biệt của ES / IS và do đó sẽ thay thế KHÔNG PHẢI cho CÓ THỂ trong các vấn đề (A) và (B). Mô hình này có thể là mô hình tự nhiên hơn đối với các máy chủ có giao thức định tuyến cổng kết nối và cần thiết cho các máy chủ có chức năng cổng nhúng.

      Mô hình ES yếu có thể khiến cơ chế Redirect không thành công. Nếu một datagram được gửi ra một giao diện vật lý không tương ứng với địa chỉ đích, cổng đầu tiên sẽ không nhận ra khi nào nó cần gửi Redirect. Mặt khác, nếu máy chủ có chức năng cổng nhúng, thì nó có thông tin định tuyến mà không cần nghe Redirects.

      Trong mô hình Weak ES, tính toán tuyến đường cho một datagram đi là ánh xạ:

         route(dest IP addr, TOS) -> gateway, interface
    

  • Linux là một mô hình ES yếu theo mặc định, trong khi FreeBSD và các loại Unix khác hoạt động như các hệ thống ES mạnh. Có cách nào để làm cho nó hoạt động giống như một hệ thống ES mạnh không?

    Có gì sysctlhay thời gian biên dịch cấu hình sẽ cần phải được thiết lập để làm cho nó hoạt động giống như một ES mạnh theo mặc định, mà không cần thêm cụ thể định tuyến quy tắc cho bất kỳ giao diện mới bạn thêm? Tôi biết chúng ta có thể thực hiện lọc tuyến đường nghiêm ngặt thông qua net.ipv4.conf.default.rp_filter = 1, nhưng dường như còn nhiều điều hơn thế. Làm cách nào tôi có thể thực hiện Định tuyến dựa trên nguồn theo mặc định?


    1
    Đối với các cử tri gần gũi, tại sao? Điều này dường như là trực tiếp về chủ đề với tôi. Nếu không, nó sẽ ở đâu trong chủ đề?
    Sẽ

    Câu trả lời:


    8

    Chỉ cần thêm các quy tắc tường lửa sẽ không đủ cho cái này. Bạn muốn hệ thống định tuyến lưu lượng như thể đó là hai hệ thống độc lập tình cờ chia sẻ cùng một phần cứng và quy trình: đó là mô hình Strong ES Model hiệu quả.

    Khi nhắm đến Mô hình ES mạnh trong Linux, trước tiên bạn sẽ cần các cài đặt sysctl này:

    net.ipv4.conf.all.arp_filter=1 
    net.ipv4.conf.all.arp_ignore=1 # or even 2
    net.ipv4.conf.all.arp_announce=2
    

    Các cài đặt này sẽ làm cho ARP hoạt động phù hợp với Mô hình ES mạnh, tức là khi nhận được yêu cầu ARP, chỉ có giao diện với địa chỉ được yêu cầu chính xác mới trả lời và chỉ khi lưu lượng truy cập đến địa chỉ gốc mới được gửi đi thông qua cụ thể đó giao diện.

    Sau đó, vì bạn có năm giao diện mà bạn muốn hành xử khác nhau về định tuyến, bạn sẽ cần thiết lập năm bảng định tuyến tùy chỉnh. Bạn có thể sử dụng số để xác định chúng, nhưng nhìn chung việc xác định tên cho chúng rõ ràng hơn. Vì vậy, chọn số cho mỗi trong số chúng từ 1 đến 252 và một số tên phù hợp. (Các số 0, 253, 254 và 255 được bảo lưu.)

    Ví dụ: hãy chọn 100 = rtable0, 101 = rtable1, 102 = rtable2, 103 = rtable3 và 104 = rtable4. Thêm các số và tên này vào cuối /etc/iproute2/rt_tablestệp:

    # ...default stuff above...
    100    rtable0
    101    rtable1
    102    rtable2
    103    rtable3
    104    rtable4
    

    Sau đó, điền vào mỗi bảng định tuyến tùy chỉnh với một bộ mục tuyến tối thiểu phù hợp cho từng giao diện. (Tôi đang thay thế các giá trị thực tế bằng các tên biến môi trường được mô tả có hy vọng.)

    ip route add $ETH0_NET dev eth0 proto static src $ETH0_IP table rtable0
    ip route add default via $ETH0_GW dev eth0 proto static src $ETH0_IP table rtable0
    
    ip route add $ETH1_NET dev eth1 proto static src $ETH1_IP table rtable1
    ip route add default via $ETH1_GW dev eth1 proto static src $ETH1_IP table rtable1
    
    # ... and so on, for all 5 interfaces
    

    Cuối cùng, thêm các quy tắc định tuyến nâng cao sẽ kiểm tra địa chỉ nguồn của từng gói và chọn bảng định tuyến sẽ được sử dụng tương ứng:

    ip rule add from $ETH0_IP table rtable0
    ip rule add from $ETH1_IP table rtable1
    #...
    

    Để làm cho tất cả cấu hình này liên tục trong quá trình khởi động lại, bạn có thể phải viết các tập lệnh khởi động tùy chỉnh (hoặc có thể ifup-prehoặc ifup-posttập lệnh) để phù hợp với các quy ước phân phối Linux của bạn.

    Đối với một bảo hiểm bổ sung, bạn có thể thêm các quy tắc iptables trên mỗi giao diện để âm thầm thả bất kỳ gói tin nào có thể nhận được trên giao diện sai. Nếu tất cả đều ổn, số gói cho các số này sẽ vẫn là số 0: nếu chúng bắt đầu tăng, bạn có thể đã bỏ lỡ một cái gì đó trong cấu hình.

    iptables -A INPUT -m addrtype --dst-type UNICAST -i eth0 ! -d $ETH0_IP -j DROP
    iptables -A INPUT -m addrtype --dst-type UNICAST -i eth1 ! -d $ETH1_IP -j DROP
    # ... and so on for each interface
    

    Lưu ý: Tôi đã từng thực hiện một thiết lập như thế này dựa trên một cuộc thảo luận trên internet cũ của Rick Jones và các chuyên gia mạng khác. Họ nói, diễn giải, "trong khi tất cả điều này rõ ràng là cần thiết để đạt được hành vi Mô hình máy chủ mạnh trong Linux, tôi không thể đảm bảo rằng nó đủ cho tất cả các trường hợp sử dụng có thể". Nó làm việc hoàn hảo cho tôi; nó có thể hoặc không đủ cho bạn, tùy thuộc vào chính xác những gì bạn sẽ sử dụng nó cho.

    Cảnh báo: đảm bảo rằng bạn có một số loại quyền truy cập bảng điều khiển cục bộ hoặc từ xa vào hệ thống khi thiết lập cấu hình này. Thiết lập này cực kỳ có khả năng làm rối loạn hoàn toàn quyền truy cập mạng của bạn trong khi nó chỉ thực hiện được một nửa.

    Mặc dù có thể thiết lập giao diện N chỉ với các bảng định tuyến tùy chỉnh (N-1), nhưng sở thích cá nhân của tôi là di chuyển tất cả cấu hình định tuyến sang các bảng tùy chỉnh khi sử dụng định tuyến nâng cao. Có route -nhoặc ip route showvề cơ bản là trống trong khi hệ thống rõ ràng có kết nối mạng sẽ là một đầu mối rất lớn mà một cái gì đó rất đặc biệt đang diễn ra. Tuy nhiên, trở lại khi tôi thiết lập một hệ thống như thế này, tôi cũng thiết lập một thông báo vĩnh viễn /etc/motdvề việc định tuyến nâng cao có hiệu lực và vị trí của các tập lệnh thực tế thiết lập nó.


    Có thể và / hoặc hữu ích khi sử dụng các không gian tên mạng để thay thế (một số) cái này hoặc làm cho nó "mạnh hơn"?
    Jörg W Mittag

    1
    Đó sẽ là một điều khác biệt tinh tế. Một mô hình máy chủ mạnh về cơ bản chỉ có nghĩa là "không bị cắt ngắn": phản hồi cho kết nối đến sẽ được gửi ra cùng giao diện mà kết nối đã đến, mặc dù bảng định tuyến có thể chỉ ra rằng có thể có tuyến đường trực tiếp hơn sử dụng giao diện khác - và một kết nối sẽ chỉ được chấp nhận trên giao diện thực sự có địa chỉ IP đích. Các không gian tên mạng có thể đạt được điều tương tự, nhưng với chi phí phải nhân đôi các quy trình dịch vụ cho từng không gian tên.
    telcoM

    Thay vì ban hành nhiều iptableslệnh, người ta có thể sử dụng phép thuật này để tạo ra một lớp lót nft add rule inet filter input fib daddr . iif type != { local, broadcast, multicast } drop. Đây thực sự không phải là chủ đề của câu hỏi ban đầu nghĩ rằng đó là về cổng, tức là chuỗi đầu ra
    ZAB

    1

    Có một tùy chọn khác cho phép kiểm soát nhiều hơn về việc xử lý ARP. Có một cái nhìn vào arp_ignore.


    Cảm ơn! Nhưng điều này sẽ không liên quan nhiều đến việc định tuyến nguồn thực tế của các gói, phải không?
    Sẽ

    @Will arp_filterlà về định tuyến nguồn; arp_ignorechỉ về địa chỉ nguồn và đích.
    Hauke ​​Laging

    À, hiểu rồi! Vì vậy, một sự kết hợp của arp_filter, arp_ignorerp_filtercó thể làm các việc lừa? Lý tưởng nhất là tôi muốn mỗi giao diện hoạt động như thể chúng nằm trên các máy khác nhau và chỉ phản hồi từ cùng một giao diện mà một gói tin xuất hiện.
    Sẽ

    @ Bạn đã thử arp_filterchưa, nó không làm những gì bạn muốn? Nếu vậy thì thêm một số chi tiết về tình huống cho câu hỏi của bạn. Trong bình luận cuối cùng của bạn, bạn trộn lẫn phối cảnh: ARP là về nơi một gói được đưa vào. Định tuyến là về nơi nó đi ra. Điều bạn có thể muốn nói là bạn muốn các gói chỉ được chấp nhận trên các giao diện đó qua phản hồi sẽ được gửi. Nhưng arp_filternên làm điều đó.
    Hauke ​​Laging

    1
    @ Sẽ thôi, tôi đọc nhầm câu hỏi của bạn. Tôi đã thấy arp_filternhưng bạn đề cập rp_filter.
    Hauke ​​Laging
    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.