Tôi có một trường hợp sử dụng kỳ lạ, trong đó một nhóm chạy trong Azure Kubernetes cần định tuyến lưu lượng truy cập từ các cổng cụ thể đến các mục tiêu cụ thể thông qua một đường hầm VPN chuyên dụng. Nhưng những mục tiêu đó là các IP riêng và do đó có thể có cùng một IP cho các mục tiêu khác nhau. Nhóm bên cạnh định tuyến cũng là Máy chủ OpenVPN nơi các mục tiêu kết nối với. Một ví dụ:
Truyền thông đến cổng 10 được định tuyến đến IP 10.0.0.4:80 thông qua VPN IP 10.118.0.2
và đồng thời chúng ta có thể có:
Truyền thông đến cổng 20 được định tuyến đến IP 10.0.0.4:80 thông qua VPN IP 10.118.0.3
Mặc dù IP mục tiêu giống nhau, nhưng chúng là các máy khác nhau. Vì vậy, để đạt được điều này, tôi đã đưa ra giải pháp khả thi này:
/sbin/iptables --table mangle --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump MARK --set-mark "10"
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip quy tắc thêm ưu tiên "10" từ tất cả fwmark "10" tra cứu "10"
/sbin/ip route thêm "10.0.0.4" qua "10.118.0.2" bảng 10
Điều này sẽ cho phép cả hai giao tiếp hoạt động cùng lúc với lưu lượng được định tuyến đến đúng máy. Nhưng những gì tôi thấy là các gói được đánh dấu, trong bảng mangle. Nhưng sau đó không bao giờ đến được các bảng NAT. Tôi phát hiện ra rằng nó có liên quan đến rt_filter. Thêm về điều đó dưới đây. Hiện tại, và nó đang hoạt động, là như thế này:
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip định tuyến thêm "10.0.0.4" qua "10.118.0.2"
Tuy nhiên, nếu một tuyến thứ hai được thiết lập, giống như trong ví dụ đầu tiên, lệnh sẽ như sau:
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "20" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip định tuyến thêm "10.0.0.4" qua "10.118.0.3"
Điều này sẽ tạo một tuyến đường khác trong Bảng tuyến đường chính cho cùng một mục tiêu. Nhưng sau đó, người dùng khi truy cập 192.168.0.100 có thể được định tuyến đến máy được kết nối với 10.118.0.3 hoặc 10.118.0.2.
Bên cạnh các quy tắc này, đối với tất cả chúng, quy tắc này luôn được bật để cho phép lưu lượng truy cập quay lại giao diện tap0 nơi giao tiếp với 10.118.0.X:
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
Thật không may, tôi không thể biết IP nguồn người dùng, nếu không thì việc giải quyết sẽ rất đơn giản. IP nguồn cho bất kỳ giao tiếp nào đến cổng này sẽ luôn giống nhau vì giao tiếp cần phải đi qua một dịch vụ khác che dấu IP nguồn thực.
Tôi đã thấy trong các chủ đề khác rằng để đánh dấu các gói đến trong vùng chứa/nhóm, tôi cần tắt rt_filter. Tuy nhiên tôi không thể làm điều đó, nó nói rằng đó là một hệ thống tệp chỉ đọc và tôi không biết liệu có thể thay đổi điều đó trong Cụm Azure Kubernetes hay không.
Có giải pháp nào khác ngoài việc đánh dấu các gói không? Hay còn thiếu thứ gì khác liên quan đến việc đánh dấu gói tin?