Ngữ nghĩa của :: và 0.0.0.0 trong các hệ điều hành ngăn xếp kép


10

Quay trở lại những ngày chỉ có IPv4, kết nối LISTEN hiển thị netstatkhi nghe trên 0.0.0.0sẽ phản hồi lại các kết nối trên bất kỳ giao diện IPv4 nào trong hệ thống.

Theo tôi hiểu, thành ngữ IPv6 mới ::lắng nghe trên tất cả các giao diện IPv6 IPv4 có sẵn . Điều này có đúng không, đối với tất cả các hệ điều hành (Unix, Windows, Mac)? Có thành ngữ nào chỉ nghe trên các giao diện IPv6 không?

Câu trả lời:


17

Thật không may, điều này khác nhau tùy thuộc vào hệ điều hành bạn đang sử dụng.

Trên Microsoft Windows, liên kết một ổ cắm ::chỉ liên kết với các cổng IPv6. Vì vậy, để lắng nghe trên tất cả các địa chỉ trên cả IPv4 và IPv6, bạn cần phải bám vào 0.0.0.0cũng như ::. Các trích xuất sau đây là từ một hộp Vista:

C:\>netstat -an | find "445"
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    [::]:445               [::]:0                 LISTENING

Ví dụ tôi đưa ra là cổng 445, được sử dụng cho lưu lượng SMB khi NetBIOS không được sử dụng. Như bạn có thể thấy, nó liên kết với cả hai 0.0.0.0::để thực hiện, tương ứng, cả máy khách IPv4 và IPv6 đều hoạt động.

Trên Linux, đã ::bao gồm các địa chỉ tương thích với IPv4, như bạn đã đoán chính xác, do đó, việc ràng buộc 0.0.0.0cũng là không cần thiết. Tôi đã viết một chương trình Python đơn giản chỉ liên kết với một AF_INET6socket trên ::. Mặc dù tôi cũng không liên kết với một AF_INETổ cắm (IPv4), nó vẫn chấp nhận các kết nối từ các máy khách IPv4. Nếu, nói, 10.1.1.3kết nối với nó, nó sẽ hiển thị như kết nối từ ::ffff:10.1.1.3.

Ngoại trừ việc nó có lông. Ở trên không áp dụng trên Linux nếu /proc/sys/net/ipv6/bindv6onlyđược đặt thành 1, trong trường hợp đó, hành vi hoàn toàn giống với Windows - ràng buộc ::sẽ chỉ lắng nghe các yêu cầu IPv6. Nếu bạn cũng muốn nghe các yêu cầu IPv4, bạn sẽ cần phải tạo một AF_INETổ cắm và cũng nghe 0.0.0.0theo. May mắn thay, mặc định bindv6only0, vì vậy có một cơ hội rất nhỏ bạn sẽ phải đối phó với điều này (trừ khi bạn sử dụng Debian, thứ thực sự mặc định bindv6only = 1).

Tất cả điều này rất hữu ích để biết trong việc kiểm tra xem liệu một dịch vụ có hỗ trợ IPv6 hay không và liệu nó cũng có hỗ trợ IPv4 hay không. Đây là máy chủ SSH của tôi:

$ netstat -64ln | grep 22
tcp6    0    0 :::22    :::*    LISTEN

Như bạn có thể thấy, SSH chỉ nghe trên ::cổng 22. Tuy nhiên, nó không chỉ lắng nghe các máy khách IPv6 - nó hoạt động tốt từ các máy khách IPv4, vì liên kết tương thích với IPv4. Để chứng minh điều này, nếu bạn nhìn vào điều này:

$ cat /proc/sys/net/ipv6/bindv6only 
0

bindv6onlybị vô hiệu hóa (mặc định). Nếu điều đó được đặt thành 1, thì tôi cũng sẽ phải khuyến khích SSH lắng nghe 0.0.0.0(hoặc thay vào đó).

Xin lỗi vì không có thông tin về phía Mac OS X. Tôi đã sử dụng nó trong quá khứ, nhưng tôi thích tính thẩm mỹ của Gnome, vì vậy tôi đã không sử dụng nó trong một thời gian rất dài. Tuy nhiên, tôi đoán rằng hành vi này giống như của Linux.

Hi vọng điêu nay co ich.


4

Điều này là không thể, vì một phân đoạn không gian địa chỉ IPv6 giống như không gian IPv4, vì vậy ngay cả khi bạn có thể vô hiệu hóa ổ cắm IPv4 bằng cách nào đó, bạn vẫn có thể gửi các gói IPv4 đến ổ cắm IPv6. Kiểm tra phần chuyển đổi IPv4 trong trang wikipedia IPv4 .

Chỉnh sửa: Ah, một chút nữa nó nói:

Một số ngăn xếp IPv6 phổ biến không hỗ trợ tính năng địa chỉ được ánh xạ IPv4, vì các ngăn xếp IPv6 và IPv4 là các triển khai riêng biệt (Microsoft Windows trước Vista / Longhorn: ví dụ XP / 2003) hoặc do lo ngại về bảo mật (OpenBSD). Trên các hệ điều hành này, cần phải mở một ổ cắm riêng cho từng giao thức IP được hỗ trợ. Trên một số hệ thống (ví dụ: Linux, NetBSD, FreeBSD) tính năng này được điều khiển bởi tùy chọn ổ cắm IPV6_V6ONLY như được chỉ định trong RFC 3493

-1

Bạn có thể có thể làm điều đó với ID mạng của mình, AAAA: BBBB: CCCC: DDDD :: hoặc bất cứ điều gì nó dành cho bạn. Điều đó sẽ đảm bảo rằng chỉ các giao diện IPv6 sẽ chọn nó. Tôi nghĩ. Tôi không phải là chủ IPv6.

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.