Điểm:0

iptables NETMAP không điều chỉnh đáng tin cậy địa chỉ nguồn của các gói UDP phát đa hướng

lá cờ us

Trong trường hợp sử dụng nhúng/IoT, tôi có một máy chủ quản lý chạy Linux cần có khả năng giao tiếp với nhiều mạng mà mỗi mạng sử dụng một bộ địa chỉ IP tĩnh chung.

Điều này hầu hết hoạt động tốt, bao gồm cả lưu lượng phát đa hướng UDP, được cung cấp:

  • liên kết mạng cho mỗi mạng nhúng (gọi chúng eth1, eth2, vân vân)
  • một không gian tên mạng Linux riêng biệt cho từng mạng nhúng khác nhau (gọi chúng là ns1, ns2, vân vân)
  • một liên kết ngang hàng giữa mỗi không gian tên mạng và không gian tên gốc (gọi chúng ngang hàng1, ngang hàng2, v.v. từ phía không gian tên mạng và veth1, veth2, v.v. từ phía không gian tên gốc)
  • một quy tắc iptables NETMAP trong mỗi không gian tên để ánh xạ mạng con IP tĩnh xung đột (gọi nó là 192.168.0.x) đến một tập hợp các mạng con IP tĩnh không xung đột (gọi chúng là 192.168.1.x, 192.168.2.x, vân vân)
  • một bị làm bẩn thể hiện bên trong mỗi không gian tên mạng để chuyển tiếp đăng ký nhóm phát đa hướng
  • một địa chỉ IP riêng trong một mạng con riêng biệt (không phải NAT) cho phía không gian tên gốc của các liên kết ngang hàng để giải quyết chủ đề của câu hỏi này (gọi nó là 192.168.(x+100).1)

Để cố gắng hình dung các luồng lưu lượng:

[|không gian tên gốc|::veth1] <-> [peer1::(không gian tên ns1)::eth1] <-> mạng nhúng
[| |::veth2] <-> [peer2::(namespace ns2)::eth2] <-> mạng nhúng
... vân vân ...

ns1 ví dụ quy tắc NETMAP cho mạng con IP tĩnh:

sudo -n ip netns exec ns1 iptables -t nat -A PREROUTING -d 192.168.1.0/24 -i peer1 -j NETMAP --to 192.168.0.0/24
sudo -n ip netns exec ns1 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o peer1 -j NETMAP --to 192.168.1.0/24

ns1 ví dụ bị làm bẩn quy tắc cấu hình cho nhóm phát đa hướng được hỗ trợ:

mgroup từ nhóm eth1 239.255.60.60
mgroup từ nhóm peer1 239.255.60.60
mroute từ nhóm eth1 239.255.60.60 đến peer1
mroute từ nguồn peer1 192.168.101.1 nhóm 239.255.60.60 đến eth1

Chủ đề thực sự của câu hỏi này là có một trục trặc kỳ lạ trong NETMAP điều chỉnh IP nguồn mà mình chưa giải thích được, chỉ làm loanh quanh thôi.

hành vi mong đợi của tôi:

  • Đăng ký phát đa hướng UDP bên trong không gian tên mạng sẽ thấy NETMAP trước chưa sửa đổi 192.168.0.x địa chỉ nguồn
  • Đăng ký phát đa hướng UDP bên trong không gian tên gốc sẽ thấy post-NETMAP đã sửa đổi 192.168.1.x địa chỉ nguồn

Đó không phải là những gì xảy ra, mặc dù. Thay vào đó, người đăng ký trong cả hai không gian tên sẽ thấy địa chỉ nguồn 192.168.0.x trước NETMAP hoặc nếu không thì họ sẽ thấy địa chỉ 192.168.1.x sau NETMAP.

Các nguồn bộ lọc trên mroute từ peer1 cai trị trong hành vi vi phạm pháp luật có cấu hình để ngăn vòng lặp định tuyến phát đa hướng bắt đầu khi máy chủ chuyển sang tập hợp hành vi thứ hai.

Cho đến nay, tôi vẫn chưa thể xác định nguyên nhân gây ra sự chuyển đổi giữa hai trạng thái, chỉ giải quyết vấn đề ở lớp ứng dụng bằng cách điều chỉnh dựa trên không gian tên mạng đang hoạt động hoặc giao diện mạng nguồn khi thông tin địa chỉ nguồn có vẻ sai.

Mục tiêu của việc đặt câu hỏi là để giúp tìm ra điều nào sau đây áp dụng:

  • điều này dự kiến ​​sẽ không hoạt động, việc bù ở lớp ứng dụng là cách tốt nhất có thể thực hiện được (điều này dường như không thể xảy ra khi sử dụng các không gian tên mạng trong môi trường bộ chứa Linux)
  • có thứ gì đó khác cần được cấu hình (hoặc không được cấu hình) trong kernel, iptables hoặc smcroute để ngăn hành vi sai trái xảy ra

(Lưu ý: đây là một câu hỏi siêu bí truyền, rất cụ thể, vì vậy tôi đã tự hỏi liệu Kỹ thuật mạng có thể phù hợp hơn không, nhưng https://networkengineering.stackexchange.com/questions/64744/linux-local-multicast-egress-follows-forward-chain-when-smcroute-is-active nói rõ rằng đó là để làm việc với các bộ định tuyến thương mại, v.v., không phải cho cấu hình không gian tên mạng Linux. Tuy nhiên, tôi không rõ ràng về ranh giới giữa Lỗi máy chủ và trao đổi ngăn xếp Unix & Linux khi định cấu hình máy chủ Linux)

Điểm:1
lá cờ tr

người bảo trì của SMCRoute đây. Điều này chắc chắn sẽ làm việc. Chúng tôi sử dụng cách tiếp cận chính xác này, mặc dù với CTNH thực tế chứ không phải không gian tên mạng, cho các khách hàng khác nhau tại nơi làm việc.

Có một vấn đề rất giống nhau được báo cáo trong Trình theo dõi sự cố SMCRoute, điểm khác biệt duy nhất với bạn là họ chưa sử dụng NAT 1:1 với netmap (chưa).

Tôi đã quất lên một trường hợp thử nghiệm cho điều này để chuẩn bị cho bản phát hành tiếp theo (v2.5). Tôi chạy tất cả các thử nghiệm cục bộ và trong GitHub Actions (đám mây Azure) bằng cách sử dụng:

kiểm tra cd/
hủy chia sẻ -mrun ./multi.sh

Thử nghiệm có hai bộ định tuyến riêng biệt (R1 và R2) trong các không gian tên mạng chuyên dụng, với một phân đoạn mạng LAN được chia sẻ giữa chúng (192.168.0.0/24). Đằng sau mỗi bộ định tuyến là một mạng LAN riêng (10.0.0.0/24), giống nhau cho cả hai bộ định tuyến. Một giao diện (giả) bổ sung eth1 được sử dụng để định tuyến phát đa hướng từ mạng LAN dùng chung (eth0). Quy tắc NETMAP sử dụng chuỗi PREROUTING và POSTROUTING. Dịch mạng LAN riêng R1 thành 192.168.10.0/24 và mạng LAN riêng R2 thành 192.168.20.0/24. Như bạn có thể thấy bên dưới, các tuyến phát đa hướng được cài đặt trong nhân sử dụng các địa chỉ (toàn cầu) được ánh xạ 1:1.

>> Máy phát khởi động ...                                                           
R1[2811708]: Dữ liệu phát đa hướng mới từ 192.168.10.1 đến nhóm 225.1.2.3 trên VIF 1
R1[2811708]: Thêm 192.168.10.1 -> 225.1.2.3 từ VIF 1
R2[2811709]: Dữ liệu phát đa hướng mới từ 192.168.10.1 đến nhóm 225.1.2.3 trên VIF 0
R2[2811709]: Thêm 192.168.10.1 -> 225.1.2.3 từ VIF 0
R2[2811709]: Dữ liệu phát đa hướng mới từ 192.168.20.1 đến nhóm 225.1.2.3 trên VIF 1
R2[2811709]: Thêm 192.168.20.1 -> 225.1.2.3 từ VIF 1
R1[2811708]: Dữ liệu phát đa hướng mới từ 192.168.20.1 đến nhóm 225.1.2.3 trên VIF 0
R1[2811708]: Thêm 192.168.20.1 -> 225.1.2.3 từ VIF 0
>> Các tuyến phát đa hướng R1 và NAT 1:1 ...                                             
(192.168.10.1,225.1.2.3) Iif: eth1 Oifs: eth0 Trạng thái: đã giải quyết
(192.168.20.1,225.1.2.3) Iif: eth0 Oifs: eth1 Trạng thái: đã giải quyết
Chuỗi PREROUTING (chính sách CHẤP NHẬN 5 gói, 244 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         
    0 0 NETMAP tất cả -- bất kỳ ở bất kỳ đâu 192.168.10.0/24 tới:10.0.0.0/24

Chuỗi INPUT (chính sách CHẤP NHẬN 1 gói, 84 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         

ĐẦU RA chuỗi (chính sách CHẤP NHẬN 4 gói, 248 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         

Chuỗi POSTROUTING (chính sách CHẤP NHẬN 2 gói, 124 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         
    2 124 NETMAP tất cả -- bất kỳ 10.0.0.0/24 nào tới:192.168.10.0/24
>> R2 multicast route và 1:1 NAT ...                                             
(192.168.10.1,225.1.2.3) Iif: eth0 Oifs: eth1 Trạng thái: đã giải quyết
(192.168.20.1,225.1.2.3) Iif: eth1 Oifs: eth0 Trạng thái: đã giải quyết
Chuỗi PREROUTING (chính sách CHẤP NHẬN 4 gói, 204 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         
    1 84 NETMAP tất cả -- bất kỳ ở đâu 192.168.20.0/24 đến:10.0.0.0/24

Chuỗi INPUT (chính sách CHẤP NHẬN 2 gói, 168 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         

ĐẦU RA chuỗi (chính sách CHẤP NHẬN 3 gói, 164 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         

Chuỗi POSTROUTING (chính sách CHẤP NHẬN 1 gói, 40 byte)
 pkts byte đích prot chọn không tham gia đích nguồn         
    2 124 NETMAP tất cả -- bất kỳ 10.0.0.0/24 nào tới:192.168.20.0/24
>> Phân tích...                                                                   
    1 0,000000000 0,000000000 192.168.10.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe769, seq=1/256, ttl=2
    2 1.000105261 1.000105261 192.168.10.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe769, seq=2/512, ttl=2
    3 1.000957268 0.000852007 192.168.20.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe76b, seq=1/256, ttl=2
    4 2.024216212 1.023258944 192.168.10.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe769, seq=3/768, ttl=2
    5 2.024216229 0.000000017 192.168.20.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe76b, seq=2/512, ttl=2
    6 3.048426868 1.024210639 192.168.10.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe769, seq=4/1024, ttl=2
    7 3.048426842 -0.000000026 192.168.20.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe76b, seq=3/768, ttl=2
    8 4.072270331 1.023843489 192.168.10.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe769, seq=5/1280, ttl=2
    9 4.072270458 0.000000127 192.168.20.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe76b, seq=4/1024, ttl=2
   10 5.096430449 1.024159991 192.168.20.1 â 225.1.2.3 ICMP 98 Yêu cầu tiếng vọng (ping) id=0xe76b, seq=5/1280, ttl=2
 => 10 cho nhóm ff04::114, dự kiến ​​>= 8

Có thể hơi khó đọc, bạn có thể phải tham khảo trường hợp thử nghiệm để biết chi tiết. Dù sao, tôi nhận được kết quả nhất quán trong bản dịch, mà btw là trách nhiệm của Linux chứ không phải SMCRoute, vì vậy bạn có thể gặp lỗi kernel hoặc thứ gì đó. Máy trạm cá nhân có thể có Linux Mint với nhân 5.11.0 và máy chủ phụ trợ cho Tác vụ GitHub chạy Ubuntu 20.04 LTS, nhân 5.8.0, cả hai nhân phân phối khá vá lỗi, nhưng có thể là đường cơ sở để bắt đầu?

lá cờ us
Cảm ơn bạn! Biết rằng nó * nên * hoạt động ít nhất cho tôi biết rằng tôi chưa hoàn toàn làm hỏng cấu hình :) Hành vi sai trái ban đầu được xác định trên Debian 9, khá lâu đời vào thời điểm này. Tôi nên có một hệ thống với nhân 5.14.x để thử nghiệm trong tương lai không xa, nhưng tôi cũng sẽ quét các nhật ký thay đổi nhân 4.9 LTS để xem liệu có bất kỳ báo cáo lỗi nào có liên quan hợp lý không.
lá cờ us
Duyệt qua https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/log/?qt=grep&q=multicast Tôi bắt đầu tự hỏi liệu mình có bỏ sót điều gì trong phần mô tả kịch bản không cố gắng làm cho nó dễ giải thích hơn thực sự rất quan trọng để gây ra vấn đề: các mạng nhúng không tách biệt về mặt vật lý, chúng là các VLAN khác nhau trên một kết nối trung kế VLAN được gắn thẻ. Điều đó mang lại khả năng xử lý phát đa hướng cầu nối của hạt nhân cùng với mọi thứ khác :(
lá cờ us
Vì vậy, giả thuyết dự kiến ​​dựa trên câu trả lời này và duyệt qua các thông báo cam kết hạt nhân trong vài năm qua có đề cập đến "phát đa hướng": có thể có sự cố trong các hạt nhân cũ hơn đã được khắc phục bằng các bản cập nhật khác nhau cho xử lý đa hướng cầu và macvlan trong phiên bản mới hơn hạt nhân. Các bước tiếp theo sẽ là xem liệu sự cố có thể được tái tạo bằng nhân 4.9.283 (phiên bản LTS mới nhất cho Debian 9) hay nhân 5.8.0 trở lên hay không.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.