Điểm:0

Iptables Chuyển tiếp cổng trong khi bảo toàn IP của máy khách

lá cờ fr

TL;DR: Làm cách nào tôi có thể biến ip máy khách kết nối với VPS được lưu trữ từ xa thành IP được chuyển tiếp/natted, qua iptables, tới máy chủ trò chơi đang chạy tại nhà tôi?

Tôi có một máy chủ trò chơi Rust mà tôi đang lưu trữ tại nhà của mình. Tôi muốn điều đó được công khai, tuy nhiên tôi không nhất thiết muốn cung cấp địa chỉ IP của mình cho mọi người. Vì vậy, tôi đang thuê một VPS nhỏ có ý định sử dụng cơ bản như một proxy ngược. Tôi hiện đang sử dụng nginx để chuyển tiếp lưu lượng truy cập qua VPN máy chủ clinet, hoạt động tốt. Tuy nhiên, trên máy chủ trò chơi, IP của mọi người chơi là địa chỉ đường hầm của VPS, không phải IP thực của máy khách. tôi đã thử sử dụng độ trong suốt của proxy_pass $remote_addr:28015; proxy_responses 0 trong cấu hình nginx của tôi, không có thay đổi. Vì vậy, sau đó tôi đã chuyển sang làm điều đó thông qua iptables.

Tôi có thể làm cho nó hoạt động 99% theo cách tôi muốn, thực hiện chính xác điều này:

sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 28015 -j NAT --to-destination my_ip:28015
iptables -t nat -A PREROUTING -p udp --dport 28015 -j NAT --to-destination my_ip:28015
iptables -t nat -A PREROUTING -p tcp --dport 28016 -j NAT --to-destination my_ip:28016
iptables -t nat -A PREROUTING -p udp --dport 28016 -j NAT --to-destination my_ip:28016
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp -d my_ip --dport 28015 -m state --state MỚI, THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN
iptables -A FORWARD -p ucp -d my_ip --dport 28015 -m state --state MỚI, THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN
ufw vô hiệu hóa
kích hoạt ufw
khởi động lại vps\

Những gì nó làm về cơ bản giống như nginx, ở chỗ nó hoạt động tốt, nhưng mọi người chỉ có ip công khai của VPS (lưu ý rằng địa chỉ IP LAN và Công khai của VPS là giống nhau). Nếu tôi bỏ qua masqurade, nó không hoạt động.

Một số thông tin về thiết lập:
VPS có một giao diện duy nhất: eth0
VPS đang chạy Ubuntu 20.04
Ở nhà tôi, modem đang ở chế độ passthru tới pfsesne.Trên pfsense, tôi có các quy tắc chuyển tiếp cổng để chuyển 28015/28016 tcp/udp sang máy chủ trò chơi.

Chú thích bên lề: Tôi không chắc tại sao nginx không hoạt động cho việc này. Gần như là nginx không làm gì với proxy_pass $remote_addr chỉ thị.

Điểm:0
lá cờ us

Bạn không thể làm điều này với IPTables. Để chuyển tiếp gói hai chiều hoạt động bình thường, địa chỉ IP nguồn của các gói được gửi từ VPS của bạn phải chứa địa chỉ VPS. Nếu không, các gói trả lời sẽ không được gửi tới VPS để chuyển tiếp chúng tới máy khách.

Bạn cần hỗ trợ giao thức lớp 7 để chuyển tiếp địa chỉ IP ban đầu tới ứng dụng của mình. Trong HTTP/HTTPS, điều này được thực hiện như sau:

  1. proxy ngược nginx hoạt động trên VPS của bạn.
  2. Proxy đảo ngược thêm tiêu đề X-Forwarded-For: <clientip> để yêu cầu nó gửi đến máy chủ gốc.
  3. Máy chủ gốc đọc tiêu đề và sử dụng nó làm địa chỉ IP của máy khách thay vì sử dụng địa chỉ IP được liên kết với ổ cắm TCP.

Một khả năng khác là sử dụng proxy SOCKS giữa VPS và máy chủ gốc. SOCKS proxy đóng gói lưu lượng truy cập từ máy khách và thêm siêu dữ liệu bổ sung như địa chỉ IP của máy khách.

AAron avatar
lá cờ fr
Máy chủ trò chơi là tất cả lưu lượng UDP. `X-Forwarded-For` có hoạt động với các luồng UDP không?
lá cờ us
Nếu bạn đã triển khai một số giao thức lớp 7 có ngữ nghĩa như HTTP với các tiêu đề, v.v., thì có. Nhưng nếu bạn triển khai một giao thức ứng dụng tùy chỉnh trên UDP, thì giao thức đó cần hỗ trợ cơ chế này và bạn cũng cần triển khai ủy quyền cho giao thức đó. Vì bạn đã đề cập đến việc sử dụng nginx `proxy_pass`, tôi cho rằng bạn đang sử dụng giao thức giống như HTTP.
AAron avatar
lá cờ fr
Ý tôi là, theo như tôi biết thì đó là UDP tiêu chuẩn không có thật, điều duy nhất tôi làm với nó là chuyển hướng nó sang nơi khác.Trong nginx.conf của tôi, sau dấu ngoặc đóng cho khối máy chủ mặc định, tôi có: `luồng { người phục vụ { nghe 28015 udp; proxy_pass my_ip:28015; proxy_bind $remote_addr:$remote_port trong suốt; proxy_responses 0; } }`
lá cờ us
OK, thì đó là proxy bytestream mà nginx cung cấp. Đó là khái niệm chuyển tiếp lớp 4 và nó không có chức năng mà bạn đang tìm kiếm. Đối với tôi, có vẻ như các tùy chọn duy nhất của bạn là chuyển sang hoạt động qua HTTP,/HTTPS hoặc triển khai chức năng trong giao thức UDP cho phép proxy tùy chỉnh thêm IP máy khách vào thông báo giao thức. Bạn cũng cần triển khai proxy tùy chỉnh. Tuy nhiên, vì đây là một chức năng phổ biến nên có thể có các khung giao thức có chức năng này.
AAron avatar
lá cờ fr
Nginx có chức năng mà tôi đang tìm kiếm không?
AAron avatar
lá cờ fr
Tôi muốn làm rõ rằng tôi không thực hiện triển khai giao thức của riêng mình, đây không phải là trò chơi của tôi mà chỉ là trò chơi có các tùy chọn để lưu trữ một máy chủ chuyên dụng của riêng bạn. Vì vậy, nếu chức năng không tồn tại trong UDP và/hoặc nginx với một hoặc nhiều mô-đun được biên dịch, thì điều đó thực sự là không thể.
lá cờ us
Giao thức ứng dụng cần hỗ trợ chức năng. nginx ican chỉ hoạt động như một proxy bytestream, nó không thể triển khai bất kỳ chức năng bổ sung nào như thế này.
AAron avatar
lá cờ fr
Được rồi, có vẻ như tôi sẽ xử lý các IP giống nhau và xử lý các lệnh cấm dựa trên IP trên VPS; hoặc chỉ cần cắn viên đạn và lưu trữ toàn bộ nội dung trong một VPS từ xa. Tôi có tùy chọn tạo đường hầm VPN từ vps đến máy chủ trò chơi, nếu điều đó tạo ra sự khác biệt. Có phải tính minh bạch của IP là không thể * hoàn toàn * với iptables hay không trong trường hợp sử dụng của tôi? Tôi đã đọc lướt qua các bài báo thảo luận về việc thực hiện những việc như có các quy tắc chuyển tiếp ở cả hai đầu, nhưng hơi lờ mờ vì tôi không nghĩ rằng nó được áp dụng. Mặc dù vậy, tôi chắc chắn đã đạt đến điểm mà nước trái cây không đáng để vắt.
lá cờ us
IPTables chỉ hoạt động trên lớp 3 và lớp 4 của ngăn xếp mạng và không có cơ chế nào để có tính minh bạch của địa chỉ IP như bạn tìm kiếm. Lớp ứng dụng cần triển khai tính năng này. Đường hầm VPN có thể cũng không giúp được gì.

Đă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.