iptables chuyển hướng các yêu cầu bên ngoài đến 127.0.0.1


41

Tôi có một dịch vụ chạy trên 127.0.0.1 với cổng 2222. Tôi cần chuyển tiếp tất cả các yêu cầu tới 192.168.2.2:2222 (IP bên ngoài) chỉ từ mạng con 192.168.1.0/24 đến 127.0.0.1:2222.

Tôi đang cố gắng sử dụng nó, nhưng nó không hoạt động.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Làm thế nào tôi có thể làm điều này để làm việc?

CẬP NHẬT: Chỉnh sửa sơ đồ địa chỉ.


Chúng tôi cần một số làm rõ. Giao thông đến từ đâu? Giao thông ban đầu sẽ đi về đâu? Giao thông nên đi đâu? Khi tôi đọc nó, bạn muốn lưu lượng truy cập từ 192.168.1.0/24 đến 127.0.0.1:2222 được chuyển hướng đến 12,23.34,45:2222. Nhưng câu trả lời của Warren cho rằng bạn muốn lưu lượng truy cập từ 192.168.1.0/24 đến 12.23.34.45:2222 được chuyển hướng đến 127.0.0.1:222
Patrick

1
Lưu lượng truy cập đến từ mạng con 192.168.1.0/24 đến 192.168.2.2:2222 và nên được dịch sang dịch vụ trên 127.0.0.1:2222. Tôi đã sửa sơ đồ địa chỉ.
SimWhite

1
Bạn muốn một quy tắc cho phép lưu lượng truy cập vào cổng 2222trên giao diện loopback từ mạng con 192.168.1.0/24? Đó không chỉ là một loại quy tắc thiết lập. Xem tại đây: debfox.org/ Lần
slm

Vâng. Theo tôi hiểu tôi cần thêm quy tắc masq? Chuyển tiếp IP đã được kích hoạt tất nhiên.
SimWhite

Tại sao không chạy nó trên một IP "thực" và lọc lưu lượng truy cập đến từ các nguồn không mong muốn? Đó là những gì tường lửa dành cho, về cơ bản ...
vonbrand

Câu trả lời:


60

Quy tắc iptables bạn đang sử dụng sẽ hoạt động, nhưng có một thay đổi bổ sung bạn cần thực hiện:

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

(thay thế eth0bằng nic 192.168.2.2cư trú trên)

Theo mặc định, giá trị này là 0, hướng dẫn kernel không định tuyến lưu lượng truy cập bên ngoài 127.0.0.0/8. Điều này chỉ để bảo mật vì lưu lượng như vậy là không bình thường.


Lưu ý thêm: quy tắc iptables hiện tại của bạn quá rộng. Quy tắc của bạn chỉ định -d 192.168.1.0/24 --dport 2222là đối sánh đích, nghĩa là nếu máy của bạn cố gắng nói chuyện với một máy chủ khác trên cổng 2222 (tức là lưu lượng truy cập đi), nó cũng sẽ được chuyển hướng. Bạn có thể cần phải thay đổi -dtrận đấu thành -d 192.168.2.2, hoặc thêm -i eth0(hoặc bất cứ điều gì nic của bạn).


8
Thông tin này là đáng ngạc nhiên khó tìm.
Wren T.

Vâng, rất có giá trị thông tin khó tìm! Cảm ơn bạn! Nhưng tôi không có route_localnet. Đã có tên khác cho nó? (trong linux 2.6.30) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm chuyển tiếp mc_forwarding promote_secondaries rp_filter send_redirects thẻ
imz - Ivan Zakharyaschev

Tôi thấy, bản vá choroute_localnet gần đây hơn (ngày 7 tháng 6 năm 2012) so với kernel của tôi (2.6.30-std-def-alt15 # 1 SMP Mon ngày 14 tháng 12 08:45:48 UTC 2009). Ok, tôi chỉ đơn giản là đạt được chuyển tiếp cổng mong muốn (từ ngoài vào trong) với quy trình chuyển tiếp như netcat( nc) xinetdhoặc các tùy chọn chuyển tiếp cổng của ssh(tất nhiên là không hiệu quả và ngu ngốc, nhưng tôi đề cập đến nó, bởi vì, tốt, khả năng này là có).
imz - Ivan Zakharyaschev

2
2 xu của tôi: bạn có thể kích hoạt tham số này cho tất cả các giao diện vớisysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan

Giống như những người khác, thông tin này rất khó để có được. Cảm ơn, nếu tôi tìm thấy điều này sớm hơn, sẽ giúp tôi tiết kiệm rất nhiều nỗ lực.
Stephen Simpson

3

Bạn có thể chuyển hướng đến localhost nhưng không chuyển sang loopback (127.0.0.0/8). Loopback là một lỗ hổng. Bạn phải chuyển hướng đến một trong những giao diện thực sự của bạn. Hãy thử sử dụng GIẢM.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222


Đây có lẽ là câu trả lời tốt nhất mà không có sysctl voodo ...
Lester Cheung

Vẫn không có ích nếu cổng 222 chỉ được nghe trên localhost (quy tắc sẽ không thay đổi địa chỉ đích)
sanmai

Trong trường hợp đó, sử dụng-j DNAT --to-destination w.x.y.z:222
dresende

2

Điều gì xảy ra nếu câu trả lời đúng với route_localnetkhông hoạt động? ..

Nếu kernel của bạn không bao gồm bản vá choroute_localnet , thì ... hãy nâng cấp kernel!

Hoặc có nhiều cách khác để chuyển tiếp lưu lượng truy cập đến một giao diện sang một cổng khác trên giao diện khác (cụ thể là đến localhost) bằng cách chạy một quy trình nghe trên giao diện bên ngoài và chuyển tiếp lưu lượng.

netcat( nc), xinetdssh(và có lẽ nhiều hơn) là tất cả các ví dụ về các chương trình có thể làm điều này (mặc dù việc chọn sshsẽ là lạ và không hiệu quả).

Tôi đã viết một cấu hình cho xinetdviệc này. Bây giờ dịch vụ này được tự động đưa lên:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.oblà tên của máy chủ này trên giao diện mạng bên ngoài.)

Sau khi service xinetd reload, hãy kiểm tra xem nó có nghe không:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

Và thực sự, các kết nối đã đi qua!

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.