Φαντάζομαι ότι πολλοί (αν όχι όλοι) χρησιμοποιείτε διαρκώς την εντολή ifconfig όταν θέλετε να δείτε κάποιες πληροφορίες σχετικά με το δίκτυο και όχι την ip.

Δυστυχώς όμως η συγκεκριμένη εντολή έχει γίνει deprecated από την έκδοση 2.0 του Kernel και αντικαταστάθηκε από την ip. Αυτό έγινε το 1996, δηλαδή περίπου 20 χρόνια πριν. Για όσους δεν πιστεύουν, καλό θα ήταν ρίξουν μία γρήγορη ματιά στο man page της ίδιας της ifconfig:

WARNING: Ifconfig is obsolete on system with Linux kernel newer than
2.0. On this system you should use ip. See the ip manual page for
details

Το γεγονός ότι χρησιμοποιείται ευρέως μέχρι και σήμερα είναι μία απόδειξη ότι κανείς δεν διαβάζει τα man pages, αλλά τα διάφορα άρθρα ανά το Internet (σαν αυτό — καλή ώρα). Για αυτό, έχω έναν δεύτερο λόγο που πιστεύω θα σας πείσει γιατί η ifconfig είναι ελλιπής στις μέρες μας.

Πρώτα απ’όλα όμως, πάμε να δούμε κάποια βασικά πράγματα γύρω από την εντολή ip που θα σας κάνουν να νιώσετε πιο οικεία.

Εισαγωγή στην εντολή ip

Να υπενθυμίσουμε κάτι σημαντικό:

Χρησιμοποιώντας είτε την ‘ip’ είτε την ‘ifconfig’ θα πρέπει να ξέρετε πως οι αλλαγές που θα γίνουν στο σύστημά σας είναι μόνο προσωρινές και θα χαθούν μετά από μία επανεκκίνηση. Οι admins τις χρησιμοποιούν για να τεστάρουν κάποια δικτύωση, και αφού δουν ότι δουλεύει, τότε τις εφαρμόζουν μόνιμα στο σύστημά τους. Οπότε, μην φοβάστε να παίξετε με τις παρακάτω εντολές… ακόμα κι αν χάσετε την σύνδεσή σας με το Internet, μετά από ένα reboot όλα θα είναι πάλι όπως πριν.

Η πιο βασική λειτουργία της ip είναι να σας βοηθήσει στον χειρισμό των network interfaces, η αλλιώς NICs ή αλλιώς κάρτες δικτύου (χοντρά-χοντρά). Για να πω την αλήθεια, δεν είναι και η πιο εύκολη εντολή … ειδικά σε σύγκριση με την ‘ifconfig’ πιστεύω ότι η δεύτερη είναι πιο απλή στην σύνταξή της. Ωστόσο, let’s give it a try …

First things first, ας γνωρίσουμε την εντολή και τις παραμέτρους της:

ip help

Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename

Βλέπουμε λοιπόν ότι η βασική χρήση της ip γίνεται με έναν συνδυασμό από OPTIONS οι οποίες είναι προαιρετικές και δεν μας απασχολούν για την ώρα…

OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } | -br[ief] |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}

… στην συνέχεια ορίζουμε το OBJECT που μας ενδιαφέρει να περιεργαστούμε:

OBJECT := { link | address | addrlabel | route | rule | neighbor | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | fou | tcp_metrics | token | netconf }

Προφανώς και δεν θα ασχοληθούμε με όλα, παρά μόνο με τα βασικά που πρέπει να ξέρουμε για να αντικαταστήσουμε σιγά-σιγά την εντολή ifconfig. Θα πρέπει να ξέρετε λοιπόν τα εξής OBJECTS:

  • link = πληροφορίες για τα interfaces (ποια είναι; και τι status έχουν; )
  • addr = πληροφορίες για network address (πχ να δώσετε μία IP)
  • route = πληροφορίες γύρω από το routing table (πχ να δώσετε μία static route)

Τέλος, μπορείτε να δείτε τις COMMAND που μπορείτε να χρησιμοποιήσετε για αυτά τα OBJECTS χρησιμοποιώντας την παράμετρο help στο τέλος της εντολής. Για παράδειγμα αν θέλετε να δείτε πως μπορείτε να χρησιμοποιήσετε το OBJECT = addr, τότε δώστε:

ip addr help

Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]
[ CONFFLAG-LIST ]
ip address del IFADDR dev IFNAME [mngtmpaddr]
ip address {show|save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]
[ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]
ip address {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
[ broadcast ADDR ] [ anycast ADDR ]
[ label IFNAME ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG := [ permanent | dynamic | secondary | primary |
[-]tentative | [-]deprecated | [-]dadfailed | temporary |
CONFFLAG-LIST ]
CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG
CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := forever | SECONDS

Τώρα που μάθετε πως μπορείτε να μάθετε μόνοι σας, πάμε να δούμε μερικά παραδείγματα:

Advertisements

ip link show

Η παραπάνω εντολή μας δείχνει τα network interfaces που έχουμε συνδεδεμένα στο σύστημά μας. Σε ένα απλό σύστημα με μία απλή ethernet σύνδεση θα σας δείτε κάτι τέτοιο:

ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:2e:54:d9 brd ff:ff:ff:ff:ff:ff

Κλασσικό output, όπου έχουμε ένα loopback interface (είναι το TCP κύκλωμα της κάρτας δικτύου) και ένα eth0. Το σημαντικό εδώ είναι ότι έχουμε το STATUS, δηλαδή βλέπουμε ότι και τα δύο είναι state up καθώς επίσης και την MAC Address του ethernet (08:00:27:2e:54:d9 στο παραπάνω παράδειγμα).

Δείτε και ένα πιο σύνθετο σύστημα με 4 κάρτες δικτύου, τρεις εκ των οποίων είναι bridged (δηλαδή σαν layer 2 switch) και πάνω του ένα VLAN:

ip l
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth3: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:47:cd:06 brd ff:ff:ff:ff:ff:ff
3: eth5: mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:e6:e5:84 brd ff:ff:ff:ff:ff:ff
4: eth2: mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:da:8a:a6 brd ff:ff:ff:ff:ff:ff
5: eth4: mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:b4:b2:c2 brd ff:ff:ff:ff:ff:ff
6: br0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 08:00:27:b4:b2:c2 brd ff:ff:ff:ff:ff:ff
7: vlan0@br0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 08:00:27:b4:b2:c2 brd ff:ff:ff:ff:ff:ff

Οι πιο παρατηρητικοί θα πρόσεξαν ότι έδωσα ip l αντί για ip link show. Η εντολή μας επιτρέπει να χρησιμοποιούμε μόνο το πρώτο γράμμα από τις παραμέτρους, έτσι ώστε να τις πληκτρολογούμε πιο γρήγορα. Οπότε, οι εντολές ip link show, ip l s, ip l είναι ίδιες μεταξύ τους.

Πριν φύγουμε από το ‘link’ object, πούμε ότι μπορείτε επηρεάζετε το state των interfaces ως εξής:

ip link set eth0 down
ip link set eth0 up

Πριν κλείσουμε, ορισμένοι ίσως παραπονεθούν για την έλλειψη στατιστικών σχετικά με πόσα data κάναμε receive και πόσα trasmitt. Εσείς λοιπόν, μπορείτε να χρησιμοποιήσετε την παράμετρο -s που μάλλον σημαίνει statistics:

ip -s link
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
12211 61 0 0 0 0
TX: bytes packets errors dropped carrier collsns
12211 61 0 0 0 0
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:2e:54:d9 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
215313025 2252317 0 2 0 299260
TX: bytes packets errors dropped carrier collsns
20092973 106842 0 0 0 0

Μην τρομάζετε! Δείτε τα RX=Receive, και TX=Transmitt. Αυτά αρκούν για να διαβάσετε το output.

ip addr show

Η παραπάνω εντολή μας επιστρέφει πληροφορίες σχετικά με τις διευθύνσεις IP που έχουμε (ή δεν έχουμε) δώσει στα interfaces.

ip addr show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:2e:54:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.178.57/24 brd 192.168.178.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe2e:54d9/64 scope link
valid_lft forever preferred_lft forever

Μας επιστρέφει πληροφορίες τόσο για το IPv4 όσο και για το IPv6. Αν θέλουμε να μας δείξει μόνο για IPv4, τότε ίσως ήρθε η ώρα να ρίξουμε μια ματιά στα OPTIONS (ναι, αυτά που σας είπα ότι είναι προαιρετικά).

ip -4 addr show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.178.57/24 brd 192.168.178.255 scope global eth0
valid_lft forever preferred_lft forever

Ιδού. Βέβαια, είναι κάπως … περίπλοκο, το όλο output. Στην πραγματικότητα αυτό που θέλω είναι μόνο την γραμμή inet, οπότε ας κάνουμε ένα grep:

ip -4 a | grep inet
inet 127.0.0.1/8 scope host lo
inet 192.168.178.57/24 brd 192.168.178.255 scope global eth0

Σημ: χρησιμοποίησα πάλι την σύντομη μορφή, γράφοντας απλά το a αντί για το addr ;)

Σε αυτό το σημείο θέλω να σας δείξω αυτό για το οποίο σας μίλησα στην εισαγωγή του άρθρου σχετικά με την αδυναμία της ifconfig. Θα προσθέσω μία δεύτερη IP στο interface eth0, και θα ζητήσω από την ‘ifconfig’ να μου δείξει τι γνωρίζει περί αυτού:

ip addr add dev eth0 10.10.10.1/24

Η σύνταξη λοιπόν είναι ip add dev μετά το όνομα του interface (eth0) και στην συνέχεια την IP διεύθυνση ΜΑΖΙ ΜΕ ΤΗΝ ΜΑΣΚΑ. Προσοχή να μην ξεχάσετε την subnet mask, όπου εδώ επέλεξα να είναι 24. [Τι σημαίνει αυτό; Χμ, δεν είναι ο σκοπός αυτού του άρθρου, οπότε αν θέλετε να σας κάνω ένα άρθρο για αυτό γράψτε μου στα σχόλια :)]

Προσοχή λοιπόν να μην ξεχάσετε την subnet mask (24 στην περίπτωση μου), διότι αν την ξεχάσετε τότε θα σας δώσει by default μία subnet 32, η οποία δεν έχει απολύτως κανένα νόημα :)

Ας προσθέσω όμως μία τέτοια, για να δείτε και εσείς ότι όντως εφαρμόζει 32bit subnetmask σαν προεπιλεγμένη συμπεριφορά:

ip addr add dev eth0 10.20.30.40

Οκ, άρα μέχρι στιγμής έχουμε προσθέσει 3 IP διευθύνσεις στο eth0. Για να ζητήσουμε από την ip να μας τις δείξει (θα ζητήσω μόνο τις IPv4 και θα κάνω grep για ‘inet’ για είναι πιο καθαρό το output λόγο του άρθρου) :

ip -4 addr show eth0 | grep inet
inet 192.168.178.57/24 brd 192.168.178.255 scope global eth0
inet 10.10.10.1/24 scope global eth0
inet 10.20.30.40/32 scope global eth0

Τώρα ας ζητήσουμε το ίδιο πράγμα από την ‘ifconfig’

ifconfig eth0 | grep inet | grep -v 'inet6'
inet addr:192.168.178.57 Bcast:192.168.178.255 Mask:255.255.255.0

Βλέπουμε ότι η ifconfig αποτυγχάνει να μας δείξει τις άλλες 2 IP addresses! Για να προσπαθήσουμε ξανά με την παράμετρο -a που μάλλον σημαίνει all…

ifconfig -a eth0 | grep inet | grep -v 'inet6'
inet addr:192.168.178.57 Bcast:192.168.178.255 Mask:255.255.255.0

Τα ίδια! Βλέπουμε λοιπόν ότι η ifconfig μας επιστρέφει λάθος πληροφορίες και αυτός είναι ένας πάρα μα πάρα πολύ καλός λόγος για να σταματήσουμε να την εμπιστευόμαστε :D

Για να κλείσουμε την ενότητα της ip addr μπορείτε αντίστοιχα να διαγράψετε τις παραπάνω διευθύνσεις χρησιμοποιώντας το del αντί για το add. Εγώ θα διαγράψω αυτήν με την 32bit μάσκα, για να σας δείξω έστω ένα σχετικό παράδειγμα:

ip a d dev eth0 10.20.30.40/32

Σημ: a=addr και d=del. Φυσικά μπορείτε να γράφετε ολόκληρες τις λέξεις αντί για τις συντομεύσεις.

ip route show

Εδώ βλέπουμε (αν θέλουμε πειράζουμε κιόλας) το kernel routing table του συστήματός μας.

ip route show
default via 192.168.178.1 dev eth0 proto dhcp
10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.1
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.57

Βλέπουμε ότι αν θέλουμε να επικοινωνήσουμε με το 192.168.178.0/24 δίκτυο, τότε πρέπει να ρωτήσουμε τον ίδιο μας τον υπολογιστή 192.168.178.57. Δεν βγάζει και πολύ νόημα, αλλά είναι η εντολή που μπαίνει αυτόματα από τον network manager όταν προσθέτουμε μία IP. Μπορούμε κάλλιστα να αφήσουμε την default route, όπου στην ουσία λέει: στείλε όλα τα requests στον router (192.168.178.1). Τέλος έχουμε και την route προς την IP που προσθέσαμε, η οποία δεν έχει κανένα νόημα (εκτός από τον εκπαιδευτικό χαρακτήρα του άρθρου).

Μία άλλη οπτική για το routing table είναι η παλιά εντολή route:

route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.178.1 0.0.0.0 UG 0 0 0 eth0
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.178.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

Σημ: το 0.0.0.0 για όσους δεν γνωρίζουν, σηματοδοτεί την default route.

Advertisements

Εννοείται πως μπορούμε να αφαιρέσουμε και να προσθέσουμε default και static routes. Αρχικά ας αφαιρέσουμε την static route προς το 10.10.10.0/24 δίκτυο:

ip route del 10.10.10.0/24

δεν ξεχνάμε την επαλήθευση:

ip route show
default via 192.168.178.1 dev eth0 proto dhcp
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.57

Πάμε τώρα να την ξανά προσθέσουμε, απλά και μόνο για να δείτε πως γίνεται:

ip route add 10.10.10.0/24 via 10.10.10.1
ip route show
default via 192.168.178.1 dev eth0 proto dhcp
10.10.10.0/24 via 10.10.10.1 dev eth0
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.57

Όταν προσθέτουμε static routes δίνουμε ip route add στην συνέχεια το δίκτυο που θέλουμε να προσθέσουμε, μετά γράφουμε via που σημαίνει δια μέσου και τέλος, δίνουμε την τοπική IP (πρέπει να είναι στο ίδιο τοπικό δίκτυο) που θα επικοινωνεί ο υπολογιστής μας. Με άλλα λόγια του λέμε:

για να επικοινωνήσεις με οποιοδήποτε IP στο δίκτυο 192.168.178.0/24, πάνε ρώτα την τοπική IP τάδε.

Όσο για default route, ας αφαιρέσουμε πρώτα αυτή που υπάρχει και ας την ξανά προσθέσουμε:

ip route del default

ip route show
10.10.10.0/24 via 10.10.10.1 dev eth0
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.57

ip route add default via 192.168.178.1

ip route show
default via 192.168.178.1 dev eth0
10.10.10.0/24 via 10.10.10.1 dev eth0
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.57

Επίλογος

Αυτό ήταν.

Πιστεύω τώρα είστε πιο εξοικειωμένοι με την χρήση της εντολής ip, και μάθατε τον λόγο για τον οποίο η ifconfig είναι deprecated.

Μην φοβάστε να τρέξετε τις παραπάνω εντολές και να πειραματιστείτε, καθώς όλες οι αλλαγές είναι προσωρινές και με ένα restart του networkmanager ή reboot του PC (για όσους δεν ξέρουν ποιο network service είναι υπεύθυνο για το distro τους) θα επιστρέψουν όλα πίσω στις κανονικές σας ρυθμίσεις.

Αν σας ενδιαφέρει το networking και θέλετε να μάθετε περισσότερα για static routing, γράψτε μου στα σχόλια ώστε να ετοιμάσω ένα καινούριο σχετικό άρθρο (ή μάλλον βίντεο — θα ήταν πιο πρακτικό).