/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

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"

  1. 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
  2. Cấu hình description cho interface với thông tin trong file devices_list.csv

THỰC HIỆN:

  • Chuẩn bị 
a. File danh sách thiết bị device_list.csv có dạng


b. Cấu hình trên switch cisco:


1. 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

  • 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\LAB
Show_arp_Ketqua_192.168.0.1.csv
************************************************************

[Finished in 19.5s]

Nội dung file show_arp_Ketqua có dạng


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 Description
Et0/0                          up             up       
Et0/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             up       
Et1/1                          up             up       
Et1/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"

Giải thích: 
- #!/bin/bash: là shellbang, là dòng bắt buộc trong shell script
- echo "hello world": Khi chạy file hello.sh nó sẽ xuất ra màn hình chữ "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$ printenv
SHELL=/bin/bash
LC_ADDRESS=vi_VN
LC_NAME=vi_VN
LC_MONETARY=vi_VN
PWD=/home/khanhvc/projects/shell
LOGNAME=khanhvc
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/khanhvc
LC_PAPER=vi_VN
LANG=en_US.UTF-8
LS_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 22
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
LC_IDENTIFICATION=vi_VN
TERM=xterm
LESSOPEN=| /usr/bin/lesspipe %s
USER=khanhvc
SHLVL=1
LC_TELEPHONE=vi_VN
LC_MEASUREMENT=vi_VN
XDG_SESSION_ID=330
XDG_RUNTIME_DIR=/run/user/1000
SSH_CLIENT=192.168.0.48 63977 22
LC_TIME=vi_VN
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
SSH_TTY=/dev/pts/0
LC_NUMERIC=vi_VN
OLDPWD=/home/khanhvc/projects
_=/usr/bin/printenv
khanhvc@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 
Nội dung file demo.sh
#!/bin/bash
echo $BASH_VERSION
echo $BASH
echo $HOME
echo $PATH

Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh
5.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/bin
khanhvc@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

2.2.1 EXPR
  • Ví dụ:
#!/bin/bash
a=6
b=3
expr $a + $b
Kết quả là: 9, vì nó lấy giá trị của a cộng cho giá trị của b

  • Ví dụ khác:
#!/usr/bin/bash
a=6
b=3

tong=$(expr $a + $b)
echo "Ket qua cua a CONG b = " $tong

hieu=$(expr $a - $b)
echo "Ket qua cua a TRU b = " $hieu

thuong=$(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ân
tich=$(expr $a \* $b)
echo "Ket qua cua a NHAN b = " $tich
Kết quả:
khanhvc@ubutu:~/projects/shell$ sh demo.sh
Ket qua cua a CONG b =  9
Ket qua cua a TRU b =  3
Ket qua cua a CHIA b =  2
Ket qua cua a NHAN b =  18
khanhvc@ubutu:~/projects/shell$

2.2.2 LET

  • Ví dụ 

#!/usr/bin/bash
a=6
let a+=1
echo "a = 6, a + 1 = " ${a}

let b=a+1
echo "b = a + 1 = " $b

let c=a+b
echo "c = a + b = " $c
  • Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh
a = 6, a + 1 =  7
b = a + 1 =  8
c = a + b =  15
khanhvc@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 + 3
echo "5 + 3" | bc

#in ra kết quả là giá trị của x + y
x=10
y=20
echo "$x + $y" | bc

#in ra kết quả là giá trị của x + y
bc <<< "$x + $y"
  • Kết quả:
khanhvc@ubutu:~/projects/shell$ ./demo.sh
8
30
30
khanhvc@ubutu:~/projects/shell$

P/s: Kiểm tra câu lệnh chạy trong linux chúng ta dùng echo $? nếu kết quả số 0 thì câu lệnh kết thúc thành công, ngược lại là lỗi


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


Sau khi thực hiện lệnh show này toàn bộ nội dung cấu hình sẽ lưu trong file 2021-04-28-Juniper.log


2. Restore - Load File

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

3. Restore - Load Terminal

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

xong!

Network Automation #006 - Netmiko How To Find Which Switch Port A Device Is Plugged Into Base on IP Address

Nên đọc bài  LAB #001 trước khi xem bài này

Sơ đồ Lab:


Yêu cầu:  Dùng Netmiko để SSH vào switch sau đó tìm thiết bị có IP 192.168.0.101 đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó:
1. Thực hiện trên Cisco - IOS
2. Thực hiện trên Juniper - JunOS

Thực hiện:
1. Thực hiện trên Cisco - IOS

  • Chuẩn bị (cấu hình trên Cisco switch ):

  • 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/0
Total Mac Addresses for this criterion: 1
[Finished in 8.8s]

Kết quả cho chúng ta thấy IP 192.168.0.101 được kết nối vào port Et0/0 của switch 192.168.0.1

2. Thực hiện trên Juniper - JunOS
  • Chuẩn bị (cấu hình trên Juniper switch ):
Tham khảo cấu hình Juniper tại link 

Noted: Lab Juniper mình làm trên thiết bị thật, nên port sẽ không giống như hình ở trên
  • 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 MAC
           SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)

Ethernet switching table : 87 entries, 87 learned
Routing instance : default-switch
    Vlan                MAC                 MAC         Age    Logical                NH        RTR 
    name                address             flags              interface              Index     ID
    vlan-11                  d4:f5:ef:09:c0:1e   D             -   ge-1/0/0.0             0         0       

[Finished in 13.1s]

Thiết bị có IP 192.168.0.101 được nối vào port ge-1/0/0 của switch 192.168.0.1
 

Xong!

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
Ví dụ:
  • Kiểm tra thông tin IP hiện tại với lệnh: ip a
khanhvc@ubutu:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:d0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.73/22 brd 192.168.3.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::9d21:bf12:41f0:7dfb/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.68/22 brd 192.168.3.255 scope global dynamic noprefixroute ens38
       valid_lft 28788sec preferred_lft 28788sec
    inet6 fe80::ba76:35f6:4158:5f73/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

khanhvc@ubutu:~$

Hiện tại trong thiết bị có 3 card mạng (1 lo-loopback, 1 ens33 và ens38) 
  • Để 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 system
network:
    ethernets:
        ens33:
            dhcp4: true
        ens38:
            addresses: [192.168.0.116/22]
            nameservers:
              addresses: [8.8.8.8]
            dhcp4: no
    version: 2
    renderer: NetworkManager


Cấu hình trên có nghĩa là card mạng ens33 để lấy ip tự động - DHCP, card mạng ens38 đặt ip tĩnh IP là 192.168.0.116/22, DNS là 8.8.8.8
  • 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 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:d0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.73/22 brd 192.168.3.255 scope global dynamic noprefixroute ens33
       valid_lft 3560sec preferred_lft 3560sec
    inet6 fe80::20c:29ff:fe73:8dd0/64 scope link
       valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.116/22 brd 192.168.3.255 scope global noprefixroute ens38
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe73:8dda/64 scope link
       valid_lft forever preferred_lft forever
khanhvc@ubutu:~$

Chúng ta thấy card ens33 dynamic có nghĩa là đang được cấu hình IP address từ DHCP server

2. Các câu lệnh - commands
  • 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


2.1 IP Address:
  • 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 show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:d0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.73/22 brd 192.168.3.255 scope global dynamic noprefixroute ens33
       valid_lft 24533sec preferred_lft 24533sec
    inet6 fe80::20c:29ff:fe73:8dd0/64 scope link
       valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.117/22 scope global ens38
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe73:8dda/64 scope link
       valid_lft forever preferred_lft forever
khanhvc@ubutu:~$

  • Hoặc cụ thể một interface
khanhvc@ubutu:~$ ip address show dev ens38
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:73:8d:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.117/22 scope global ens38
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe73:8dda/64 scope link
       valid_lft forever preferred_lft forever
khanhvc@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:~$ 


hoặc
sudo ip link set ens38 up

2.2 Routing Table

  • 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 show
default via 192.168.0.7 dev ens33 proto dhcp metric 100
192.168.0.0/22 dev ens33 proto kernel scope link src 192.168.0.73 metric 100
khanhvc@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.8
8.8.8.8 via 192.168.0.7 dev ens33 src 192.168.0.73 uid 1000
    cache
khanhvc@ubutu:~$ 


  • Kiểm tra bảng ARP 

khanhvc@ubutu:~$ ip neigh
192.168.0.16 dev ens33 lladdr 50:e5:49:a4:01:dd REACHABLE
192.168.0.7 dev ens33 lladdr 00:d7:8f:0d:b8:3f REACHABLE
192.168.0.48 dev ens33 lladdr 94:de:80:a6:fb:30 REACHABLE
khanhvc@ubutu:~$


3. Troubleshooting
  • ping
  • traceroute: ICMP
  • tracepath: UDP
  • host
  • dig
  • nslookup
  • netstat
  • ss
Cài traceroute trên ubuntu
sudo apt-get install traceroute

Cài traceroute trên CentOS
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



Xong!
/*header slide*/