Network Automation #007 - Netmiko - Tìm Và Cấu Hình Description Cho Interface Khi Biết IP Address
Nên xem các bài trước khi xem bài này
Sơ đồ LAB:
YÊU CẦU:
Dùng Netmiko SSH vào switch sau đó thực hiện các yêu cầu như bên dưới khi biết thông tin về IP address và phần mô tả của thiết bị trong file cho trước "devices_list.csv"
- In kết quả tìm được IP nào đang kết nối vào port nào ra màn hình và ghi thông tin kết nối chi tiết vào file
- Cấu hình description cho interface với thông tin trong file devices_list.csv
THỰC HIỆN:
- Chuẩn bị
enableconf thostname Coreip domain name netmiko.labusername admin privilege 15 password admin1234@coreline vty 0 4login localtransport input sshcrypto key generate rsa general-keys modulus 1024ip ssh version 2interface vlan 1ip address 192.168.0.1 255.255.255.0no shutdownexitdo wri
- Code:
'''
Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
Danh sách các IP cần tìm để trong file "device_list.csv"
(Điều kiện là thiết bị cisco cần kết nối đã được cấu hình SSH)
Kết quả tìm được in ra màn hình và lưu vào file "Show_arp_Ketqua_192.168.0.1.csv"
Câu lệnh chính dùng trong bài:
- show arp <ip cần tìm>
- show mac address-table address <địa chỉ mac cần tìm>
'''
import netmiko # import thư viện netmiko
import os
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = {
"host":"192.168.0.1",
"username":"admin",
"password":"admin1234@core",
"device_type":"cisco_ios"
}
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1)
with open ("device_list.csv","r") as rfile: # mở file
keys = rfile.readline() # lấy dòng đầu tiên
values = rfile.read() # các dòng còn lại là giá trị cần gán vào dict
# print(keys)
# print(values)
'''
để remove xuống dòng (newline) chúng ta có thể dùng
print(keys,end="")
'''
file_ketqua = "Show_arp_Ketqua_" + Sw_1["host"] + ".csv" # định nghĩa tên file cần ghi kết quả
file_header = keys.rstrip() + ",Vlan,Mac Address,Type,Port\n" # bỏ newline (\n) ở cuối dòng và nối thêm chuỗi để ghi vào file chuẩn bị để chứa kết quả show mac address và chèn newline vào cuối
f = open(file_ketqua,"w")
# print(file_header)
f.write(file_header)
f.flush() # thực hiện ghi
f.close() # đóng file để giải phóng bộ nhớ
for values in values.splitlines(): # trả về một chuỗi tương ứng là một dòng trong biến values
values = values.split(",") # mỗi dòng chuyển thành list
ip_addr = values[0] # giá trị của cột đầu tiên là địa chỉ IP cần lấy ra
ip_description = values[1]
# print(ip_addr)
# print(ip_description)
# print(values)
print("*" + ip_addr + ":") # In ra IP đang cần show
net_connect.send_command("ping" + " " + ip_addr) # ping địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC
show_arp = "show arp" + " " + ip_addr
show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm
# In ra dòng thứ nhì trong chuỗi
# print (show_arp.splitlines()[1])
# lấy dòng thứ nhì và phân ra từng cụm
fields = show_arp.splitlines()[1].split()
# lấy cụm thứ 4 (là địa chỉ MAC) tính từ trái sang, sau đó sẽ thực hiện lệnh show mac với MAC này
mac_addr = fields[3]
# print (mac_addr)
show_mac_addr = "show mac address-table address" + " " + mac_addr
show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
show_mac_addr = show_mac_addr.splitlines()[5].split() # lấy dòng thứ 6 chuyển thành list
print(show_mac_addr) # In kết quả show ra màn hình
print() # In ra dòng trắng
show_mac_addr = values + show_mac_addr # thực hiện nối thông tin ban đầu và kết quả
#print(show_mac_addr)
show_mac_addr = ",".join(show_mac_addr) + "\n" # convert list sang string và thêm "," vào giữa mỗi cụm
f = open(file_ketqua,"a")
f.write(show_mac_addr) # thực hiện ghi thêm kết quả vào file kết quả
path = os.getcwd() # lấy đường dẫn hiện tại
print("*" * 20 + "KẾT QUẢ ĐƯỢC LƯU TẠI" + "*" * 20)
print(r"{}".format(path))
print(file_ketqua)
print("*" * 60 + "\n")
- Kết quả:
Connecting to a host: 192.168.0.1...*192.168.0.101:['1', '0050.7966.6803', 'DYNAMIC', 'Et0/1']*192.168.0.102:['1', '0050.7966.6805', 'DYNAMIC', 'Et0/2']*192.168.0.103:['1', '0050.7966.6806', 'DYNAMIC', 'Et0/3']*192.168.0.104:['1', '0050.7966.6804', 'DYNAMIC', 'Et1/3']*192.168.0.105:['1', '0050.7966.6802', 'DYNAMIC', 'Et1/2']********************KẾT QUẢ ĐƯỢC LƯU TẠI********************C:\vck\LABShow_arp_Ketqua_192.168.0.1.csv************************************************************[Finished in 19.5s]
2. Cấu hình description cho interface với thông tin trong file devices_list.csv
- Code:
'''
Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
Danh sách các IP cần tìm để trong file "device_list.csv"
(Điều kiện là thiết bị cisco cần kết nối đã được cấu hình SSH)
Kết quả tìm được in ra màn hình và lưu vào file "Show_arp_Ketqua_192.168.0.1.csv"
Câu lệnh chính dùng trong bài:
- show arp <ip cần tìm>
- show mac address-table address <địa chỉ mac cần tìm>
- int <tên interface>
- description <nội dung cần chú thích>
'''
import netmiko # import thư viện netmiko
import os
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = {
"host":"192.168.0.1",
"username":"admin",
"password":"admin1234@core",
"device_type":"cisco_ios"
}
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1)
with open ("device_list.csv","r") as rfile: # mở file
keys = rfile.readline() # lấy dòng đầu tiên
values = rfile.read() # các dòng còn lại là giá trị cần gán vào dict
# print(keys)
# print(values)
'''
để remove xuống dòng (newline) chúng ta có thể dùng
print(keys,end="")
'''
file_config = Sw_1["host"] + ".txt" # định nghĩa tên file config
f = open(file_config,"w") # khởi tạo file config rỗng
f.flush() # thực hiện ghi
f.close() # đóng file để giải phóng bộ nhớ
for values in values.splitlines(): # trả về một chuỗi tương ứng là một dòng trong biến values
values = values.split(",") # mỗi dòng chuyển thành list
ip_addr = values[0] # giá trị của cột đầu tiên là địa chỉ IP cần lấy ra
ip_description = values[1]
# print(ip_addr)
# print(ip_description)
# print(values)
# print("*" + ip_addr + ":") # In ra IP đang cần show
net_connect.send_command("ping" + " " + ip_addr) # ping địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC
show_arp = "show arp" + " " + ip_addr
show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm
# In ra dòng thứ nhì trong chuỗi
# print (show_arp.splitlines()[1])
# lấy dòng thứ nhì và phân ra từng cụm
fields = show_arp.splitlines()[1].split()
# lấy cụm thứ 4 (là địa chỉ MAC) tính từ trái sang, sau đó sẽ thực hiện lệnh show mac với MAC này
mac_addr = fields[3]
# print (mac_addr)
show_mac_addr = "show mac address-table address" + " " + mac_addr
show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
show_mac_addr = show_mac_addr.splitlines()[5].split() # lấy dòng thứ 6 chuyển thành list
# print(show_mac_addr) # In kết quả show ra màn hình
int_port = show_mac_addr[3] # lấy tên interface
# print(int_port)
'''
Đưa các thông tin cần cấu hình cho interface vào file cấu hình mẫu
'''
f = open(file_config,"a")
f.write("interface " + " " + int_port + "\n")
f.write("description " + " ===Link to " + ip_addr + " " + ip_description + "===\n")
f.write("exit\n")
f.flush() # thực hiện ghi
f.close() # đóng file để giải phóng bộ nhớ
net_connect.send_config_from_file(file_config) # thực hiện cấu hình từ file cấu hình mẫu
net_connect.save_config() # lưu cấu hình
'''
Kiểm tra sau khi cấu hình
'''
show_int_des = "show interface description"
show_int_des = net_connect.send_command(show_int_des)
print(show_int_des)
- Kết quả:
Connecting to a host: 192.168.0.1...Interface Status Protocol DescriptionEt0/0 up upEt0/1 up up ===Link to 192.168.0.101 IP Phone===Et0/2 up up ===Link to 192.168.0.102 Wireless Controller===Et0/3 up up ===Link to 192.168.0.103 Juniper===Et1/0 up upEt1/1 up upEt1/2 up up ===Link to 192.168.0.105 PC===Et1/3 up up ===Link to 192.168.0.104 Linux Server===Vl1 up up[Finished in 35.4s]
Xong!
Basic Shell Script In Linux/Ubuntu/CentOS - P1
Trong windows chúng ta có batch file, trong linux có Shell Script. Nói chung shell là chương trình có thể tương tác người dùng, có thể input dữ liệu, có thể output ra màn hình, có thể tự động thực thi một nhóm lệnh do chúng ta tạo ra theo một lịch trình đã thiết lập.
1. Cách tạo và thực thi một chương trình shell
- Tạo file hello.sh với nội dung:
#!/bin/bash
echo "hello world"
- Thiết lập user có quyền (x) được phép thực thi cho file hello.sh
chmod u+x hello.sh
- Chạy chương trình - file hello.sh vừa tạo
Có thể thực hiện 1 trong 3 cách như dưới
- sh hello.sh- bash hello.sh- ./hello.sh
Ví dụ:
khanhvc@ubutu:~/projects/shell$ sh hello.sh
hello world
2. Shell variables
2.1 Biến của hệ thống: dùng lệnh printenv để in ra các biến đang tồn tại trong hệ thống linux
khanhvc@ubutu:~/projects/shell$ printenvSHELL=/bin/bashLC_ADDRESS=vi_VNLC_NAME=vi_VNLC_MONETARY=vi_VNPWD=/home/khanhvc/projects/shellLOGNAME=khanhvcXDG_SESSION_TYPE=ttyMOTD_SHOWN=pamHOME=/home/khanhvcLC_PAPER=vi_VNLANG=en_US.UTF-8LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:SSH_CONNECTION=192.168.0.48 63977 192.168.0.73 22LESSCLOSE=/usr/bin/lesspipe %s %sXDG_SESSION_CLASS=userLC_IDENTIFICATION=vi_VNTERM=xtermLESSOPEN=| /usr/bin/lesspipe %sUSER=khanhvcSHLVL=1LC_TELEPHONE=vi_VNLC_MEASUREMENT=vi_VNXDG_SESSION_ID=330XDG_RUNTIME_DIR=/run/user/1000SSH_CLIENT=192.168.0.48 63977 22LC_TIME=vi_VNXDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktopPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binDBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busSSH_TTY=/dev/pts/0LC_NUMERIC=vi_VNOLDPWD=/home/khanhvc/projects_=/usr/bin/printenvkhanhvc@ubutu:~/projects/shell$
Ví dụ: Tạo file demo.sh để in các thông tin các biến theo yêu cầu dưới:
- Thông tin version của shell hiện tại
- Tên của shell
- Thư mục gốc của user hiện tại
- Thông tin đường dẫn đã được thiết lập
#!/bin/bashecho $BASH_VERSIONecho $BASHecho $HOMEecho $PATH
khanhvc@ubutu:~/projects/shell$ ./demo.sh5.0.17(1)-release/bin/bash/home/khanhvc/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binkhanhvc@ubutu:~/projects/shell$
2.2 Biến do người dùng định nghĩa UDV - User Defined variables, biến CÓ phân biệt chữ hoa, chữ thường
- Cú pháp:
ten_bien=gia_tri
- Ví dụ:
#!/bin/basha=6b=3expr $a + $b
- Ví dụ khác:
#!/usr/bin/basha=6b=3tong=$(expr $a + $b)echo "Ket qua cua a CONG b = " $tonghieu=$(expr $a - $b)echo "Ket qua cua a TRU b = " $hieuthuong=$(expr $a / $b)echo "Ket qua cua a CHIA b = " $thuong#phép nhân chúng ta phải thêm dấu "\" trước dấu "*" để thực hiện phép nhântich=$(expr $a \* $b)echo "Ket qua cua a NHAN b = " $tich
khanhvc@ubutu:~/projects/shell$ sh demo.shKet qua cua a CONG b = 9Ket qua cua a TRU b = 3Ket qua cua a CHIA b = 2Ket qua cua a NHAN b = 18khanhvc@ubutu:~/projects/shell$
- Ví dụ
#!/usr/bin/basha=6let a+=1echo "a = 6, a + 1 = " ${a}let b=a+1echo "b = a + 1 = " $blet c=a+becho "c = a + b = " $c
- Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sha = 6, a + 1 = 7b = a + 1 = 8c = a + b = 15khanhvc@ubutu:~/projects/shell$
2.2.3 “bc” – An arbitrary precision calculator language”
- Ví dụ:
#!/usr/bin/bash#in ra kết quả của 5 + 3echo "5 + 3" | bc#in ra kết quả là giá trị của x + yx=10y=20echo "$x + $y" | bc#in ra kết quả là giá trị của x + ybc <<< "$x + $y"
- Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh83030khanhvc@ubutu:~/projects/shell$
Xong!
Juniper - Backup and Restore Configuration on EX Switches
NỘI DUNG:
1. Backup Kết Hợp Show Và Log Session Của SecureCRT
2. Restore - Load File
3. Restore - Load Terminal
THỰC HIỆN:
1. Backup Kết Hợp Show Và Log Session Của SecureCRT
- Kết nối đến thiết bị cần backup bằng SecureCRT
- Trên SecureCRT vào File -> LogSession -> Save để lưu các nội dung show vào file này.
- show | no-more
HOẶC
- show | no-more | display set
Commands | Diễn Giải |
---|---|
configure | Vào mode config |
load merge /var/home/admin/2021-04-27_IP127.246.cfg | Load file 2021-04-27_IP127.246.cfg nối vào cấu hình hiện tại |
Commands | Diễn Giải |
---|---|
configure | Vào mode config |
load merge terminal | sau khi gõ dòng này xong chúng ta dán nội dung cần cấu hình vào |
[Type ^D at a new line to end input] | sau khi DÁN NỘI DUNG xong nhấn enter để xuống hàng sau đó nhấn Ctrl + D để thực hiện nối nội dung vào cấu hình |
Network Automation #006 - Netmiko How To Find Which Switch Port A Device Is Plugged Into Base on IP Address
- Chuẩn bị (cấu hình trên Cisco switch ):
enableconf thostname Coreip domain name netmiko.labusername admin privilege 15 password admin1234@coreline vty 0 4login localtransport input sshcrypto key generate rsa general-keys modulus 1024ip ssh version 2interface vlan 1ip address 192.168.0.1 255.255.255.0no shutdownexitdo wri
- Code:
'''Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
(Điều kiện là thiết bị cisco cần kết nối đã được cấu hình SSH)
Câu lệnh chính dùng trong bài:
- show arp <ip cần tìm>
- show mac address-table address <địa chỉ mac cần tìm>
'''
import netmiko # import thư viện netmiko
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = {
"host":"192.168.0.1",
"username":"admin",
"password":"admin1234@core",
"device_type":"cisco_ios"
}
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1)
ip_addr = "192.168.0.101" # địa chỉ ip cần tìm
net_connect.send_command("ping" + " " + ip_addr) # ping địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC
show_arp = "show arp" + " " + ip_addr
show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm
# In ra dòng thứ nhì trong chuỗi
# print (show_arp.splitlines()[1])
# lấy dòng thứ nhì và phân ra từng cụm
fields = show_arp.splitlines()[1].split()
# lấy cụm thứ 4 (là địa chỉ MAC) tính từ trái sang, sau đó sẽ thực hiện lệnh show mac với MAC này
mac_addr = fields[3]
# print (mac_addr)
show_mac_addr = "show mac address-table address" + " " + mac_addr
show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
print ("*" * 20 + "KET QUA" + "*" * 20)
print(show_mac_addr)
- Kết quả:
Connecting to a host: 192.168.0.1...********************KET QUA********************Mac Address Table-------------------------------------------Vlan Mac Address Type Ports---- ----------- -------- -----1 0050.7966.6807 DYNAMIC Et0/0Total Mac Addresses for this criterion: 1[Finished in 8.8s]
- Chuẩn bị (cấu hình trên Juniper switch ):
cliset date 202104151020.30configureset system host-name R1-EX3400-24Pset system login message "===Đây là Switch R1-EX3400-24P==="set system domain-name 8.8.8.8set system time-zone GMT+7set system root-authentication plain-text-passwordset system login user admin class super-user authentication plain-text-password
set system service telnetset system service SSHcommit
set vlans vlan-11 vlan-id 11set interfaces irb unit 11 family inet address 192.168.0.11/24set vlans vlan-11 l3-interface irb.11set interfaces ge-1/0/1 unit 0 family ethernet-switching interface-mode accessset interfaces ge-1/0/1 unit 0 family ethernet-switching vlan members vlan-11set interfaces ge-1/0/0 unit 0 family ethernet-switching interface-mode accessset interfaces ge-1/0/0 unit 0 family ethernet-switching vlan members vlan-11commit
- Code:
'''
Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
(Điều kiện là thiết bị Juniper cần kết nối đã được cấu hình SSH)
Câu lệnh chính dùng trong bài:
- show arp hostname <ip cần tìm>
- show ethernet-switching table <địa chỉ mac cần tìm>
'''
import netmiko # import thư viện netmiko
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = {
"host":"192.168.0.1",
"username":"admin",
"password":"admin1234@core",
"device_type":"juniper_junos"
}
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1)
ip_addr = "192.168.0.101" # địa chỉ ip cần tìm
net_connect.send_command("ping" + " " + ip_addr + " " + "count 4") # ping (ping 4 gói) địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC
show_arp = "show arp" + " " + "hostname" + " " + ip_addr
show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm
# print (show_arp)
# In ra dòng thứ nhì trong chuỗi
# print (show_arp.splitlines()[1])
# lấy dòng thứ nhì và phân ra từng cụm
fields = show_arp.splitlines()[1].split()
# lấy cụm đầu tiên (là địa chỉ MAC) tính từ trái sang
mac_addr = fields[0]
# print (mac_addr)
show_mac_addr = "show ethernet-switching table" + " " + mac_addr
show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
print ("*" * 20 + "KET QUA" + "*" * 20)
print(show_mac_addr)
- Kết quả:
Connecting to a host: 192.168.0.1...********************KET QUA********************MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static, C - Control MACSE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)Ethernet switching table : 87 entries, 87 learnedRouting instance : default-switchVlan MAC MAC Age Logical NH RTRname address flags interface Index IDvlan-11 d4:f5:ef:09:c0:1e D - ge-1/0/0.0 0 0[Finished in 13.1s]
Network Configuration In Linux/Ubuntu >= 17.4
1. Các file cấu hình:
- Network interface
- Debian-based: /etc/network/interfaces
- Red Hat-based: /etc/sysconfig/network-scripts/
- Ubuntu (>= 17.04): /etc/netplan/
- DNS server: /etc/resolv.conf
- /etc/nsswitch.conf
- Kiểm tra thông tin IP hiện tại với lệnh: ip a
khanhvc@ubutu:~$ ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:d0 brd ff:ff:ff:ff:ff:ffinet 192.168.0.73/22 brd 192.168.3.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::9d21:bf12:41f0:7dfb/64 scope link noprefixroutevalid_lft forever preferred_lft forever4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ffinet 192.168.0.68/22 brd 192.168.3.255 scope global dynamic noprefixroute ens38valid_lft 28788sec preferred_lft 28788secinet6 fe80::ba76:35f6:4158:5f73/64 scope link noprefixroutevalid_lft forever preferred_lft foreverkhanhvc@ubutu:~$
- Để cấu hình IP cho Ubuntu chúng ta có thể thay đổi nội dung file /etc/netplan/01-network-manager-all.yaml bằng lệnh vim
khanhvc@ubutu:~$sudo vim /etc/netplan/01-network-manager-all.yaml# Let NetworkManager manage all devices on this systemnetwork:ethernets:ens33:dhcp4: trueens38:addresses: [192.168.0.116/22]nameservers:addresses: [8.8.8.8]dhcp4: noversion: 2renderer: NetworkManager
- nhấn Esc + : wq! -> enter để lưu cấu hình và thoát khỏi vim
- Thực hiện apply cấu hình vừa thay đổi
sudo netplan apply
- Kiểm tra lại thông tin ip address
khanhvc@ubutu:~$ ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:d0 brd ff:ff:ff:ff:ff:ffinet 192.168.0.73/22 brd 192.168.3.255 scope global dynamic noprefixroute ens33valid_lft 3560sec preferred_lft 3560secinet6 fe80::20c:29ff:fe73:8dd0/64 scope linkvalid_lft forever preferred_lft forever4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ffinet 192.168.0.116/22 brd 192.168.3.255 scope global noprefixroute ens38valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe73:8dda/64 scope linkvalid_lft forever preferred_lft foreverkhanhvc@ubutu:~$
- nmtui: Giao diện đồ họa cơ bản để cấu hình network
- net-tools package:
- ethtool- ifconfig- iwconfig- route
- iproute2 package
ip: là câu lệnh phổ biến dần thay thế cho ifconfig
- Thêm IP vào interface ens38
sudo ip address add 192.168.0.117/22 dev ens38
- Xóa IP vào interface ens38
sudo ip address del 192.168.0.117/22 dev ens38
- Xem thông tin IP address bao gồm MAC address
khanhvc@ubutu:~$ ip add show1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:d0 brd ff:ff:ff:ff:ff:ffinet 192.168.0.73/22 brd 192.168.3.255 scope global dynamic noprefixroute ens33valid_lft 24533sec preferred_lft 24533secinet6 fe80::20c:29ff:fe73:8dd0/64 scope linkvalid_lft forever preferred_lft forever4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ffinet 192.168.0.117/22 scope global ens38valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe73:8dda/64 scope linkvalid_lft forever preferred_lft foreverkhanhvc@ubutu:~$
- Hoặc cụ thể một interface
khanhvc@ubutu:~$ ip address show dev ens384: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ffinet 192.168.0.117/22 scope global ens38valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe73:8dda/64 scope linkvalid_lft forever preferred_lft foreverkhanhvc@ubutu:~$
- Thiết lập interface up/down
sudo ip link set ens38 down
- Kiểm tra sau khi thiết lập
khanhvc@ubutu:~$ ip address show dev ens38
4: ens38: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ff
khanhvc@ubutu:~$
sudo ip link set ens38 up
- Thiết lập default gateway là 192.168.0.7 thông qua interface ens33
sudo ip route add default via 192.168.0.7 dev ens33
- Xóa default gateway
sudo ip route del default via 192.168.0.7 dev ens33
- Kiểm tra bảng route hiện tại
khanhvc@ubutu:~$ ip route showdefault via 192.168.0.7 dev ens33 proto dhcp metric 100192.168.0.0/22 dev ens33 proto kernel scope link src 192.168.0.73 metric 100khanhvc@ubutu:~$
- Thêm route tĩnh
sudo ip route add 192.168.100.0/24 via 192.168.0.7 dev ens33
- Xóa route tĩnh
sudo ip route del 192.168.100.0/24 via 192.168.0.7 dev ens33
- Kiểm tra packet mà route đi qua. Ví xem để đến ip 8.8.8.8 sẽ đi qua route nào.
khanhvc@ubutu:~$ ip route get 8.8.8.88.8.8.8 via 192.168.0.7 dev ens33 src 192.168.0.73 uid 1000cachekhanhvc@ubutu:~$
- Kiểm tra bảng ARP
khanhvc@ubutu:~$ ip neigh192.168.0.16 dev ens33 lladdr 50:e5:49:a4:01:dd REACHABLE192.168.0.7 dev ens33 lladdr 00:d7:8f:0d:b8:3f REACHABLE192.168.0.48 dev ens33 lladdr 94:de:80:a6:fb:30 REACHABLEkhanhvc@ubutu:~$
- ping
- traceroute: ICMP
- tracepath: UDP
- host
- dig
- nslookup
- netstat
- ss
sudo apt-get install traceroute
sudo yum install traceroute
Command | Giải Thích |
---|---|
ping -c 4 google.com.vn | Ping google.com.vn với 4 gói tin |
traceroute 8.8.8.8 | Kiểm tra để đi đến được google.com.vn thì cần qua những next-hop nào |
tracepath google.com.vn | Tương tự như traceroute |