Tôi có một cổng Linux thực hiện NAT cho mạng gia đình của tôi. Tôi có một mạng khác mà tôi muốn chuyển tiếp các gói đến một cách trong suốt, nhưng chỉ đến / từ các cổng / IP cụ thể (không phải là VPN). Dưới đây là một số ví dụ về IP và cổng để làm việc với:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
Tôi muốn máy Nguồn có thể nói chuyện với các cổng cụ thể trên Remote Target như thể nó có thể định tuyến trực tiếp từ Bộ định tuyến. Trên Bộ định tuyến, eth0 là mạng riêng và eth1 là mạng internet. Remote Gateway là một máy Linux khác mà tôi có thể ssh vào và nó có thể định tuyến trực tiếp đến Remote Target.
Nỗ lực của tôi đối với một giải pháp đơn giản là thiết lập chuyển tiếp cổng ssh trên Bộ định tuyến, chẳng hạn như:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
Điều này hoạt động tốt với Bộ định tuyến, giờ đây có thể kết nối cục bộ với cổng 5000. Vì vậy, "telnet localhost 5000" sẽ được kết nối với 192.168.50.50 giáp000 như mong đợi.
Bây giờ tôi muốn chuyển hướng lưu lượng truy cập từ Nguồn và kênh thông qua đường hầm ssh đã được thiết lập. Tôi đã thử một quy tắc NAT cho việc này:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
và vì Bộ định tuyến đã là cổng NAT của tôi, nên nó đã có quy tắc đăng xuất cần thiết:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
Hầu hết các câu hỏi và trả lời trên trang web này hoặc ở nơi khác dường như đều xử lý các cổng máy chủ chuyển tiếp hoặc kẹp tóc NAT, cả hai đều hoạt động tốt ở nơi khác, không áp dụng cho tình huống này. Tôi chắc chắn có thể chuyển tiếp các cổng Remote Target thông qua Remote Gateway, nhưng tôi không muốn các cổng có thể truy cập internet, tôi muốn chúng chỉ có thể truy cập thông qua đường hầm SSH an toàn.
Câu trả lời tốt nhất tôi có thể tìm thấy liên quan đến từ chối gói sao Hỏa trong nhân Linux:
iptables, làm thế nào để chuyển hướng cổng từ loopback?
Tôi đã kích hoạt tính năng ghi nhật ký của martian và xác nhận rằng kernel đang từ chối các gói này là martian. Ngoại trừ việc họ không: Tôi biết chính xác những gói này dùng để làm gì, chúng đến từ đâu và chúng sẽ đi đâu (đường hầm ssh của tôi).
Giải pháp "bùng binh" được trình bày có thể áp dụng cho câu hỏi ban đầu đó, nhưng không áp dụng cho trường hợp của tôi.
Tuy nhiên, trong khi viết / nghiên cứu câu hỏi này, tôi đã giải quyết vấn đề của mình bằng cách sử dụng liên kết IP nguồn SSH như vậy:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
Vì tôi không sử dụng loopback, điều này xoay quanh sự từ chối của sao Hỏa.
Tôi vẫn đăng câu hỏi ở đây vì hai lý do:
- Hy vọng rằng ai đó đang cố gắng làm điều gì đó tương tự trong tương lai có thể tìm thấy điều này trong các tìm kiếm của họ và cách giải quyết này có thể giúp họ.
- Tôi vẫn thích ý tưởng giữ cổng ssh của mình chuyển tiếp kết nối chỉ bị ràng buộc với loopback và có thể định tuyến đến chúng thông qua iptables. Vì tôi biết chính xác các gói này là gì và chúng sẽ đi đâu, nên có cách nào để tôi gắn cờ chúng sao cho bộ lọc martian Linux không từ chối chúng? Tất cả các tìm kiếm của tôi về chủ đề này đều dẫn đến rp_filter, điều này không giúp ích gì trong thử nghiệm của tôi. Và ngay cả khi nó đã hoạt động, nó không cụ thể cho các gói chính xác mà tôi đang cố gắng cho phép.
Tôi quan tâm đến việc đóng góp câu hỏi của mình và giải pháp cho tìm kiếm chung để cứu người khác hàng giờ tìm kiếm mà tôi đã làm chỉ để đi đến ngõ cụt, cũng như hy vọng có ai đó trả lời phần loopback / martian trong câu hỏi của tôi vẫn còn mở với tôi.