ฉันจะกำหนดลำดับความสำคัญของการเชื่อมต่อเครือข่ายใน Ubuntu ได้อย่างไร


41

หากเครื่อง Ubuntu 11.04 เชื่อมต่อกับ WiFi และ 3G พร้อมกันฉันจะตั้งค่าลำดับความสำคัญอย่างไรเพื่อให้แอปพลิเคชั่น (เบราว์เซอร์ ฯลฯ ) ใช้ WiFi เป็นอันดับแรก หากยังไม่พร้อมใช้งานควรใช้ 3G

โดยทั่วไปฉันต้องการกำหนดลำดับการใช้การเชื่อมต่อเครือข่าย

แก้ไข: ฉันกำลังมองหาวิธีที่ง่ายกว่าซึ่งจะเป็นประโยชน์สำหรับผู้ที่มีความสะดวกสบายและไม่ใช่ผู้เชี่ยวชาญใน Ubuntu / Linux

คำตอบ:


27

ฉันประหลาดใจที่ไม่มีใครพูดถึงคำสั่งที่ง่ายที่สุดในการทำสิ่งนี้: ifmetric. sudo apt-get install ifmetricมันสามารถติดตั้งใช้ คำสั่งนี้สามารถใช้เพื่อเปลี่ยนการวัดของอินเตอร์เฟสใด ๆ ควรใช้อินเทอร์เฟซที่มีเมตริกต่ำกว่าสำหรับอินเทอร์เน็ต

หากต้องการใช้สิ่งนี้อันดับแรกให้ดูการวัดโดยใช้routeคำสั่ง:

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.42.0.1       0.0.0.0         UG    100    0        0 eth0
0.0.0.0         10.42.0.2       0.0.0.0         UG    600    0        0 wlan0

ที่นี่มีตัวชี้วัดที่ต่ำกว่าจึงจะเป็นที่ต้องการมากกว่าeth0 wlan0หากคุณต้องการwlan0ลดการชี้วัดลง:

sudo ifmetric wlan0 50

ตอนนี้ตารางเส้นทางจะมีลักษณะ:

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.42.0.2       0.0.0.0         UG    50     0        0 wlan0
0.0.0.0         10.42.0.1       0.0.0.0         UG    100    0        0 eth0

ตอนนี้ Linux จะใช้wlan0อินเทอร์เน็ต การเปลี่ยนแปลงจะมีผลทันที


1
คำตอบที่ดี ขอบคุณ (เช่นสำหรับเส้นทาง -n) ฉันต้องรีบูทหลังจากติดตั้ง ifmetric เพื่อให้คำสั่งเปลี่ยนการวัด
Thorsten Niehues

วิธีทำการเปลี่ยนแปลงนี้อย่างถาวร (ฉันไม่ต้องการใช้ฮอตสปอต iPhones ของฉันโดยไม่ตั้งใจ)
Thorsten Niehues

2
@ThorstenNiehues: วิธีการแก้ปัญหาอย่างรวดเร็วมาในใจของฉันจะทำให้มันถาวรคือการเพิ่มคำสั่ง ifmetric เพื่อ crontab ของคุณโดยการทำแล้วเพิ่มบรรทัดที่สิ้นสุด:crontab -e @reboot sudo ifmetric wlan0 50
shivams

มันได้ผล. แต่ฉันไม่สามารถเข้าถึงเครื่องท้องถิ่นหลังจากนี้ (ผ่านเบราว์เซอร์เช่น) ความคิดใด ๆ ขอบคุณ
tomasb

@tomasb: ข้อสงสัยที่น่าสนใจ ที่คาดว่าอย่างไรก็ตามการเปลี่ยนการตั้งค่าอินเตอร์เฟซจะนำคุณเข้าสู่เครือข่ายท้องถิ่นของอินเตอร์เฟซที่ต้องการ อีกวิธีหนึ่งที่ตรงไปตรงมาในการเข้าถึงเครื่องท้องถิ่นคือการเข้าถึงเครื่องโดยใช้เครื่องเสมือน อย่างไรก็ตามการแก้ปัญหาที่ดีกว่าจะต้องมีอยู่ ให้ฉันคิดและตอบกลับ
shivams

14

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

ตัวชี้วัดที่ระบุไว้ในไฟล์/ etc / network / interfacesจุดเชื่อมโยงไปยังเอกสาร

ใช้ตัวแก้ไขข้อความใด ๆ เพื่อแก้ไขไฟล์ระบุเครือข่ายและเพียงแค่เปลี่ยนmetricพารามิเตอร์และบันทึก Reboot เป็นวิธีที่ง่ายที่สุดในการรีเซ็ตค่าทั้งหมดโดยไม่ต้องลงรายละเอียดที่น่าประทับใจในการรีสตาร์ทบริการเครือข่าย


2
Harry - ขอบคุณสำหรับการตอบสนอง - เครือข่ายที่ฉันสนใจใน eth1 จะแสดงใน "ifconfig" แต่ไม่ได้อยู่ใน "/ etc / network / interfaces" สิ่งที่แสดงใน "ifconfig" และอะไรใน "/ etc / network / interfaces"
Praveen Sripati

1
การเพิ่ม eth0 ให้กับ "/ etc / network / interfaces" มีความเสี่ยงมากกว่า คุณสามารถลอง ifconfig ในฐานะรูทเพื่อเปลี่ยนการวัดสำหรับอินเทอร์เฟซ (ตรวจสอบว่ามันอยู่ที่นั่นหลังจากบูต)
harrymc

เมื่อฉันวิ่ง 'sudo ifconfig eth1 metric 4' ฉันได้รับข้อผิดพลาดต่อไปนี้ 'SIOCSIFMETRIC: ไม่รองรับการใช้งาน' goo.gl/UhXBJบอกว่า 'นอกจากนี้ระบบบางระบบอาจใช้อาร์กิวเมนต์ตัวชี้วัด ..... เมื่อกำหนดค่าระบบ Linux คุณจะเพิ่มคำสั่งเส้นทางที่ชัดเจนสำหรับแต่ละอินเตอร์เฟส "ดูเหมือนว่าจะไม่มีวิธีการส่งตรงใน Ubuntu เช่นจาก UI สำหรับผู้ใช้มือใหม่
Praveen Sripati

2
ดูเหมือนว่าลีนุกซ์จะตัดสินใจด้วยอะแดปเตอร์ที่เร็วที่สุดหลังจากการทดสอบความเร็วของอะแดปเตอร์ทั้งหมด การวัดไม่ได้รับการสนับสนุนในการแจกแจงอีกมากมาย คุณยังสามารถลองและกำหนดสิ่งต่าง ๆ ผ่าน "/ etc / network / interfaces" แต่ฉันไม่รู้ว่าคุณจะประสบความสำเร็จได้อย่างไร ดูคำถามนี้ด้วย
harrymc

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

7
  1. การจัดลำดับความสำคัญของอินเทอร์เฟซสำหรับทราฟฟิกทั่วไปทำได้โดยจัดการเมทริกการเราต์ แต่ละเส้นทางมีพารามิเตอร์ที่เกี่ยวข้องเช่นการนับจำนวนและแบนด์วิดท์ ดูตัวเลือก "metric" ใน man-page สำหรับrouteคำสั่ง

    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref     Use Iface
    0.0.0.0         192.168.1.254   255.255.255.255 U     0      0        0 eth0
    192.168.1.0     0.0.0.0         255.255.255.0   U     256    0        0 eth0
    
  2. การจัดลำดับความสำคัญในการเข้าถึงแอปพลิเคชันไปยังทรัพยากรเครือข่ายมักได้รับการแก้ไขโดย "ปริมาณข้อมูล" - ฉันจะใช้เว็บเสิร์ชเอ็นจิ้นเพื่อดูว่า Ubuntu หรือเราเตอร์สามารถทำเช่นนั้นได้หรือไม่


เชิงอรรถ.

บน MS Windows แต่ไม่ได้อยู่บน Linux, netstat -nrคำสั่ง outputs route printข้อมูลเดียวกันกับ รวมถึงตัวชี้วัดเส้นทาง


ใน man page สำหรับเส้นทาง "Metric The 'distance' ไปยังเป้าหมาย (โดยปกติจะนับเป็น hops) มันไม่ได้ถูกใช้โดยเคอร์เนลล่าสุด แต่อาจจำเป็นโดย routing daemons" ฉันไม่แน่ใจว่าใน Ubuntu Desktop ธรรมดาพารามิเตอร์ Metric จะมีผลกระทบใด ๆ หรือไม่
Praveen Sripati

1
คุณช่วยให้คำสั่งเส้นทางเฉพาะกับฉันได้ไหม
Praveen Sripati

11
@PraveenSripati - ฉันไม่เชื่อว่าคุณให้ 100 ของตัวแทนที่ได้รับยากสำหรับคำตอบของคุณ - ถูกต้องในทางเทคนิค แต่ไม่ได้ช่วยให้คุณหรือฉัน :-( ฉันกำลังมองหาคำสั่งเฉพาะเช่นกัน
Lord Loh.

1
คำตอบคืออะไร ?? netstat -nr ไม่แสดงเมทริกเช่นกัน ดูคำตอบจาก @shivams
Thorsten Niehues

3

ฉันยังไม่ได้ลองจริงๆ แต่สามารถใช้ NCD (Network Configuration Daemon - 1) เพื่อจุดประสงค์นี้ เว็บไซต์อ้างว่าทำให้การกำหนดค่าเครือข่ายง่ายขึ้น ดูเหมือนว่าไวยากรณ์จะง่าย

# รอสำหรับการเชื่อมต่อเครือข่ายบางอย่าง ชอบ eth1 โดยใส่ไว้ที่ด้านหน้าของ eth0
รายการ ("NET-eth1", "NET-eth0") pnames;

(1) - http://code.google.com/p/badvpn/wiki/NCD


คุณพูดถูกซอฟต์แวร์ NCD ของฉันทำสิ่งนี้ได้ดี ตัวอย่างมีการทำงานตามที่เป็นอยู่ ฉันควรทราบว่าpnamesรายการนั้นเป็นเพียงข้อโต้แย้งmultidepend()ในบรรทัดถัดไป - นี่คือสิ่งที่ดำเนินการตามลำดับความสำคัญ กลไกหลังนี้ก็คือว่าเมื่อeth1เกิดขึ้นเมื่อeth0มีอยู่แล้วขึ้นก็ดำเนินการmultiprovide("NET-eth1");เพราะNET-eth1อยู่ในด้านหน้าของNET-eth0, multidepend()จะลงไปและกลับมาขึ้นมาทันที แต่การเปิดเผยตัวแปรจากกระบวนการแทนeth1 eth0
Ambroz Bizjak

ฉันดูมัน แต่ไม่สามารถหาได้ นี่ไม่ควรยากขนาดนี้
SDsolar

3

ทั้งหมดนี้เป็นเพราะตัวชี้วัดเส้นทาง คุณต้องการลบเส้นทางเริ่มต้นด้วยตัวชี้วัดที่ต่ำที่สุดจากนั้นกลับสู่เส้นทางเดิมด้วยตัวชี้วัดที่สูงขึ้น โปรดทำตามคำสั่งด้านล่าง

สมมติว่าตารางเส้นทางของคุณมีลักษณะดังนี้:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.16.87.254    0.0.0.0         UG    100    0        0 ens38
0.0.0.0         192.168.151.2   0.0.0.0         UG    101    0        0 ens33
10.16.86.64     0.0.0.0         255.255.255.248 U     100    0        0 ens38
10.16.87.254    0.0.0.0         255.255.255.255 UH    100    0        0 ens38
10.16.88.6      10.16.87.254    255.255.255.255 UGH   100    0        0 ens38
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens38
192.168.151.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

ตอนนี้ลบเกตเวย์เริ่มต้น

# route delete default gateway

ตอนนี้กลับสู่เกตเวย์เริ่มต้นที่เก่ากว่า (โปรดทราบว่าการวัดในกรณีนี้คือ 102 สูงกว่าเส้นทางเริ่มต้นปัจจุบัน 101)

# route add default gw 10.16.87.254 metric 102 dev ens38                                                              
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.151.2   0.0.0.0         UG    101    0        0 ens33
0.0.0.0         10.16.87.254    0.0.0.0         UG    102    0        0 ens38
10.16.86.64     0.0.0.0         255.255.255.248 U     100    0        0 ens38
10.16.87.254    0.0.0.0         255.255.255.255 UH    100    0        0 ens38
10.16.88.6      10.16.87.254    255.255.255.255 UGH   100    0        0 ens38
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens38
192.168.151.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

วิธีนี้ใช้ได้ผล หมายเหตุสำหรับสามเณรอื่น ๆ (ฉันต้องอ่านสองสามครั้งเพื่อติดตามสิ่งที่เกิดขึ้น): ขั้นตอนที่ 1 ด้านบนจะลบรายการสำหรับGateway= 10.16.87.254ซึ่งเป็นUGค่าต่ำสุดMetricและขั้นตอนที่ 2 ทำให้สูงขึ้นMetricดังนั้นจึงเป็น ยังคงพร้อมใช้งานเป็นข้อมูลสำรองในกรณีที่192.168.151.2ไม่พร้อมใช้งาน
WillC

0

[อัพเดต] ตั้งแต่ Ubuntu 18.04 LTS (เซิร์ฟเวอร์) netplanเป็น wrapper เริ่มต้นสำหรับการจัดการเครือข่าย การกำหนดค่า Netplan จะกระทำผ่านไฟล์YAMLตามค่าเริ่มต้น/etc/netplan/01-netcfg.yaml(รายละเอียดเพิ่มเติมที่นี่ )

ตัวชี้วัดเส้นทางนั้นถูกกำหนดโดยmetricตัวเลือก "" ซึ่งคาดว่าจะเป็นจำนวนเต็มบวก ( 100เป็นค่าเริ่มต้นโดยทั่วไป) นี่คือตัวอย่างจากหน้าอ้างอิง:

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      addresses:
      - 10.0.0.10/24
      - 11.0.0.11/24
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
      routes:
      - to: 0.0.0.0/0
        via: 10.0.0.1
        metric: 100
      - to: 0.0.0.0/0
        via: 11.0.0.1
        metric: 100

เส้นทางที่มีจุดต่ำสุดmetric(ความยาวเส้นทาง) จะกลายเป็นเกตเวย์ "ที่ต้องการ" (ใช้: sudo netplan tryเพื่อเปิดใช้การเปลี่ยนแปลง)

โปรดทราบว่าในสภาพแวดล้อมการโรมมิ่ง (การเชื่อมต่อหลายครั้งเปิดและปิด) คุณอาจต้องการตั้งค่าoptionalพารามิเตอร์ (บูลีน) เป็นtrue(ค่าเริ่มต้นคือเท็จ):

network:
  version: 2
  ethernets:
    enred:
      dhcp4: yes
      dhcp4-overrides:
        route-metric: 100
    engreen:
      dhcp4: yes
      dhcp4-overrides:
        route-metric: 200
      # this is plugged into a test network that is often
      # down - don't wait for it to come up during boot.
      optional: true

สังเกตุไวยากรณ์ที่แตกต่างกันเล็กน้อยสำหรับตัวชี้วัดเส้นทางในกรณีของการเชื่อมต่อ DHCP

คุณยังสามารถใช้NetworkManagerเป็น renderer ซึ่งฉันคิดว่า (ยังไม่ได้ทดสอบตัวเอง) จะให้คุณเห็น / แก้ไขส่วนหนึ่งของการกำหนดค่าผ่านเครื่องมือ GUI

renderer (เกลา)

ใช้แบ็กเอนด์เครือข่ายที่กำหนดสำหรับคำนิยามนี้ สนับสนุนในขณะนี้และnetworkd NetworkManagerคุณสมบัตินี้สามารถระบุได้แบบโกลบอลอินnetworks:สำหรับประเภทอุปกรณ์ (ในเช่นethernets:) หรือสำหรับการกำหนดอุปกรณ์เฉพาะ networkdเริ่มต้นคือ

(ตัวอย่าง 'บิ๊ก' ตัวสุดท้ายในหน้าอ้างอิงแสดงการใช้ไฮบริดของทั้งตัวแสดงผล)

ดูเพิ่มเติมคำถามนี้ (askubuntu)

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