Chuyển tiếp một Localhost: Cổng tới InternalIP: NewPort


8

Chúng tôi đã có một ứng dụng chạy trên máy chủ linux của chúng tôi. Từ ứng dụng đó, khi chúng tôi thử và truy cập localhost (127.0.0.1): localport, nó sẽ được chuyển tiếp đến một IP bên ngoài. Người dùng sẽ chỉ thử và truy cập localhost trên một cổng nhất định sẽ được tự động chuyển tiếp. Tôi đã đọc trên bảng iptables nat, nhưng PREROUTING và POSTROUTING sẽ không được áp dụng nếu tôi đang truy cập một cổng trên localhost từ chính localhost mà không chạm vào giao diện mạng. Tự hỏi bảng OUTPUT có thể hữu ích nhưng khi tôi thử một số kết hợp, nó không hoạt động. Tôi đang sử dụng đúng hay hoàn toàn không thể làm được?

Ai đó có thể chỉ cho tôi đi đúng hướng?


Lưu lượng truy cập cục bộ đi qua giao diện loopback (thường lo). Bạn sẽ có thể thiết lập các quy tắc iptables trên nó.
John WH Smith

user40524 - Bạn đang tự hỏi tại sao bạn lại thay đổi phong cách và xóa "Cảm ơn"? Có bất kỳ lý do cụ thể mà nó phải là phong cách bạn đã chỉnh sửa như?
keerthi 2/2/2015

Câu trả lời:


13

Tôi đã tìm ra để làm điều này bản thân mình.

2 quy tắc và một cờ nên được thiết lập để đạt được điều này.

Ví dụ được sử dụng ở đây là cho "telnet localhost XXXX", nên chuyển tiếp các gói tới Ext.er.nal.IP: YYYY.

sysctl -w net.ipv4.conf.all.route_localnet = 1

Không may cờ này chỉ tồn tại trên các nhân linux mới nhất và không có sẵn trên kernel cũ (không có bất kỳ cờ thay thế nào trong kernel cũ). Tôi khá không chắc chắn hạt nhân chính xác là cờ có sẵn từ mặc dù. Tôi tin rằng nó có sẵn trên các phiên bản kernel 3.XX. Cờ này là để xem xét các địa chỉ loopback như một địa chỉ nguồn hoặc đích thích hợp. Nguồn: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

iptables -t nat -A OUTPUT -p tcp --dport XXXX -j DNAT - đến đích Ext.er.nal.IP: YYYY

Lệnh trên sẽ thay đổi các gói đến localhost: XXXX với IP đích là Ext.er.nal.IP: YYYY

iptables -t nat -A POSTROUTING -j MASQUERADE

Lệnh sẽ thay đổi IP nguồn dưới dạng ip công khai của máy của bạn.

Bạn có thể làm cho quy tắc của mình nghiêm ngặt hơn một chút bằng cách thêm IP đích và giao diện và giao diện thích hợp bằng cách sử dụng -s, -d, -i và -o. Xem "người đàn ông iptables".

Cảm ơn John WH Smith và Wurtel. Gợi ý rất hữu ích.


Cảm ơn bạn rất nhiều! Nó đã giúp tôi rất nhiều.
Nikmoon

6

Cách dễ nhất để thực hiện việc này là cài đặt netcatinetd(Debian có cái này trong openbsd-inetd).

Thêm một dòng vào /etc/inetd.conf:

127.0.0.1:1234 stream tcp nowait root /bin/nc nc ex.ter.nal.ip 1234

Thay thế 1234bằng số cổng thực và ex.ter.nal.ipbằng địa chỉ IP bên ngoài thực. Bạn có thể cần phải nối thêm .1000hoặc một số số lớn hơn vào nowaittùy chọn nếu cần thực hiện hơn 128 kết nối mỗi phút; điều này là để ngăn chặn các kết nối chạy khỏi tải hệ thống của bạn không cần thiết.

Tôi cũng có -q 4 -w 10như nctùy chọn như giúp trong hoàn cảnh của tôi, nhưng bạn có thể không cần nó.

Tải lại inetdsau khi sửa đổi inetd.conftập tin.

Làm theo cách này sử dụng ncbắt đầu inetdnhư một quá trình chuyển tiếp, hoạt động khá tốt.


Đề nghị của bạn rất hữu ích. Máy chủ của chúng tôi có xinetd không phải là vấn đề. Tôi đã cấu hình tập tin conf của nó nhưng không quản lý để làm cho nó hoạt động. Không thể tìm thấy lý do tại sao nó không hoạt động. Tôi muốn tránh sử dụng một ứng dụng khác để chuyển tiếp yêu cầu vì nó chiếm tài nguyên. Ứng dụng của chúng tôi có thể thiết lập hơn 500 kết nối nên chạy liên tục mà không bị gián đoạn. Tôi nghĩ xinetd thiết lập một quy trình cho mỗi kết nối có khả năng chiếm tới hơn 500 luồng. Có cách nào thông qua iptables mặc dù? (nhìn vào đề nghị của John WH Smiths)
keerthi 2/2/2015

Tôi đã thử một lần iptablesnhưng đã bỏ cuộc khá sớm và sử dụng inetdmánh khóe của mình. Tôi vừa thực hiện một nghiên cứu nhỏ và rõ ràng nó cần được thực hiện trong chuỗi natbàn OUTPUTvới một-j DNAT --to-destination ex.ter.nal.ip:port
wurtel
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.