Thuyết phục apt-get * not * để sử dụng phương thức IPv6


239

ISP tôi làm việc đang thiết lập một mạng IPv6 nội bộ để chuẩn bị cuối cùng kết nối với internet IPv6. Do đó, một số máy chủ trong mạng này hiện đang cố gắng kết nối với security.debian.org qua địa chỉ IPv6 theo mặc định khi chạy apt-get updatevà điều đó dẫn đến việc phải chờ một khoảng thời gian dài bất cứ khi nào tôi tải xuống bất kỳ bản cập nhật nào. .

Có cách nào để nói với apt là thích IPv4 hoặc bỏ qua IPv6 hoàn toàn không?


3
Không nên trả lại ngay lập tức với một lỗi định tuyến?
pjc50

7
Không, hoàn toàn có thể mạng nội bộ của họ có định tuyến giữa nhiều mạng con (và máy chủ có cổng mặc định IPv6) nhưng không có kết nối IPv6 với thế giới bên ngoài.
Andrew Medico

5
Có lẽ có một cách để thiết lập /etc/gai.confđể security.debian.orgbản ghi A được trả về trước bản ghi AAA, nhưng tôi không biết chính xác nên đặt gì trong tệp đó.
Gilles

3
@AndrewMedico - nhưng các cổng mặc định của mạng của họ không biết rằng không có kết nối ipV6 bên ngoài và từ chối nỗ lực ra bên ngoài khá nhanh? Tôi nghĩ rằng có một vấn đề mạng ở đây cũng như câu hỏi đang được hỏi.
Michael Kohne

7
Sửa bộ định tuyến / tường lửa / bất cứ điều gì gây ra sự cố là cách "tốt nhất" để xử lý việc này. Nó sẽ được trả về một gói không thể truy cập đích ICMP. Điều này hoặc là không xảy ra, hoặc một cái gì đó đang chặn nó. Dù bằng cách nào, vấn đề nên được báo cáo cho người mạng của bạn.
Michael Hampton

Câu trả lời:


319

Thêm -o Acquire::ForceIPv4=truekhi chạy apt-get.

Nếu bạn muốn duy trì cài đặt, chỉ cần tạo /etc/apt/apt.conf.d/99force-ipv4 và đặt Acquire::ForceIPv4 "true";vào đó:

echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

Tùy chọn cấu hình Acquire::ForceIPv4Acquire::ForceIPv6đã được thêm vào phiên bản 0.9.7.9 ~ exp1 (xem lỗi 611891 ) có sẵn kể từ Ubuntu Saucy (phát hành vào tháng 10 năm 2013) và Debian Jessie (phát hành vào tháng 4 năm 2015).


7
Di chuyển "được chấp nhận" sang cái này; trong khi 30 điểm ban đầu Câu trả lời là hoàn toàn chính xác, đó là áp dụng trên quy mô rộng hơn nhiều trong khi điều này cung cấp các tùy chọn để chỉ hạn chế apt-get.
Shadur

Hãy được mô tả đúng trong câu trả lời của bạn. -o Acquire :: ForceIPv4 = true là phần bổ sung cho lệnh cho phép người dùng sử dụng ipv4
Kendrick

Trả lời được cập nhật theo đề nghị của Kendrick
mmoya

1
Đánh giá từ phần còn lại của tôi, apt.confbạn cần phải viết nó như thế này: Acquire::ForceIPv4 "true";(với dấu ngoặc kép)
mirabilos

6
@ZAB vì nếu bạn không có quyền ghi vào tệp, sudo echo 'test' > filesẽ không hoạt động vì chuyển hướng được thực thi với quyền của người dùng
LeartS

81

Như Gilles nói , sử dụng gai.conf. Ghi chú:

  1. Điều này hoạt động ở mức thấp hơn nhiều (mạng DNS và IP) so với APT, vì vậy nó sẽ thay đổi cách tất cả các mạng ứng dụng của bạn - ít nhất là, tất cả những gì sử dụng getaddrinfo.
  2. Trước khi chỉnh sửa gai.conf, bạn nên sao lưu và đọc nó (đừng lo lắng, nó rất ngắn). Các chỉnh sửa dưới đây có thể đã được đề cập trong tệp hiện tại của bạn; nếu tệp hiện tại chỉ ra điều gì đó khác với những gì được đề cập dưới đây, có lẽ bạn nên thích những gì trong tệp hiện tại của mình.

Nhưng nếu đây là những gì bạn muốn (có thể là như vậy), hãy tiếp tục. Nói rằng chúng tôi có hai máy chủ www.he.netwww.ripe.net:

$ host www.he.net
www.he.net is an alias for he.net.
he.net has address 216.218.186.2
he.net has IPv6 address 2001:470:0:76::2

$ host www.ripe.net
www.ripe.net has address 193.0.6.139
www.ripe.net has IPv6 address 2001:67c:2e8:22::c100:68b

Trường hợp 1: thích IPV4 cho tất cả các máy chủ

Nối vào /etc/gai.confdòng sau:

precedence ::ffff:0:0/96  100

Sau khi lưu tệp đã chỉnh sửa (không cần khởi động lại), bạn sẽ thấy các ứng dụng mạng (ví dụ telnet:) bằng IPV4: vd

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 216.218.186.2...

Trường hợp 2: thích IPV6 cho các máy chủ cụ thể

Nếu chúng tôi muốn chỉ thích IPV6 cho www.he.nethoặc mạng của nó, chúng tôi có thể nối thêm mặt nạ / tiền tố cho tất cả hoặc chỉ một phần nào đó trong địa chỉ IPV6 của nó /etc/gai.conf. Ví dụ: dòng sau:

precedence 2001:470::/32 100

(sau khi lưu tệp đã chỉnh sửa) tạo ra

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 2001:470:0:76::2...
^C

Trường hợp 3: thích IPV4 cho các máy chủ cụ thể

Nếu chúng ta đảo ngược mặt nạ thì điều ngược lại có đúng không? Theo @GrueMaster, việc bổ sung

precedence 2001:470::/96 100

đã làm việc cho anh ta sau khi vô hiệu hóa IPV6 cho security.ubuntu.com(nếu không thì nó bị treo mãi mãi).


Xem thêm:


Có lẽ tóm tắt nội dung trong trường hợp các liên kết trên biến mất?
Faheem Mitha

Vậy, cú pháp để vô hiệu hóa IPv6 cho một tên cụ thể, hoặc ít nhất là cho một địa chỉ (phạm vi) cụ thể là gì? Nếu bạn thêm nó vào bài viết của mình, nó sẽ là câu trả lời tốt nhất ở đây.
Gilles

Cảm ơn. Tôi đã thêm 2 dòng #security.debian.org has IPv6 address 2610:148:1f10:3::73 \n #security.debian.org has IPv6 address 2001:4f8:8:36::6 \n precedence 2001:4f8::/96 100 \n precedence 2610:148::/96 100 vào /etc/gai.conf và cập nhật apt-get hoạt động hoàn hảo ngay bây giờ.
don sáng

10

Bạn có thể thiết lập apt-cacher-ng trên một máy dự phòng để hoạt động như một proxy / bộ đệm cho tất cả các máy chủ của bạn. Bạn có thể buộc cấu hình chỉ sử dụng các máy chủ cụ thể hoặc sử dụng thủ thuật / etc / hosts được đề xuất bởi @badp trên một máy đó.

apt-get install apt-cacher-ng

Khi bạn đã thiết lập apt-cache-ng, bạn chỉ cần bỏ dòng sau (với địa chỉ IP / tên máy chủ được thay đổi để trỏ đến máy tính của bạn) trong /etc/apt/apt.conf.d/90httpproxy

Acquire::http { Proxy "http://[192.168.1.254]:3142"; };

Tôi sử dụng thiết lập đó để giảm việc sử dụng băng thông nhưng nó sẽ giải quyết vấn đề của bạn. Thật không may, tôi không biết cách vô hiệu hóa trực tiếp tra cứu ipv6 cho apt-get.


Vẫn không phải là một giải pháp hoàn hảo, nhưng tốt như nó sẽ có được. Cảm ơn.
Shadur

5

Bạn có thể giải quyết vấn đề này bằng cách thiết lập máy chủ proxy DNS loại bỏ phản hồi ip6.


Người giải quyết cục bộ của bạn vẫn cố lấy bản ghi AAAA phải không? Và hết giờ?
Mikel

4

Làm thế nào về việc thêm một dòng trong ghi /etc/hostsđè các địa chỉ có liên quan? ví dụ,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 

13
Tôi sẽ lưu giải pháp này lần cuối nếu hóa ra hoàn toàn không có cách nào khác; Tôi thực sự không thích lộn xộn /etc/hostsvới các địa chỉ IP mà tôi không sở hữu.
Shadur

@Shadur Vâng, tôi hoàn toàn có thể thấy quan điểm của bạn :)
badp

Lưu ý: những thứ này cần được lật, vì vậy nó là IP rồi tên máy chủ
Mike T

1

Chiếm chủ đề cũ, nhưng phải đối mặt với cùng một vấn đề gần đây. Vì vậy, dựa trên lời khuyên đưa ra ở trên và đầu ra của máy chủwhois :

# host security.debian.org
security.debian.org has address 212.211.132.250
security.debian.org has address 195.20.242.89
security.debian.org has address 212.211.132.32
security.debian.org has IPv6 address 2001:8d8:580:400:6564:a62:0:2
security.debian.org has IPv6 address 2001:a78:5:0:216:35ff:fe7f:be4f
security.debian.org has IPv6 address 2001:a78:5:1:216:35ff:fe7f:6ceb

Giải quyết vấn đề theo một cách hơi khác - hạ thấp mức độ ưu tiên của các mạng IPv6 có chứa security.debian.org trong /etc/gai.conf :

# Make IPv6 for security.debian.org undesirable
precedence 2001:8d8:580::/48    5
precedence 2001:a78:5::/48      5

Vì vậy, IPv6 vẫn được ưu tiên ngoại trừ security.debian.org .


1

Kể từ ngày 08 tháng 10 năm 2014, tôi đã gặp vấn đề tương tự, cố gắng cập nhật debian đằng sau một proxy trên mạng cục bộ. Với hy vọng nó sẽ có liên quan đến những người khác, tôi đăng phản hồi của mình ở đây. Như những người khác đã đề cập, chỉnh sửa /etc/hostslà một cái gì đó nên cẩn thận.

Nhưng cá nhân tôi chỉ muốn cập nhật.

Nội dung của /etc/apt/source.list khi thực hiện cập nhật (nó khác với trước khi cập nhật ..):

deb http://http.debian.net/debian/ testing main
deb-src http://http.debian.net/debian/ testing main

deb http://mirrors.kernel.org/debian/ wheezy main
deb-src http://mirrors.kernel.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

Nội dung của /etc/apt/apt.conf:

Acquire::http::proxy "http://192.168.1.10:7777/";
Acquire::http::Timeout "10";
Acquire::ftp::Timeout "10";

Ngoài ra / etc / hosts:

#Workaround for making apt-get work (08-10-2014)
195.20.242.89 security.debian.org
130.89.148.12 ftp.debian.org

Bây giờ, chạy apt-get update ; apt-get upgradenhư root hoạt động tốt.

Như đã đề cập trong các câu trả lời khác, hãy sử dụng, chạy lệnh máy chủ trên tên miền để lấy đúng ip để chèn vào tệp máy chủ.

Thí dụ:

$ host ftp.debian.org
ftp.debian.org has address 130.89.148.12

Điều này đã cập nhật thành công hệ thống Debian GNU/Linux testing (jessie). Bạn có thể không muốn chạy với kho kiểm tra, sau đó chỉ cần xóa nó khỏi các nguồn. Các kho lưu trữ thử nghiệm cung cấp cho bạn các bản cập nhật gần đây hơn của một số gói, nhưng không được coi là ổn định.


Một lần nữa, sửa đổi hoststập tin là một giải pháp tối ưu cao .
Shadur

0

Tôi đã tìm thấy một cách tốt hơn nhiều để làm điều này. Mở sources.listtệp của bạn và ghi lại tên máy chủ của repos. Nhận địa chỉ IPv4 của họ , sau đó chỉnh sửa sources.listbằng địa chỉ IPv4 thay vì tên máy chủ. Giờ đây, Apt-get nên liên hệ với các kho lưu trữ qua các địa chỉ IPv4 mà bạn đã chỉ định, bỏ qua IPv6.

Có một nhược điểm là các repos thường có một số loại cân bằng tải và / hoặc định vị địa lý IP được thiết lập, mà phương pháp này tất nhiên bỏ qua. Tuy nhiên, sẽ không có vấn đề gì nếu chỉ có một vài người làm việc đó. Nếu bạn thấy một máy nhân bản chậm, hãy thử lấy một địa chỉ IP repo khác (ví dụ: bằng cách sử dụng dịch vụ ping trực tuyến) và sử dụng địa chỉ đó.


2
Đó thực sự là một giải pháp tồi tệ vì những lý do bạn đã mô tả.
Shadur

-4

Bạn có thể thử điều này nếu làm việc cho bạn

user@ubuntuvm:~$ sudo bash
root@ubuntuvm:~# echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6 

-> thay thế tên giao diện của bạn


Đây là một giải pháp cho một câu hỏi khác với tôi đã hỏi.
Shadur
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.