iptables chuyển hướng cổng không hoạt động cho localhost


54

Tôi muốn chuyển hướng tất cả lưu lượng truy cập từ cổng 443 sang cổng nội bộ 8080. Tôi đang sử dụng cấu hình này cho iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Điều này làm việc cho tất cả các khách hàng bên ngoài. Nhưng nếu tôi đang cố truy cập vào cổng 443 từ cùng một maschine thì tôi sẽ gặp lỗi từ chối kết nối.

wget https://localhost

Làm cách nào tôi có thể mở rộng quy tắc iptables để chuyển hướng lưu lượng truy cập cục bộ?


Chủ đề này cung cấp một câu trả lời tổng quát hơn: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen

1
Ai đó với rep có thể thêm dấu gạch chéo ngược vào lệnh trước khi ngắt dòng không?
Ciro Santilli 心 心 事件

Câu trả lời:


68

Giao diện PREROUTING không được sử dụng bởi giao diện loopback, bạn cũng cần thêm quy tắc OUTPUT:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

3
Không cần quy tắc đầu tiên. Các gói được tạo cục bộ không đi qua chuỗi PREROUTING.
Khaled

9
Tôi đã thêm quy tắc ban đầu cho mục đích cưỡng chế, vì anh ta cũng muốn lưu lượng truy cập bên ngoài chuyển hướng. Quy tắc không cần nguồn / đích nếu họ chỉ nói chấp nhận tất cả IP
Andy

Tôi xin lỗi vì đã không thấy câu trả lời của bạn khi tôi trả lời.
Andy

Xin chào Andy, tôi vẫn đang kết nối với máy chủ.com | <ip> |: 443 ... không thành công: Kết nối bị từ chối.
Chris

Xin chào Chris, đó có phải là Kết nối với localhost | 127.0.0.1 | 443 hay đó là tên miền? Nếu sau này và bạn đang chạy nó từ máy chủ của mình, bạn có thể gặp sự cố định tuyến nội bộ. Bạn có thể kiểm tra lại bằng cách thử wget server.com:8080 (mặc dù tôi cho rằng lý do bạn chuyển tiếp cổng là do nó bị chặn bên ngoài?). VPC của riêng tôi có vấn đề đó, tuy nhiên bạn có thể đặt cách giải quyết bằng cách xác định tên miền là 127.0.0.1 trong tệp / etc / hosts của bạn.
Andy

10

Để chuyển hướng các gói từ localhost sang máy khác theo quy tắc:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

sẽ hoạt động, NHƯNG bạn cũng cần kích hoạt tùy chọn này trong kernel:

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

Không có cài đặt kernel đó, nó sẽ không hoạt động.


Điều đó cũng sẽ làm việc. Tôi nghĩ làm tất cả trong iptables là sạch hơn.
quadruplebucky

Trên thực tế, cài đặt kernel được neded nếu đích nằm trên một máy khác, dòng VM hoặc máy từ xa.

không phải là nếu bạn có hai quy tắc như Andy đề xuất ở trên.
quadruplebucky

Xin lỗi, tôi đã nói về trường hợp chuyển tiếp đến một máy khác mà DNAT không hoạt động. Tôi đã xem xét câu trả lời này để tìm giải pháp cho một vấn đề khi tôi đang cố gắng chuyển tiếp một cái gì đó nghĩ rằng nó đang kết nối với localhost tới một containter trên cùng một máy. ví dụ: chạy máy chủ tên trong một thùng chứa cho các truy vấn cục bộ.

Trên thực tế, nó phụ thuộc vào phiên bản kernel> = 3.6, rõ ràng.
tăng gấp bốn lần vào

3

Còn cái này thì sao?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j GIẢM GIÁ --to-port 8080


2

Bạn nói rằng bạn đang nhận được kết nối từ chối lỗi. Điều này có nghĩa là không có quá trình nghe cục bộ trên cổng mà bạn đang cố gắng kết nối! Để kiểm tra các quá trình nghe, sử dụng lệnh:

$ sudo netstat -lnp | grep 8080

Sau khi áp dụng quy tắc, bạn nên có một quá trình lắng nghe trên cổng 8080 để được kết nối.

Có vẻ như bạn nên có quy tắc sau:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Hãy nhớ rằng bạn đang gửi từ localhost. Vì vậy, bạn cần chuyển hướng gói đầu ra.


1
Cảm ơn bạn đã trả lời. Quá trình đang lắng nghe trên cổng 8080. Do đó tôi muốn chuyển hướng tất cả lưu lượng truy cập đến cổng đó.
Chris

Bạn có chắc chắn quá trình đang lắng nghe trên giao diện vòng lặp không? Nó chỉ có thể được nghe trên giao diện vật lý của bạn. Thông thường, máy chủ web của bạn sẽ cần lắng nghe 0.0.0.0 thay vì nói, 192.168.10.0
MrMajestyk
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.