โน้มน้าว apt-get * not * เพื่อใช้วิธี IPv6


239

ISP ที่ฉันทำงานอยู่กำลังติดตั้งเครือข่าย IPv6 ภายในเพื่อเตรียมพร้อมสำหรับการเชื่อมต่อกับอินเทอร์เน็ต IPv6 ในที่สุด เป็นผลให้เซิร์ฟเวอร์หลายเครื่องในเครือข่ายนี้พยายามเชื่อมต่อกับ security.debian.org ผ่านที่อยู่ IPv6 ตามค่าเริ่มต้นเมื่อทำงานapt-get updateและทำให้ต้องรอการหมดเวลานานเมื่อใดก็ตามที่ฉันดาวน์โหลดการอัปเดตทุกประเภท .

มีวิธีบอกหรือไม่ว่าจะชอบ IPv4 หรือไม่สนใจ IPv6 ทั้งหมด?


3
ไม่ควรส่งคืนทันทีที่เกิดความผิดพลาดในการกำหนดเส้นทาง
pjc50

7
ไม่เป็นไปได้ทั้งหมดที่เครือข่ายภายในของพวกเขามีเส้นทางระหว่างหลายเครือข่ายย่อย (และโฮสต์มีเกตเวย์เริ่มต้น IPv6) แต่ไม่มีการเชื่อมต่อ IPv6 ไปยังโลกภายนอก
Andrew Medico

5
อาจมีวิธีตั้งค่า/etc/gai.confเพื่อให้security.debian.orgระเบียน A ถูกส่งคืนก่อนระเบียน AAA แต่ฉันไม่รู้ว่าจะใส่อะไรลงในไฟล์นั้น
Gilles

3
@AndrewMedico - แต่เกตเวย์เริ่มต้นของเครือข่ายไม่ควรรู้ว่าไม่มีการเชื่อมต่อ ipV6 ภายนอกและปฏิเสธความพยายามขาออกที่ขอบอย่างรวดเร็วใช่ไหม ฉันคิดว่ามีปัญหาเครือข่ายที่นี่เช่นเดียวกับคำถามที่ถูกถาม
Michael Kohne

7
การแก้ไขเราเตอร์ / ไฟร์วอลล์ / อะไรก็ตามที่ทำให้เกิดปัญหาคือวิธีที่ "ดีที่สุด" ในการจัดการสิ่งนี้ มันควรจะส่งคืนแพ็กเก็ตที่ไม่สามารถเข้าถึงปลายทาง ICMP ได้ สิ่งนี้อาจไม่เกิดขึ้นหรือมีบางอย่างกำลังปิดกั้น ไม่ว่าจะด้วยวิธีใดควรรายงานปัญหาไปยังผู้คนในเครือข่ายของคุณ
Michael Hampton

คำตอบ:


319

เพิ่มเมื่อทำงาน-o Acquire::ForceIPv4=trueapt-get

หากคุณต้องการตั้งค่าแบบถาวรให้สร้าง/etc/apt/apt.conf.d/99force-ipv4และใส่Acquire::ForceIPv4 "true";เข้าไป:

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

ตัวเลือกการกำหนดค่าAcquire::ForceIPv4และAcquire::ForceIPv6เพิ่มลงในรุ่น0.9.7.9 ~ exp1 (ดูข้อผิดพลาด 611891 ) ซึ่งมีให้ตั้งแต่ Ubuntu Saucy (วางจำหน่ายในเดือนตุลาคม 2556) และ Debian Jessie (เปิดตัวในเดือนเมษายน 2015)


7
ย้าย "ยอมรับ" ไปที่นี้; ในขณะที่คำตอบเดิม 30 จุดที่ถูกต้องอย่างสมบูรณ์แบบก็บังคับในระดับที่กว้างมากในขณะนี้มีตัวเลือกให้เพียงจำกัด apt-get
Shadur

กรุณาอธิบายอย่างถูกต้องในคำตอบของคุณ -o Acquire :: ForceIPv4 = true คือส่วนเพิ่มเติมของคำสั่งเพื่ออนุญาตให้ผู้ใช้ใช้ ipv4
Kendrick

คำตอบอัพเดทตามคำแนะนำของ Kendrick
mmoya

1
ตัดสินจากส่วนที่เหลือของฉันapt.confคุณจะต้องเขียนเช่นนี้Acquire::ForceIPv4 "true";(กับคำพูดคู่)
mirabilos

6
@ZAB เพราะหากคุณไม่มีสิทธิ์ในการเขียนไฟล์sudo echo 'test' > fileจะไม่ทำงานเนื่องจากการเปลี่ยนเส้นทางจะดำเนินการโดยได้รับอนุญาตจากผู้ใช้
LeartS

81

ขณะที่กิลส์กล่าวว่าgai.confการใช้งาน หมายเหตุ:

  1. นี้ทำงานได้ในระดับที่ต่ำมาก (DNS และเครือข่าย IP) กว่า APT จึงจะเปลี่ยนวิธีการทุกการใช้งานเครือข่าย - getaddrinfoอย่างน้อยทุกการใช้งานที่
  2. ก่อนทำการแก้ไขgai.confคุณควรสำรองข้อมูลและอ่าน (ไม่ต้องกังวลมันสั้น) อาจมีการกล่าวถึงการแก้ไขด้านล่างในไฟล์ปัจจุบันของคุณ หากไฟล์ปัจจุบันระบุสิ่งที่แตกต่างจากที่ระบุไว้ด้านล่างคุณอาจต้องการสิ่งที่อยู่ในไฟล์ปัจจุบันของคุณ

แต่ถ้านี่คือสิ่งที่คุณต้องการ (ซึ่งมันน่าจะเป็น) มาเริ่มกันเลย สมมติว่าเรามีโฮสต์สองแห่งwww.he.netและwww.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

กรณีที่ 1: ต้องการ IPV4 สำหรับโฮสต์ทั้งหมด

ผนวกเข้า/etc/gai.confกับบรรทัดต่อไปนี้:

precedence ::ffff:0:0/96  100

หลังจากบันทึกไฟล์ที่แก้ไข (ไม่จำเป็นต้องรีสตาร์ท) คุณควรเห็นแอปเครือข่าย (เช่นtelnet) โดยใช้ IPV4: เช่น

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

กรณีที่ 2: ต้องการ IPV6 สำหรับโฮสต์ที่เฉพาะเจาะจง

ถ้าเราต้องการที่จะชอบ IPV6 เฉพาะwww.he.netหรือเครือข่ายของเราสามารถผนวกหน้ากาก / คำนำหน้าทั้งหมดหรือเพียงบางส่วนของที่อยู่ IPV6 /etc/gai.confในการ เช่นบรรทัดต่อไปนี้:

precedence 2001:470::/32 100

(หลังจากบันทึกไฟล์ที่แก้ไข) จะสร้าง

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

กรณีที่ 3: ต้องการ IPV4 สำหรับโฮสต์ที่เฉพาะเจาะจง

หากเราย้อนกลับหน้ากากจะย้อนกลับเป็นจริงหรือไม่ ตามที่ @GrueMaster ต่อท้าย

precedence 2001:470::/96 100

ทำงานให้กับเขาหลังจากปิดการใช้งาน IPV6 สำหรับsecurity.ubuntu.com(มิฉะนั้นมันจะหยุดตลอดไป)


ดูสิ่งนี้ด้วย:


อาจสรุปเนื้อหาในกรณีที่ลิงก์ด้านบนหายไป?
Faheem Mitha

ดังนั้นไวยากรณ์ของการปิดใช้งาน IPv6 สำหรับชื่อเฉพาะหรืออย่างน้อยสำหรับที่อยู่ (ช่วง) นั้นคืออะไร หากคุณเพิ่มเข้าไปในโพสต์ของคุณมันจะเป็นคำตอบที่ดีที่สุดที่นี่
Gilles

ขอบคุณ ฉันเพิ่ม 2 บรรทัด#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 ใน /etc/gai.conf ของฉันและการปรับปรุง apt-get ใช้งานได้อย่างสมบูรณ์แบบในขณะนี้
ดอนสดใส

10

คุณสามารถตั้งค่าapt-cacher-ngบนเครื่องสำรองเพื่อทำหน้าที่เป็น proxy / cache สำหรับโฮสต์ทั้งหมดของคุณ คุณสามารถบังคับให้การกำหนดค่าใช้เฉพาะโฮสต์ที่เจาะจงหรือใช้เคล็ดลับ / etc / hosts ที่ @badp แนะนำบนเครื่องหนึ่งเครื่อง

apt-get install apt-cacher-ng

เมื่อคุณมีการตั้งค่า apt-cache-ng คุณเพียงแค่ต้องวางบรรทัดต่อไปนี้ (ด้วยที่อยู่ IP / ชื่อโฮสต์ที่เปลี่ยนไปชี้ไปที่เครื่อง cacher ของคุณ) ใน/etc/apt/apt.conf.d/90httpproxy

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

ฉันใช้การตั้งค่านั้นเพื่อลดการใช้แบนด์วิดท์ แต่ควรแก้ไขปัญหาของคุณ น่าเสียดายที่ฉันไม่ทราบวิธีการปิดการใช้งานการค้นหา ipv6 โดยตรงเพื่อรับตัวเอง


ยังไม่ได้เป็นโซลูชันที่สมบูรณ์แบบ แต่ก็ดีเท่าที่จะเป็นไปได้ ขอบคุณ
Shadur

5

คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการตั้งค่าพร็อกซีเซิร์ฟเวอร์ DNS ที่ลดการตอบสนอง ip6


ผู้แก้ไขปัญหาในพื้นที่ของคุณจะยังพยายามรับบันทึก AAAA หรือไม่ หมดเวลาแล้วใช่ไหม
มิเคล

4

วิธีการเกี่ยวกับการเพิ่มบรรทัดในการ/etc/hostsแทนที่ที่อยู่ที่เกี่ยวข้อง? เช่น,

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

13
ฉันจะบันทึกโซลูชันนี้เป็นครั้งสุดท้ายหากปรากฏว่าไม่มีวิธีอื่นอย่างแน่นอน ฉันจริงๆไม่ชอบเกะกะ/etc/hostsมีที่อยู่ IP ฉันไม่ได้เป็นเจ้าของตัวเอง
Shadur

@Shadur ใช่ฉันทั้งหมดสามารถดู :) จุดของคุณ
badp

หมายเหตุ: สิ่งเหล่านี้จำเป็นต้องพลิกดังนั้นจึงเป็น IP แล้วชื่อโฮสต์
Mike T

1

การแย่งชิงหัวข้อเก่า แต่ต้องเผชิญกับปัญหาเดียวกันเมื่อเร็ว ๆ นี้ ดังนั้นตามคำแนะนำที่ให้ไว้ข้างต้นและผลลัพธ์ของโฮสต์และ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

แก้ไขปัญหาด้วยวิธีที่แตกต่างกันเล็กน้อย - ลดลำดับความสำคัญของเครือข่าย IPv6 ซึ่งมีsecurity.debian.orgใน/etc/gai.conf :

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

ดังนั้น IPv6 ยังคงแนะนำยกเว้นsecurity.debian.org


1

ตั้งแต่วันที่ 08 ต.ค. 2014 ฉันมีปัญหาเดียวกันพยายามอัปเดตเดเบียนหลังพร็อกซีบนเครือข่ายท้องถิ่น ด้วยความหวังว่ามันจะเกี่ยวข้องกับคนอื่นฉันโพสต์คำตอบของฉันที่นี่ ดังที่คนอื่น ๆ ได้กล่าวถึงการแก้ไข/etc/hostsเป็นสิ่งที่เราควรระมัดระวัง

แต่โดยส่วนตัวฉันแค่อยากจะอัพเดท

เนื้อหาของ /etc/apt/sources.list เมื่อทำการอัพเดท (มันแตกต่างก่อนการอัพเดท .. ):

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

เนื้อหาของ /etc/apt/apt.conf:

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

เพิ่มไปยัง / 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

ตอนนี้การรันapt-get update ; apt-get upgradeในฐานะ root ทำงานได้ดี

ตามที่กล่าวไว้ในคำตอบอื่น ๆ ให้ใช้คำสั่งโฮสต์บนโดเมนเพื่อรับ ip ที่ถูกต้องเพื่อแทรกลงในไฟล์โฮสต์

ตัวอย่าง:

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

Debian GNU/Linux testing (jessie)นี้ประสบความสำเร็จในการปรับปรุงระบบเพื่อ คุณอาจไม่ต้องการเรียกใช้กับที่เก็บข้อมูลการทดสอบจากนั้นก็ลบออกจากแหล่งที่มา ที่เก็บข้อมูลการทดสอบช่วยให้คุณได้รับการอัพเดทล่าสุดของหลาย ๆ แพ็คเกจ แต่ไม่ถือว่าเสถียร


การแก้ไขhostsไฟล์อีกครั้งเป็นวิธีแก้ปัญหาที่ไม่ได้ผลอย่างมาก
Shadur

0

ฉันพบวิธีที่ดีกว่าในการทำเช่นนี้ เปิดsources.listไฟล์ของคุณและจดชื่อโฮสต์ของ repos รับที่อยู่IPv4จากนั้นแก้ไขsources.listด้วยที่อยู่ IPv4 แทนที่จะเป็นชื่อโฮสต์ Apt-get ควรติดต่อที่เก็บข้อมูลมากกว่าที่อยู่ IPv4 ที่คุณระบุโดยเลี่ยงผ่าน IPv6

มีข้อเสียที่ repos มักจะมีการจัดสมดุลภาระและ / หรือการตั้งค่าตำแหน่งทางภูมิศาสตร์ IP ซึ่งวิธีการนี้แน่นอนผ่าน อย่างไรก็ตามมันไม่สำคัญว่าจะมีเพียงไม่กี่คนเท่านั้นที่ทำได้ หากคุณพบว่ามิเรอร์หนึ่งช้าลองรับ repo ที่อยู่ IP อื่น (ตัวอย่างเช่นโดยใช้บริการ ping ออนไลน์) และใช้ที่


2
นั่นเป็นทางออกที่เลวร้ายจริงๆแล้วด้วยเหตุผลที่คุณอธิบายไปแล้ว
Shadur

-4

คุณสามารถลองสิ่งนี้ได้ถ้าเหมาะกับคุณ

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

-> แทนที่ชื่อส่วนต่อประสานของคุณ


นี่เป็นวิธีแก้ปัญหาสำหรับคำถามที่แตกต่างจากที่ฉันถาม
Shadur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.