Linux iptables chuyển tiếp cổng ssh (từ chối martian)


12

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:

  1. 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ọ.
  2. 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.


Khi đọc thêm bài Meta trên UL vs SF, tôi cũng nhận thấy yêu cầu từ Michael không phải là crosspost. Tôi chỉ vượt qua điều này bởi vì nó được đánh dấu đặc biệt ngoài chủ đề tại SF, vì vậy nếu nó phù hợp hơn và có thể chỉ cần di chuyển câu hỏi ban đầu và đóng câu hỏi này, điều đó cũng sẽ rất tuyệt.
Đánh dấu

việc đặt net.ipv4.conf.default.rp_filter = 0 và net.ipv4.conf.all.rp_filter = 0 trong /etc/sysctl.conf của bạn và thực hiện "sudo sysctl -p" có giải quyết được vấn đề của bạn không?
Rui F Ribeiro

Tôi đã thử áp dụng cả hai trực tiếp, tức là. 'sysctl net.ipv4.conf.default.rp_filter = 0', cũng bao gồm một cho giao diện riêng tư cụ thể của tôi. Tôi đã xác nhận rằng chúng được đặt thông qua 'sysctl -a', tuy nhiên, các gói martian đến 127.0.0.1 vẫn đang bị từ chối. Và ngay cả khi điều này có hiệu quả, việc mở tất cả các giao diện của tôi cho các nhà truyền giáo không phải là điều tôi muốn. Tôi thậm chí không muốn mở một giao diện (albiet private). Tôi biết chính xác các gói martian nào tôi muốn cho phép và đang mong muốn / hy vọng một biểu thức NAT / mangle iptables để cho phép tôi thực hiện điều này.
Đánh dấu

Bạn có thể muốn net.ipv4.conf.default.rp_filter = 2 và một số quy tắc iptables khác
Rui F Ribeiro

Câu trả lời:


1

Vấn đề với việc thực hiện DNAT tới 127.0.0.1 giáp000 là khi phía từ xa phản hồi, các gói này trở lại công cụ định tuyến như thể chúng có nguồn gốc cục bộ (từ 127.0.0.1) nhưng chúng có địa chỉ đích bên ngoài. SNAT / MASQUERADE phù hợp với giao diện bên ngoài sẽ bắt chúng và viết lại chúng, nhưng các quyết định định tuyến phải được thực hiện cho các gói đến giao diện đó trước tiên và chúng không cho phép các gói này không có thật theo mặc định. Công cụ định tuyến không thể đảm bảo bạn sẽ nhớ viết lại sau.

Điều mà bạn nên có thể làm thay vào đó là từ chối mọi kết nối bên ngoài tới 192.168.1.1 giáp000 tại iptables INPUT ngoài các kết nối đến từ 192.168.1.10 bằng cách sử dụng !đối số trước -sđặc tả địa chỉ nguồn. Nếu bạn sử dụng thiết lập lại TCP làm cơ chế từ chối ( -j REJECT --reject-with tcp-resetthay vì không thể truy cập đích ICMP mặc định), thì nó sẽ giống hệt như trường hợp không có gì nghe trên địa chỉ đó: kết hợp cổng xa như thế giới bên ngoài.


0

Tôi sẽ sử dụng openVPN để tạo một đường hầm từ Bộ định tuyến đến RemoteGateway.

Sau đó, tôi sẽ, trên Router, thêm một tuyến đường:

định tuyến thêm -host RemoteTarget gw RemoteGateway-VPNaddress

sử dụng quy tắc iptables đơn giản bất cứ nơi nào bạn muốn để giới hạn cổng nào bạn cho phép Nguồn truy cập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.