Sử dụng iptables để chuyển tiếp ipv6 sang ipv4?


15

Hiện tại tôi có một thiết lập trong đó, do cấu hình sẽ mất mãi mãi để sửa, tôi có một máy chủ chỉ có thể được truy cập bởi ipv4. Tôi cũng, tuy nhiên, có một máy chủ có thể được truy cập bởi ipv6. Tôi đã tự hỏi nếu tôi có thể sử dụng iptables để chuyển tiếp lưu lượng ipv6 trên một cổng nhất định từ một trong các máy chủ sang máy chủ khác bằng lưu lượng ipv4.


2
Những gì bạn đang tìm kiếm được gọi là NAT64, điều mà tôi không nghĩ rằng iptables sẽ làm được (chưa).
Chris S

Chris đã đúng - RFC NAT64 vừa được xuất bản, tôi sẽ chờ một lúc cho đến khi mọi thứ thực sự hỗ trợ nó. Điều đó nói rằng, bạn có thể hoàn thành mục tiêu của mình theo một cách khác, nhưng chúng tôi không có đủ chi tiết để biết chắc chắn. Chẳng hạn, nếu đó là máy chủ HTTP, bạn có thể ủy quyền ngược lại các yêu cầu giữa các giao thức.
Shane Madden

Câu trả lời:


16

IPtables hiện không thể thực hiện điều này, vì vậy bạn cần một quy trình không gian người dùng để ủy quyền các kết nối. socat là một công cụ phù hợp cho việc này:

socat TCP6-LISTEN:1234,fork TCP4:1.2.3.4:1234

1
cảm ơn, điều này rất hữu ích Trong trường hợp bất cứ ai đang tìm kiếm một giải pháp UDP: socat UDP6-RECVFROM: 64444, fork UDP4-SENDTO: localhost: 64443 làm việc cho tôi
Alexander

10

Như đã lưu ý trong các bình luận về câu hỏi của bạn , NAT64 còn lâu mới sẵn sàng, thậm chí 3 năm sau.

Tuy nhiên, bạn có thể thử 6tunnel, như được đề xuất bởi sự bối rối.

May mắn thay, nó có mặt trong kho Debian và Ubuntu, vì vậy bạn có thể cài đặt nó rất dễ dàng bằng cách sử dụng sudo apt-get install 6tunnel. Nếu bạn đang sử dụng một hệ thống khác, bạn sẽ phải xây dựng nó từ nguồn .

Xây dựng từ nguồn thực sự không khó và chỉ là vấn đề chạy một số lệnh (với quyền root):

git clone https://github.com/wojtekka/6tunnel && cd 6tunnel && ./autogen.sh && make && make install

Đây là cú pháp của nó, được đơn giản hóa:

6tunnel [-4|-6] [-l local-host] original-port destination-host destination-port
  • Đây [-4|-6]là tùy chọn và cho phép bạn chỉ định liệu bạn sẽ liên kết (nghe) trên IPv4 hoặc IPv6 (tương ứng).
  • -lcũng là tùy chọn. Nó cho phép bạn chọn địa chỉ nào (IPv4 hoặc IPv6) mà bạn muốn liên kết.
  • Cổng ban đầu là cổng mà bạn sẽ liên kết.
  • Máy chủ đích là nơi bạn sẽ chuyển tiếp lưu lượng đến. Nó có thể ở bất cứ đâu: localhost, hoặc một nơi nào khác trên mạng của bạn hoặc trên Internet.
  • Cổng đích là cổng trên máy chủ đích sẽ nhận lưu lượng chuyển tiếp của bạn.

Ví dụ: nếu bạn muốn cho phép máy chủ chỉ có IPv4, nghe trên cổng 1337, được truy cập qua IPv6, hãy sử dụng:

6tunnel -6 1337 localhost 1337

Lệnh trên sẽ lắng nghe trên cổng 1337 trên IPv6 và chuyển tiếp lưu lượng đến cổng 1337 trên cùng một máy thông qua IPv4. Sau đó nó sẽ chạy trong nền, vì vậy bạn không phải lo lắng về nó.

Trên thực tế, bạn nên thiết lập một công việc định kỳ để đảm bảo rằng nó vẫn đang chạy. 6tunnelcung cấp một ví dụ cho sự thuận tiện của bạn! Chạy nó khi khởi động cũng không phải là một ý tưởng tồi.

Để biết thêm tài liệu, chạy 6tunnel -hhoặc man 6tunnel.


Đăng nó dưới dạng câu trả lời mới bởi vì chỉnh sửa câu trả lời hiện tại bằng cách đánh đố sẽ thay đổi quá nhiều và có thể bị từ chối như một chỉnh sửa được đề xuất!
Léo Lam

5

Các phiên bản gần đây xinetdcũng có thể nghe trên IPv6 và sau đó chuyển tiếp kết nối đến địa chỉ IPv4.

Một cấu hình mẫu lắng nghe các kết nối IPv6 trên cổng 3389 và chuyển tiếp chúng tới cổng 3389 của một địa chỉ IPv4 nội bộ:

service rdp_port_forward
{
    flags           = IPv6
    disable         = no
    type            = UNLISTED
    socket_type     = stream
    protocol        = tcp
    user            = nobody
    wait            = no
    redirect        = 10.187.20.42 3389
    port            = 3389
}

Điều này có thể hữu ích trong các môi trường hạn chế hơn vì xinetdcó khả năng được cài đặt với hệ thống cơ sở của bạn hoặc có sẵn trong kho của nhà cung cấp được phê duyệt.


3

Tôi muốn bình luận về câu trả lời và upvote của Leo Lams, nhưng tôi không có đủ danh tiếng. Trước hết: Cảm ơn Leo Lam rất nhiều!

Đối với bất kỳ ai đi theo chủ đề này: ISP của tôi đã thay đổi kết nối của tôi từ IPv4 sang IPv6 bằng Dual Stack Lite, điều đó có nghĩa là tôi không còn địa chỉ IPv4 của riêng mình nữa. Đây là một vấn đề vì tôi muốn truy cập Camera IP của mình từ bất kỳ nơi nào không hỗ trợ IPv6. Để giải quyết điều này tôi đã thử như sau:

  1. Kích hoạt chuyển tiếp IPv6 cho cổng 99 trong Bộ định tuyến của tôi sang máy Ubuntu.
  2. Máy Ubuntu (mạng gia đình): sudo 6tunnel -6 99 192.168.178.35 80
  3. vServer Debian với địa chỉ IPv6 và IPv6 tĩnh: sudo 6tunnel -4 99 IPV6PREFIXROUTER:IPV6INTERFACEIDUUBUNTUMACHINE 99
  4. vServer Debian: Cho phép kết nối tcp đến trên cổng 99 trong iptables

Tiền tố ipv6 được ký hiệu trong bộ định tuyến của tôi và id giao diện được ánh xạ trong quy trình chuyển tiếp IPv6.

Bây giờ tôi có thể truy cập máy ảnh từ bất cứ đâu bằng ví dụ tên miền vServer.com:99 .. Hoàn hảo! Tôi dự định hoặc là lấy một quả mâm xôi sẽ hoàn thành công việc này hoặc một chuối pi m3 cho các nhiệm vụ khác.


1
Bây giờ bạn biết phải làm gì khi bạn cần một camera IP khác. Đó là năm 2015; mua một cái không hỗ trợ IPv6 là một sự lãng phí hoàn toàn.
Michael Hampton

Nó không giống máy ảnh vài năm tuổi: p
Crumar

2

Nhiều hơn vì lợi ích của những người tìm thấy trang này hơn OP nhất thiết (tôi đến đây để tìm giải pháp cho kết nối IPv6 cho ứng dụng IPv4 (Twisted)), một khả năng là ứng dụng 6tunnel, nghe trên IPv6 và chuyển tiếp yêu cầu đến giao diện khác và Hải cảng.

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.