Điểm:4

Linux: làm cho lưu lượng truy cập từ cùng một máy chủ dường như đến từ các địa chỉ IP khác nhau

lá cờ cn

Tôi đang sử dụng thư viện khách hàng (https://github.com/Beckhoff/ADS) để kết nối với PLC từ máy Linux qua TCP. Tuy nhiên, thư viện chỉ có thể thực hiện một kết nối duy nhất giữa IP nguồn và địa chỉ IP đích của PLC. Mục tiêu của tôi là kết nối với IP/PLC từ xa với nhiều máy khách, tức là PLC từ xa phải có khả năng phân biệt các kết nối máy khách dựa trên địa chỉ IP (khác) của máy khách.

Tôi đã hy vọng đạt được điều này với một số thông minh iptables quy tắc; cách khác, có thể các không gian tên mạng Linux cũng có thể hoạt động.

Cho iptables tuyến đường (chơi chữ?), kế hoạch của tôi là gán nhiều địa chỉ IP cho cùng một NIC trên máy Linux.Vì dịch vụ từ xa lắng nghe trên một cổng duy nhất (48898), tôi không thể đơn giản sử dụng các cổng đích khác nhau trong iptables quy tắc. Vì vậy, tôi đã nghĩ một cái gì đó như thế này:

PLC từ xa: 192.168.1.10/24
Máy tính Linux: 192.168.1.20/24 (ip addr add 192.168.1.20/24 dev enp2s0)
Máy tính Linux: 192.168.1.21/24 (ip addr add 192.168.1.21/24 dev enp2s0)

  • Client-A chỉ cần kết nối từ 192.168.1.20 đến 192.168.1.10
  • Client-A chỉ cần kết nối từ 192.168.1.21 đến (ảo) 192.168.1.11

Bằng cách sử dụng địa chỉ IP "ảo" cho PLC từ xa, tôi muốn có thể phân biệt các kết nối TCP, vì vậy tôi biết gói nào bắt nguồn từ Máy khách-A và gói nào bắt nguồn từ Máy khách-B. Bây giờ tôi cần phải làm một số iptables ma thuật dọc theo dòng:

  1. hướng ngoaị: nếu địa chỉ IP đích == 192.168.1.11 1.1 -> ghi lại địa chỉ IP đích 192.168.1.10 1.1 -> ghi lại/đảm bảo địa chỉ IP nguồn là 192.168.1.21

  2. mới đến: nếu địa chỉ IP đích == 192.168.1.21 2.1 -> viết lại địa chỉ IP nguồn thành 192.168.1.11 (IP ảo của remote PLC)

Có lẽ thậm chí có thể "gắn thẻ" các kết nối TCP để dễ dàng phân biệt cái nào (bước 2).

Điểm:5
lá cờ cl
A.B

Đối với trường hợp này, theo dõi's NAT là đủ để thay đổi, gắn thẻ và xử lý lưu lượng phản hồi một cách chính xác cho kết nối. Người ta có thể sử dụng cả DNAT và SNAT và liên kết việc sử dụng chúng lại với nhau hoặc sử dụng kết hợp DNAT và các tuyến thích hợp.

ADNT

Mục tiêu này chỉ có giá trị trong bảng nat, trong ĐẶT TRƯỚC ĐẦU RA chuỗi và chuỗi do người dùng xác định chỉ được gọi từ những chuỗi đó. Nó xác định rằng địa chỉ đích của gói tin nên được sửa đổi (và tất cả các gói trong tương lai trong kết nối này sẽ cũng bị xáo trộn), và các quy tắc nên ngừng được kiểm tra. […]

SNAT

Mục tiêu này chỉ hợp lệ trong bảng nat, bên trong SAU ĐƯỜNGĐẦU VÀO chuỗi và chuỗi do người dùng xác định chỉ được gọi từ các chuỗi đó xiềng xích. Nó chỉ định rằng địa chỉ nguồn của gói phải là sửa đổi (và tất cả các gói trong tương lai trong kết nối này cũng sẽ được lộn xộn), và các quy tắc nên ngừng được kiểm tra. […]

iptables -t nat -A OUTPUT -d 192.168.1.11 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.12 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.13 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A OUTPUT -d 192.168.1.14 -j DNAT --to-destination 192.168.1.10

đặt địa chỉ nguồn bổ sung trên máy khách:

địa chỉ ip add 192.168.1.21/24 dev enp2s0
địa chỉ ip add 192.168.1.22/24 dev enp2s0
địa chỉ ip add 192.168.1.23/24 dev enp2s0
địa chỉ ip add 192.168.1.24/24 dev enp2s0
  • và liên kết hành động SNAT một cách có điều kiện với ban đầu địa chỉ đích (trước khi DNAT được thực hiện), sử dụng bộ lọc thích hợp với iptables' theo dõi trận đấu:

    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.11 -j SNAT --to-source 192.168.1.21
    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.12 -j SNAT --to-source 192.168.1.22
    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.13 -j SNAT --to-source 192.168.1.23
    iptables -t nat -A POSTROUTING -m conntrack --ctorigdst 192.168.1.14 -j SNAT --to-source 192.168.1.24
    
  • hoặc thay vì SNAT, gọn gàng hơn nhiều, hãy sử dụng tuyến đường gợi ý trực tiếp địa chỉ nguồn dự định cho từng đích (ngay cả khi nat/OUTPUT định tuyến lại, địa chỉ nguồn sẽ không thay đổi nữa sau khi được đặt). Điều này sẽ cho phép khách hàng và ss -tn dport == 48898 để biết và hiển thị đúng địa chỉ nguồn.Điều này trở thành:

    tuyến ip thêm 192.168.1.11/32 dev enp2s0 src 192.168.1.21
    tuyến ip thêm 192.168.1.12/32 dev enp2s0 src 192.168.1.22
    tuyến ip thêm 192.168.1.13/32 dev enp2s0 src 192.168.1.23
    tuyến ip thêm 192.168.1.14/32 dev enp2s0 src 192.168.1.24
    

Điều này phải được thực hiện như sau: một địa chỉ tại một thời điểm (DNAT có thể được đơn giản hóa/nhân tố hóa, nhưng không phải là phần thứ hai xử lý nguồn).

Một kết nối với thực tế 192.168.1.10 địa chỉ được giữ nguyên.

lá cờ cn
cảm ơn rất nhiều @ a-b - giải pháp và giải thích tuyệt vời - với cách tiếp cận này, tôi đã quản lý để mọi thứ hoạt độ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.