/*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 #010 - Kiểm Tra MAC Address Lạ Gắng Vào Switch

 YÊU CẦU:

Kiểm tra các địa chỉ mac hiện trên switch nếu địa chỉ nào không có trong danh sách các địa chỉ mac đang đăng ký thì lưu thông tin của chúng vào file

THỰC HIỆN:

Chuẩn bị template lưu nội dung file show_mac_address.template:

Value VLAN (\d+)
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})
Value INTERFACE ([^,\s]+)

Start
  ^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1

TYPE1
  ^\s*${VLAN}\s+${MAC_ADDRESS}\s+\w+\s+${INTERFACE}(?:\s|$$) -> Record


Code:

'''
- Kết nối switch kiểm tra các địa chỉ mac hiện trên switch nếu địa chỉ nào không có trong danh sách các địa chỉ mac đã đăng ký thì lưu thông tin của chúng vào file

- Câu lệnh sử dụng trong bài:
  show mac address-table

- Thư viện cần cài:
+ pip install textfsm
+ pip install pandas

'''

import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn
import textfsm
from netmiko import ConnectHandler
import os

path = os.getcwd()	# lấy đường dẫn hiện tại

show_mac_01 = pd.read_csv('mac_store.csv', encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8, lấy tất cả các cột hiện có
column_name = 'MAC_ADDRESS' # tên của cột phải tồn tại trong file mac_store.csv
mac_store = show_mac_01.values.tolist() # Trích lọc cột MAC_ADDRESS
mac_store = show_mac_01[column_name].values.tolist() 
#pprint(mac_store)

Sw_1 = { 
	"host":"192.168.100.23",
	"username":"admin",
	"password":"l2Hsv-Tw!!)",
	"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 = ConnectHandler(**Sw_1) 
print("Connected successfully")

sh_mac_addr = "show mac address-table"
sh_mac_addr = net_connect.send_command(sh_mac_addr) # thực hiện lênh show arp với chính IP cần tìm

with open('show_mac_address.template') as template: # Mở file show_mac_address.template vừa định nghĩa
    fsm = textfsm.TextFSM(template)
    sh_mac_addr = fsm.ParseText(sh_mac_addr)
'''
for item in sh_mac_addr :
    if item[1] not in mac_store:
        print(item)
    else: print ("x")
'''
# lấy cụm thứ 2 (là địa chỉ MAC) và kiểm tra nếu chúng không có trong có trong file mac_store.csv thì đưa vào biến mac_diff
mac_diff = [item for item in sh_mac_addr if item[1] not in mac_store] 

file_name = f"MAC_diff_{Sw_1['host']}.csv"
df = pd.DataFrame(mac_diff) # convert dữ liệu sang kiểu DataFrame
df.to_csv(file_name, header = fsm.header, index = False) # thực hiện lưu các địa chỉ mac khác nhau vào file
print (f"Cac dia chi MAC chua dang ky duoc luu vao '{file_name}' tai '{path}'")

Tham khảo bài export MAC Address trong switch tại đây

Xong!

Network Automation #009 - Exporting MAC Address From Switches Cisco IOS & TextFSM Template

 YÊU CẦU:

1. Sử dụng thư viện netmiko kết nối vào switch kết hợp với TextFSM template để export toàn bộ MAC Address và lưu vào file MAC_TextFSM_template.CSV

2. Định nghĩa TextFSM template chỉ lấy các trường: Vlan (chỉ lấy các vlan là số), Mac Address, Port là lưu thành vào file MAC_TextFSM_Custom.CSV


THỰC HIỆN:

1. Sử dụng thư viện netmiko kết nối vào switch kết hợp với TextFSM template để export toàn bộ MAC Address và lưu vào file MAC_TextFSM_template.CSV

  • Chuẩn bị:
Cài đặt thư viện:
- pip install textfsm
- pip install pandas

Tham khảo cách cài đặt thư viện tại đây

  • Code:

'''
- Kết nối switch export tất cả các MAC Address và lưu thành file MAC_TextFSM_template.CSV

- Câu lệnh sử dụng trong bài:
+ show mac address-table

- Thư viện cần cài:
+ pip install textfsm
+ pip install pandas

'''
from netmiko import ConnectHandler
import textfsm
import pandas as pd
import os

path = os.getcwd()	# lấy đường dẫn hiện tại
file_name = "MAC_TextFSM_template.CSV" # tên file cần lưu

# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = { 
	"host":"192.168.100.23",
	"username":"admin",
	"password":"admin1234",
	"device_type":"cisco_ios"
	}
	
print("Dang ket noi den thiet bi co IP: " + 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 = ConnectHandler(**Sw_1) 
print("Ket noi thanh cong!")

sh_mac_addr = "show mac address-table"
sh_mac_addr = net_connect.send_command(sh_mac_addr, use_textfsm = True) # thực hiện lệnh và sử dụng thư viện TextFSM
df = pd.DataFrame(sh_mac_addr) # chuyển dữ liệu thành dạng DataFrame
df.to_csv(file_name, index = False) # thực hiện lưu file nhưng không lưu cột index
print (f"\n=====Tat ca MAC Address duoc luu vao file '{file_name}' tai '{path}'=====")


  • Kết Quả:

Dang ket noi den thiet bi co IP: 192.168.100.23...
Ket noi thanh cong!
=====Tat ca MAC Address duoc luu o file 'MAC_TextFSM_template.CSV' tai 'C:\python'=====
[Finished in 3.3s]



Nhận xét:
Khi sử dụng TextFSM để xử lý cột Mac Address đổi thành destination_address, và Ports đổi thành destination_port chúng ta khó có thể để chỉnh được theo ý.

2. Định nghĩa TextFSM template chỉ lấy các trường: Vlan (chỉ lấy các vlan là số), Mac Address, Port là lưu thành vào file MAC_TextFSM_Custom.CSV

  • Định nghĩa TextFSM Template lưu nội dung vào file show_mac_address.template
Value VLAN (\d+)
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})
Value INTERFACE ([^,\s]+)

Start
  ^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1

TYPE1
  ^\s*${VLAN}\s+${MAC_ADDRESS}\s+\w+\s+${INTERFACE}(?:\s|$$) -> Record


Tham khảo TextFSM template tại đây

  • Code:

'''
- Kết nối switch export tất cả các MAC Address và lưu thành file MAC_TextFSM_Custom.CSV
- Chúng ta tự định nghĩa TextFSM template, các cột tiêu đề chúng ta cũng có thể đặt tên tùy thích và cũng có thể chọn ra/định nghĩa các vlan cần lấy ra trong file đó.

- Câu lệnh sử dụng trong bài:
+ show mac address-table

- Thư viện cần cài:
+ pip install textfsm
+ pip install pandas

'''
from netmiko import ConnectHandler
import textfsm
import pandas as pd
import os

path = os.getcwd()	# lấy đường dẫn hiện tại
file_name = "MAC_TextFSM_Custom.CSV" # tên file cần lưu
textfsm_template = 'show_mac_address.template' # tên template
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = { 
	"host":"192.168.100.23",
	"username":"admin",
	"password":"admin1234",
	"device_type":"cisco_ios"
	}
	
print("Dang ket noi den thiet bi co IP: " + 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 = ConnectHandler(**Sw_1) 
print("Ket noi thanh cong!")

sh_mac_addr = "show mac address-table"
sh_mac_addr = net_connect.send_command(sh_mac_addr) # thực hiện lệnh show
try:
	with open(textfsm_template) as template: # Mở file show_mac_address.template vừa định nghĩa
		fsm = textfsm.TextFSM(template)
		sh_mac_addr = fsm.ParseText(sh_mac_addr)
	#print(fsm.header)
	#pprint(sh_mac_addr)
	df = pd.DataFrame(sh_mac_addr) # convert dữ liệu sang kiểu DataFrame
	df.to_csv(file_name, header = fsm.header, index = False) # Ghi dữ liệu vừa trích lọc vào file với header tương ứng và không cần điền thêm cột index	
	print (f"\n=====Tat ca MAC Address duoc luu vao file '{file_name}' tai '{path}'=====")
except:
	print (f"\n=====Kiem tra file template '{textfsm_template}' tai '{path}'=====")	


  • Kết quả:



Nhận xét:
Việc tự định nghĩa template chúng ta có thể tùy chọn các trường cần lấy và phần tiêu đề của các cột chúng ta có thể đặt tên tùy thích. Với kết quả trên chúng ta thấy trường Type và các dòng vlan không phải là số sẽ không được đưa vào file MAC_TextFSM_Custom.csv


Xong!


Học Python Qua Ví Dụ #026 - Pandas DataFrame & Đọc CSV File

 YÊU CẦU:

1. Dùng panda để đọc file device_list.csv với các yêu cầu:
- Hiển thị tất cả dữ liệu hiện có trong file
- Lọc và chỉ định các cột muốn đọc ('username', 'password','host','device_type') và chuyển đổi thành Dictionnary
- Chỉ đọc 5 dòng đầu tiên
- Không đọc các dòng thứ nhất, thứ 5 và thứ 6
- Chỉ đọc dòng đầu tiên và chuyển dòng này thành List

2. Dùng panda để đọc file show_mac_address.csv trích lọc cột 'MAC_ADDRESS' và chuyển từng dòng giá trị sang List


THỰC HIỆN

1. Dùng panda để đọc file .csv với các yêu cầu:
- Hiển thị tất cả dữ liệu hiện có trong file
- Lọc và chỉ định các cột muốn đọc ('username', 'password','host','device_type') và chuyển đổi thành Dictionnary
- Chỉ đọc 5 dòng đầu tiên
- Không đọc các dòng thứ nhất, thứ 5 và thứ 6
- Chỉ đọc dòng đầu tiên và chuyển dòng này thành List

Code:

import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

device_info = pd.read_csv('device_list.csv', encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8, lấy tất cả các cột hiện có
pprint(device_info)

'''
orient str {‘dict’, ‘list’, ‘series’, ‘split’, ‘records’, ‘index’}

‘dict’ (default) : dict like {column -> {index -> value}}
‘list’ : dict like {column -> [values]}
‘series’ : dict like {column -> Series(values)}
‘split’ : dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}
‘records’ : list like [{column -> value}, … , {column -> value}]
‘index’ : dict like {index -> {column -> value}}
'''
column_name = ['username', 'password','host','device_type'] # chỉ định các cột cần lấy
device_info = pd.read_csv('device_list.csv', usecols = column_name, encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8
device_info = device_info.to_dict(orient='records') # chuyển đổi về dict tương ứng (ví dụ: nếu file có 10 dòng thì sẽ tạo ra 9 (10 dòng bỏ đi dòng đầu tiên đã làm key) dictionary tương ứng)
pprint(device_info)

device_info = pd.read_csv('device_list.csv', nrows=5) # đọc 5 dòng đầu tiên
pprint(device_info)

device_info = pd.read_csv('device_list.csv', skiprows=[0,5,6]) # KHÔNG ĐỌC các dòng thứ nhất, thứ 5, thứ 6
pprint(device_info)

device_info = pd.read_csv('device_list.csv', nrows=0).columns.tolist() # chỉ lấy 1 dòng đầu tiên 
pprint(device_info) 


2. Dùng panda để đọc file show_mac_address.csv trích lọc cột 'MAC_ADDRESS' và chuyển từng dòng giá trị sang List

import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

show_mac_address = pd.read_csv('show_mac_address.csv', encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8, lấy tất cả các cột hiện có
column_name = ['MAC_ADDRESS']
show_mac_address = show_mac_address[column_name].values.tolist() # Trích lọc cột MAC_ADDRESS
pprint (show_mac_address)

Tham khảo convert panda to list
Tham khảo convert panda to dict

Xong!

Học Python Qua Ví Dụ #025 - TextFSM, Pandas DataFrame & Ghi CSV File

 YÊU CẦU:

1. Trích lọc lấy các cột dữ liệu Address và Hardware Addr trong khối dữ liệu thô lấy được từ kết quả show arp

2. Trích lọc lấy cột VLAN và MAC_ADDRESS trong khối dữ liệu thô từ kết quả show mac address-table, nhưng chỉ lấy các vlan 101 -> 104 và vlan 107 -> 108. Kết quả trích lọc sẽ được lưu vào file theo định dạng CSV


THỰC HIỆN:

1. Trích lọc lấy các cột dữ liệu Address và Hardware Addr trong khối dữ liệu thô lấy được từ kết quả show arp.

Nhận xét:
Có rất nhi ều cách xử lý để lấy ra được dữ liệu theo yêu cầu. Tuy nhiên hôm nay chúng tôi giới thiệu các bạn sử dụng TextFSM kết hợp với Regular Expression

a. Định nghĩa/tạo file show_arp.template (file này được lưu thư mục chứa file Demo.py) với các dạng: IP Address và Hardward Addr (MAC)

Value MAC_ADDRESS ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}) 
Value IP_ADDRESS (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

Start 
  ^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+ -> Record 

Giải thích:
* Hàng 1:
- MAC_ADDRESS: tên của biến
- ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}): Giá trị của địa chỉ MAC có dạng (Regular Expression sẽ thực hiện lọc ra nếu thỏa điều kiện)

Hàng 2:
- Value IP_ADDRESS: tên của biến
- (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}): Giá trị của địa chỉ IPv4 có dạng

Hàng 3:
Là dòng trắng(bắt buộc phải có dòng trắng này)

Hàng 4:
Start

Hàng 5:
2 khoảng trắng, dấu "^" chuỗi được bắt đầu bởi <nội dung định nghĩa của regular expression> -> Record: Báo hiệu kết thúc và thực hiện

-Ý nghĩa dòng RegEx "^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+":
Bắt đầu là chuỗi Internet, là khoảng trắng có thể xuất hiện 1 hoặc nhiều lầnđịnh dạng của địa chỉ IP_ADDRESS được định nghĩa (vlaue IP_ADDRESS), là khoảng trắng có thể xuất hiện 1 hoặc nhiều lần, có thể là số xuất hiện 1 hoặc nhiều lần HOẶC là ký tự "_", là khoảng trắng có thể xuất hiện 1 hoặc nhiều lần, định dạng của địa chỉ MAC_ADDRESS, là khoảng trắng xuất hiện 1 hoặc nhiều lần

Các bạn có thể tìm hiểu thêm về Regular Expression tại đây


b. Code (Demo.py):

import textfsm
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

show_arp = '''Building-1_Factory-1_2960_24#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.100.7           6   00d7.8f0d.b83f  ARPA   Vlan1
Internet  192.168.100.11          -   08cc.a7dd.e440  ARPA   Vlan1
Internet  192.168.100.32         56   3087.d91e.1c50  ARPA   Vlan1
Internet  192.168.100.35         65   f8e7.1e34.31d0  ARPA   Vlan1
Internet  192.168.100.51         65   348f.2712.aa80  ARPA   Vlan1
Internet  192.168.100.61         65   8423.8805.8370  ARPA   Vlan1
Internet  192.168.100.62         65   c803.f53a.ccf0  ARPA   Vlan1
Internet  192.168.100.63         65   c803.f50c.4a50  ARPA   Vlan1
Internet  192.168.100.65         65   4cb1.cd3c.1af0  ARPA   Vlan1
Internet  192.168.100.66         65   4cb1.cd3b.cd30  ARPA   Vlan1
Internet  192.168.100.179        10   f28c.d229.b87b  ARPA   Vlan1
Internet  192.168.116.15         73   00d7.8f0d.b83f  ARPA   Vlan1
Internet  192.168.116.37        142   00d7.8f0d.b83f  ARPA   Vlan1
'''

with open('show_arp.template') as template: # Mở file show_arp.template vừa định nghĩa
    fsm = textfsm.TextFSM(template)
    show_arp = fsm.ParseText(show_arp)

print(fsm.header) # in ra tên các biến được định nghĩa trong file show_arp.template
pprint(show_arp) # Kết quả trích lọc/lấy được thỏa điều kiện Regular Expression

Kết quả:

['MAC_ADDRESS', 'IP_ADDRESS']
[['00d7.8f0d.b83f', '192.168.100.7'],
 ['08cc.a7dd.e440', '192.168.100.11'],
 ['3087.d91e.1c50', '192.168.100.32'],
 ['f8e7.1e34.31d0', '192.168.100.35'],
 ['348f.2712.aa80', '192.168.100.51'],
 ['8423.8805.8370', '192.168.100.61'],
 ['c803.f53a.ccf0', '192.168.100.62'],
 ['c803.f50c.4a50', '192.168.100.63'],
 ['4cb1.cd3c.1af0', '192.168.100.65'],
 ['4cb1.cd3b.cd30', '192.168.100.66'],
 ['f28c.d229.b87b', '192.168.100.179'],
 ['00d7.8f0d.b83f', '192.168.116.15'],
 ['00d7.8f0d.b83f', '192.168.116.37']]
[Finished in 0.1s]

2. Trích lọc lấy cột VLAN và MAC_ADDRESS trong khối dữ liệu thô từ kết quả show mac address-table, nhưng chỉ lấy các vlan 101 -> 104 và vlan 107 -> 108. Kết quả trích lọc sẽ được lưu vào file theo định dạng CSV

a. Tạo file teamplate show_mac_address.template:

Value VLAN ([1][0]([1-4]|[7-8]))
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})

Start
  ^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1

TYPE1
  ^\s*${VLAN}\s+${MAC_ADDRESS}\s+ -> Record

Giải thích:
Kết quả trả về có thể có nhiều dạng khác nhau, tùy mỗi dạng mà chúng ta xử lý/lấy/trích lọc phù hợp với yêu cầu. Ở đây chúng ta xét nếu chúng trả về dạng: ^Vlan\s+Mac Address\s+Type\s+Ports thì nhảy đến TYPE1 để thực hiện trích lọc. (chú ý phải có dòng trắng số 3, và dòng trắng số 6)

b. Code:

import textfsm
import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

show_mac_address = '''Building-1_Factory-1_2960_24#show mac address-table
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
 All    0100.0ccc.cccc    STATIC      CPU
 All    0100.0ccc.cccd    STATIC      CPU
 All    0180.c200.0000    STATIC      CPU
 All    0180.c200.0001    STATIC      CPU
 All    0180.c200.0002    STATIC      CPU
 All    0180.c200.000d    STATIC      CPU
 All    0180.c200.000e    STATIC      CPU
 All    0180.c200.000f    STATIC      CPU
 All    0180.c200.0010    STATIC      CPU
 All    ffff.ffff.ffff    STATIC      CPU
 100    0000.7d30.b3b7    DYNAMIC     Gi0/1
 100    0000.7d30.b3c2    DYNAMIC     Fa0/23
 101    0002.6510.92d3    DYNAMIC     Fa0/23
 101    0002.6510.b148    DYNAMIC     Fa0/23
 101    0002.6510.befe    DYNAMIC     Fa0/23
 101    0002.6512.8a34    DYNAMIC     Fa0/23
 102    0002.6513.c157    DYNAMIC     Fa0/23
 102    0002.6513.fd5f    DYNAMIC     Fa0/23
 102    0002.6513.fd62    DYNAMIC     Fa0/23
 102    0002.6513.fdbd    DYNAMIC     Fa0/23
 103    0002.6513.fe26    DYNAMIC     Fa0/23
 103    0002.6514.5de5    DYNAMIC     Fa0/23
 108    0002.6516.793e    DYNAMIC     Fa0/23
 103    0016.e637.f51f    DYNAMIC     Gi0/1
 104    001d.9291.71cb    DYNAMIC     Fa0/23
 113    accb.51d5.2d3d    DYNAMIC     Gi0/1
 113    accb.51f5.4e4e    DYNAMIC     Gi0/1
 115    b4a3.82c4.374a    DYNAMIC     Gi0/1
 109    c051.7ef3.c089    DYNAMIC     Gi0/1
 109    c051.7ef3.c214    DYNAMIC     Gi0/1
 108    001e.8ccd.f971    DYNAMIC     Gi0/1
 100    0024.1db9.ab37    DYNAMIC     Gi0/1
 101    006c.bcb2.5e9d    DYNAMIC     Gi0/1
 101    d027.88bd.4b80    DYNAMIC     Gi0/1
 102    e0d5.5e17.5c5c    DYNAMIC     Gi0/1
 100    eca8.6b77.808a    DYNAMIC     Gi0/1
 101    0000.7d30.b3ba    DYNAMIC     Gi0/1
 104    001b.fc9f.af1c    DYNAMIC     Gi0/1
 101    001f.d018.26e1    DYNAMIC     Gi0/1
 101    001f.d0c1.71f8    DYNAMIC     Gi0/1
 102    bc5f.f47d.cad6    DYNAMIC     Gi0/1
 110    f003.8c8e.b2cd    DYNAMIC     Gi0/1
 110    f003.8c8e.b2d1    DYNAMIC     Gi0/1
 110    f003.8c8e.b2f3    DYNAMIC     Gi0/1
 112    00d7.8f0d.b83f    DYNAMIC     Gi0/1
 112    04b4.290a.2ad1    DYNAMIC     Gi0/1
 105    04d6.aad0.3772    DYNAMIC     Gi0/1
 112    0c2f.b065.e65c    DYNAMIC     Fa0/1
 112    1881.0e21.f5ff    DYNAMIC     Gi0/1
   1    1887.407b.444d    DYNAMIC     Gi0/1
 112    2047.da27.a341    DYNAMIC     Gi0/1
 112    20a2.e416.c350    DYNAMIC     Gi0/1
 113    e0c3.7709.5c28    DYNAMIC     Gi0/1
 113    e493.6a45.0717    DYNAMIC     Gi0/1
 113    ec51.bc56.cced    DYNAMIC     Gi0/1
   1    f0db.e2ba.c6c6    DYNAMIC     Gi0/1
 113    f8da.0c82.844f    DYNAMIC     Gi0/1
 107    f8e6.1a10.79f6    DYNAMIC     Gi0/1
 107    286f.7ff2.34e0    DYNAMIC     Gi0/1
 106    0017.c498.c864    DYNAMIC     Gi0/1
 106    0095.697f.49e8    DYNAMIC     Gi0/1
 116    00d7.8f0d.b83f    DYNAMIC     Gi0/1
   1    04d6.aa5b.9e4c    DYNAMIC     Gi0/1
   1    04d6.aade.dd3b    DYNAMIC     Gi0/1
   1    08e6.89ab.13a5    DYNAMIC     Gi0/1
'''

with open('show_mac_address.template') as template: # Mở file show_mac_address.template vừa định nghĩa
    fsm = textfsm.TextFSM(template)
    show_mac_address = fsm.ParseText(show_mac_address)

#print(fsm.header)
#pprint(show_mac_address)

df = pd.DataFrame(show_mac_address) # convert dữ liệu sang kiểu DataFrame
df.to_csv("show_mac_address.csv", header = fsm.header, index = False) # Ghi dữ liệu vừa trích lọc vào file với header tương ứng và không cần điền thêm cột index
  
Kết quả file show_mac_address.csv có dạng

Xong!


Học Python Qua Ví Dụ #024 - Get Difference Between Two List - Lấy Ra Phần Khác Nhau Giữa Hai List

Yêu Cầu: Tìm các IP ở HoChiMinh_ips mà không có trong danh sách ở HaNoi_ips

1. Dùng for lồng 

2. Dùng List Kết Hợp For và IF

3. Covert List Sang Set Và Thực Hiện Toán Tử Difference

4. Covert List Sang Set Và Thực Hiện Thuộc Tính Difference


Code:

'''
Tìm các IP ở HoChiMinh_ips mà không có trong danh sách ở hà nội HaNoi_ips
''' HaNoi_ips = [ "10.10.10.1", "10.10.20.1", "10.10.30.1", "10.10.40.1", "10.10.50.1", "10.10.60.1", "10.10.70.1", "10.10.80.1", "10.10.10.1", "10.10.70.1", ] HoChiMinh_ips = [ "10.10.10.1", "10.10.30.1", "10.10.40.1", "10.10.50.1", "10.10.60.1", "10.10.210.1", "10.10.220.1", "10.10.230.1", "10.10.240.1", ] HCM_NOT_in_HaNoi = [] for item in HoChiMinh_ips: if item not in HaNoi_ips: HCM_NOT_in_HaNoi.append(item) print(HCM_NOT_in_HaNoi)


Kết quả:
['10.10.240.1', '10.10.230.1', '10.10.220.1', '10.10.210.1']
[Finished in 0.1s]


2. Dùng List Kết Hợp For và IF

HCM_NOT_in_HaNoi = [item for item in HoChiMinh_ips if item not in HaNoi_ips]
print (HCM_NOT_in_HaNoi)


3. Covert List Sang Set Và Thực Hiện Toán Tử Difference

set_HCM_NOT_in_HaNoi = set(HoChiMinh_ips) - set(HaNoi_ips)
HCM_NOT_in_HaNoi = list(set_HCM_NOT_in_HaNoi)
print(HCM_NOT_in_HaNoi)


4. Covert List Sang Set Và Thực Hiện Thuộc Tính Difference

set_HCM_NOT_in_HaNoi = set(HoChiMinh_ips).difference(set(HaNoi_ips))
HCM_NOT_in_HaNoi = list(set_HCM_NOT_in_HaNoi)
print(HCM_NOT_in_HaNoi)


Tham khảo bài các hành động của Set trong python tại đây

Xong!

Library, Share Tài Liệu Cisco


  1. CCNA TTG Training Center - Download
  2. CCNA networklession - Download
  3. CCNP Switch networklession - Download
  4. CCNP Route networklession - Download
  5. CCNP Tshoot networklession - Download


Network Automation #008 - Netmiko Finding Device IP Addresses Connected To Juniper - JunOS Switch

Nên tham khảo bài Juniper - JunOS (mục 2) trước khi xem bài này

YÊU CẦU: 

Dùng thư viện Netmiko trong python để SSH vào switch Juniper - JunOS để  tìm các thiết bị hiện tại đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó. Các địa chỉ IP cần tìm được lưu trữ trong file "device_list.csv". 

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"

THỰC HIỆN:

1. Chuẩn bị file danh sách thiết bị có dạng


2. 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ị Juniper 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 hostname < địa chỉ ip cần tìm>
- show ethernet-switching table <đị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":"juniper_junos"
	}
print("Connecting to a host: " + Sw_1["host"] + "...") # 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) 
print("Connected successfully\n")


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,MAC Flags,Logical Interface\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ớ

print ("*" * 20 + "KET QUA" + "*" * 20)
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 + " " + "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(show_mac_addr)
	show_mac_addr = show_mac_addr.splitlines()[8].split() # lấy dòng thứ 8 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 
	#print(type(show_mac_addr))
	#print(type(values))
	
	for i in [6,5,3]:  
		del show_mac_addr[i] # thực hiện xóa các phần tử không cần lấy

	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")

3. Kết quả:

Connecting to a host: 192.168.0.1...
Connected successfully

********************KET QUA********************
*172.16.125.11:
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 : 109 entries, 109 learned
Routing instance : default-switch
    Vlan                MAC                 MAC         Age    Logical                NH        RTR 
    name                address             flags              interface              Index     ID
    vlan-125            c0:74:ad:32:2d:3c   D             -   ge-1/0/1.0             0         0       


*172.16.126.11:
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 : 109 entries, 109 learned
Routing instance : default-switch
    Vlan                MAC                 MAC         Age    Logical                NH        RTR 
    name                address             flags              interface              Index     ID
    vlan-126            d4:f5:ef:09:c0:1e   D             -   ge-1/0/3.0             0         0       


********************KẾT QUẢ ĐƯỢC LƯU TẠI********************
C:\vck\LAB
Show_arp_Ketqua_192.168.0.1.csv
************************************************************

[Finished in 17.5s]

Nội dung của file Show_arp_Ketqua_192.168.0.1.csv có dạng


Xong!

Network Automation #000 - Netmiko Basic SSH To Router With Command Show

SƠ ĐỒ LAB:
YÊU CẦU: 

Dùng thư viện netmiko trên python SSH vào thiết bị và thực hiện những lệnh show căn bản


THỰC HIỆN:
1. Chuẩn bị cấu hình trên Router

conf t
hostname R_1
ip domain name NETMIKO.lab
no ip domain-lookup
banner motd #===R_1 NETMIKO LAB===#

username admin privilege 15 password admin1234
service password-encryption
 
line con 0
logging synchronous
login local
exit
line vty 0 4
login local
transport input all
crypto key generate rsa general-keys modulus 1024
ip ssh version 2
 
interface Et0/0
no shutdown
ip address 192.168.0.1 255.255.255.0
description ===Connect to PC===
exit
!
end
wri   
Tham khảo cấu hình mẫu/cấu hình cơ bản tại đây


2. Python script Netmiko SSH connection

#!/usr/bin/env python3
import netmiko

# Định nghĩa thông tin thiết bị trong dictionary (thông tin cấu hình trong phần chuẩn bị cấu hình)
device_info = {
    "host": "192.168.0.1",
    "port": 22,
    "username": "admin",
    "password": "admin1234",
    "device_type": "cisco_ios"
}

print("Connecting to {}...".format(device_info["host"])) # print ra dong Connecting to + IP được định nghĩa ở trong dictionnary

net_connect = netmiko.ConnectHandler(**device_info) # Dùng hàm ConnectHandler trong thư viện netmiko để kế nối đến thiết bị

print("Connected successfully") # in ra dòng kết nối thành công
net_connect.enable() # vào mode enable
#net_connect.config_mode() # vào mode config terminal 

 
while True: 
    hostname = net_connect.find_prompt() # Trả về dấu nhắc hiện tại
    command = input(hostname) # in ra những gì trước dấu nhắc (trường hợp này là hostname)
    if command != "exit" and command != "quit": # nếu không không phải là exit hay quit thì thực hiện lệnh show
        output = net_connect.send_command(command) # thực hiện lệnh show vừa gõ
        print(output) # in qa kết quả thực hiện lênh show
    else:   
        break   # kết thúc vòng lặp while (khi chúng ta gõ exit hay quit)

net_connect.disconnect()
P/s: copy nội dung trên lưu thành file Demo.py lưu vào C:\Python\Demo.py

3. Kiểm tra kết nối và thực hiện lệnh show

  • Thực hiện ở Command Prompt
c:\Python>python Demo.py
Connecting to 192.168.0.1...
Connected successfully
R_1#

  • Tiếp tục thực hiện lênh show ip int bri 
R_1#show ip int bri
Interface                  IP-Address      OK? Method Status                Protocol
Ethernet0/0                192.168.0.1     YES NVRAM  up                    up
Ethernet0/1                unassigned      YES NVRAM  administratively down down
Ethernet0/2                unassigned      YES NVRAM  administratively down down
Ethernet0/3                unassigned      YES NVRAM  administratively down down
R_1#

  • Hoặc thực hiện bất cứ lệnh show nào bạn thích
Nói chung các bạn có thể dùng netmiko thay thế cho các công cụ remote khác nếu bạn thích.
  • Chụp hình kết quả thực hiện


Xong!

Mô Hình Mạng Cho Doanh Nghiệp Vừa & Nhỏ - Bài 7

Nên xem bài cấu hình căn bản trước xem bài này

Sơ đồ LAB:


Bảng thông tin địa chi IP:
STT Tên Thiết Bị Interface IP Address Subnet Mask Gateway/Default Route
1 Internet Lookback 8 8.8.8 255.0.0.0
Et0/0 200.1.1.1 255.255.255.252
2 ISP-Router Et0/0 200.1.1.2 255.255.255.0 200.1.1.1
Et0/1 125.234.102.241 255.255.255.248
3 Firewall Et0/1 125.234.102.243 255.255.255.248 125.234.102.241
Et0/1 192.168.200.1 255.255.255.0
4 Core Et0/1 192.168.200.2 255.255.255.0 192.168.200.1
Vlan100 192.168.100.254 255.255.255.0
Vlan101 192.168.101.254 255.255.255.0
Vlan102 192.168.102.254 255.255.255.0
Vlan103 192.168.103.254 255.255.255.0
5 DHCP Server Vlan100 192.168.100.100 255.255.255.0 192.168.100.254
6 PC1 Eth0 192.168.101.101 255.255.255.0 192.168.101.254
7 PC2 Eth0 192.168.102.102 255.255.255.0 192.168.102.254
8 PC3 Eth0 DHCP
9 PC3 Eth0 DHCP


Các kiến thức: VLAN, SVI, Trunking, NAT, Access-List, DHCP, IP SLA Tracking, Static Route, Floating Static Route


YÊU CẦU:

1. Đặt IP theo sơ đồ

2. Trên switch Core thực hiện:
  • Tạo các vlan 101, 102,103 và thực hiện đặt IP theo sơ đồ
  • Tạo vlan 500 và gán port Et0/2, Et0/3 vào vlan 500
3. Cấu hình port trunk trên port Et1/1 của switch core và Et0/0 của Acc01

4. Trên Acc01 tạo vlan 101,102 và gán các port  Et0/1 vào vlan 101, port Et0/2 vào vlan 102 đảm bảo PC1 & PC2 phải ping thấy nhau

5. Tương tự cấu hình trunk trên cổng đấu nối giữa Core switch và Acc02; trên Acc02 tạo vlan 102, 103; gán port Et0/2 vào vlan 102 và port Et0/3 vào vlan 103.

6. Cấu hình trên DHCP server:
  • Đặt IP Address và Default Route như sơ đồ
  • Cấu hình các pool DHCP cho vlan 101, 102, 103
  • Vlan 103 chỉ cấp DHCP trong khoảng từ 192.168.103.104 đến 192.168.103.253
7. Thực hiện trên switch core:
  • Tạo vlan 100, đặt ip cho vlan 100 theo sơ đồ, gán port Et0/0 vào vlan 100
  • Cấu hình dhcp relay agent cho vlan 101,102,103 đảm bảo các PC trong các vlan có thể lấy được địa chỉ IP do DHCP_Server 192.168.100.100 cấp
8. Trên Internet ạo Static route 125.234.102.240/29 trỏ về IP 200.1.1.2 của ISP-Router

9. Tạo các default route và thực hiện NAT trên overload trên Firewall đảm bảo tất cả các PC có thể ping được 8.8.8.8
    10. Cấu hinh trên Core switch phải đảm bảo các PC trong LAN truy cập 8.8.8.8 phải đi đúng thứ tự Core -> Firewall -> ISP-Router -> Internet; tuy nhiên khi Firewall down các PC có thể truy cập được 8.8.8.8 theo thứ tự Core -> ISP-Router -> Internet

    11. IP SLA Tracking


    THỰC HIỆN:

    1. Đặt IP theo sơ đồ
    • Internet:
    conf t
    hostname Internet

    interface Loopback8
    no shutdown
    ip address 8.8.8.8 255.0.0.0
    exit
    interface et0/0
    ip address 200.1.1.1 255.255.255.252
    no sh
    end
    wri

    • ISP-Router:
    conf t
    hostname ISP-Router

    interface et0/0
    ip address 200.1.1.2 255.255.255.252
    no sh
    exit
    interface et0/1
    ip address 125.234.102.241 255.255.255.248
    no sh
    end
    wri

    • Firewall:
    conf t
    hostname Firewall

    interface et0/2
    ip address 125.234.102.243 255.255.255.248
    no sh
    exit
    interface et0/1
    ip address 192.168.200.1 255.255.255.248
    no sh
    end
    wri

    Noted: Dùng router để giả lập Firewall, trong LAB này FW chỉ dùng NAT overload đảm bảo các PC trong LAN có thể truy cập được internet. Bạn nào muốn tham chuyên đề về Firewall thì tham khảo tại link

    • Switch Core/Layer3:
    conf t
    hostname Core

    interface et0/1
    no switchport
    ip address 192.168.200.2 255.255.255.248
    no sh
    end
    wri

    2. Trên switch Core thực hiện:
    • Tạo các vlan 101, 102,103 và thực hiện đặt IP theo sơ đồ
    Core:
    conf t

    vlan 101
    int vlan 101
    ip address 192.168.101.254 255.255.255.0
    no sh
    exit

    vlan 102
    int vlan 102
    ip address 192.168.102.254 255.255.255.0
    no sh
    exit

    vlan 103
    int vlan 103
    ip address 192.168.103.254 255.255.255.0
    no sh
    end
    wri

    • Tạo vlan 500 và gán port Et0/2, Et0/3 vào vlan 500
    Core:
    conf t

    vlan 500
    exit
    int et0/2
    sw mode access
    sw acc vlan 500
    exit
    int et0/3
    sw mode access
    sw acc vlan 500
    end 
    wri

    Noted: Vlan 500 cũng có thể gọi là DMZ switch, ở đây chúng ta có thể các thiết bị sử dụng IP public và không cần thông qua firewall như: Voice IP, Tổng Đài IP, Video Conferrence,... Chúng ta cũng có thể sử dụng 1 switch hardware thay cho VLAN, tuy nhiên mục đích tạo ra vlan 500 sẽ được giải thích trong mục 10 và 11 của bài này.

    3. Cấu hình port trunk trên port Et1/1 của switch core và Et0/0 của Acc01

    • Cấu hình
    Core:
    conf t
    int et1/1
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    end 
    wri

    Acc01:
    conf t
    hostname Acc01
    in et0/0
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    end
    wri

    Tùy theo từng dòng sản phẩm mà khi cấu hình trunk CÓ THỂ CÓ hoặc KHÔNG CÓ dòng "switchport trunk encapsulation dot1q

    • Kiểm tra:
    Core#show interfaces trunk

    Port        Mode             Encapsulation  Status        Native vlan
    Et1/1       on                     802.1q         trunking      1

    Port        Vlans allowed on trunk
    Et1/1       1-4094

    Port        Vlans allowed and active in management domain
    Et1/1       1,100-103,500

    Port        Vlans in spanning tree forwarding state and not pruned
    Et1/1       1,100-103,500
    Core#

    Acc01#show  interfaces trunk

    Port        Mode             Encapsulation  Status        Native vlan
    Et0/0       on                    802.1q         trunking      1

    Port        Vlans allowed on trunk
    Et0/0       1-4094

    Port        Vlans allowed and active in management domain
    Et0/0       1,101-102

    Port        Vlans in spanning tree forwarding state and not pruned
    Et0/0       1,101-102
    Acc01#


    4. Trên Acc01 tạo vlan 101,102 và gán các port  Et0/1 vào vlan 101, port Et0/2 vào vlan 102 đảm bảo PC1 & PC2 phải ping thấy nhau

    • Cấu hình:
    Acc01:
    conf t

    vlan 101
    vlan 102
    exit

    int et0/1
    sw mode access
    sw acc vlan 101
    exit
    int et0/2
    sw mode access
    sw acc vlan 102
    end
    wri

    • Kiểm tra:
    Acc01#show vlan

    VLAN Name                             Status    Ports
    ---- -------------------------------- --------- -------------------------------
    1    default                          active    Et0/3
    101  VLAN0101                         active    Et0/1
    102  VLAN0102                         active    Et0/2
    1002 fddi-default                     act/unsup
    1003 token-ring-default               act/unsup
    1004 fddinet-default                  act/unsup
    1005 trnet-default                    act/unsup

    PC1> ping 192.168.102.102

    84 bytes from 192.168.102.102 icmp_seq=1 ttl=63 time=1.830 ms
    84 bytes from 192.168.102.102 icmp_seq=2 ttl=63 time=1.349 ms
    84 bytes from 192.168.102.102 icmp_seq=3 ttl=63 time=2.090 ms
    84 bytes from 192.168.102.102 icmp_seq=4 ttl=63 time=1.659 ms
    84 bytes from 192.168.102.102 icmp_seq=5 ttl=63 time=1.987 ms

    PC1>
    PC2> ping 192.168.101.101

    84 bytes from 192.168.101.101 icmp_seq=1 ttl=63 time=2.088 ms
    84 bytes from 192.168.101.101 icmp_seq=2 ttl=63 time=1.770 ms
    84 bytes from 192.168.101.101 icmp_seq=3 ttl=63 time=1.893 ms
    84 bytes from 192.168.101.101 icmp_seq=4 ttl=63 time=1.721 ms
    84 bytes from 192.168.101.101 icmp_seq=5 ttl=63 time=1.349 ms

    PC2>

    Kết quả đã đáp ứng yêu cầu đặt ra

    5. Tương tự cấu hình trunk trên cổng đấu nối giữa Core switch và Acc02; trên Acc02 tạo vlan 102, 103; gán port Et0/2 vào vlan 102 và port Et0/3 vào vlan 103.

    • Cấu hình trunk
    Core:
    conf t
    int et1/2
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    end 
    wri

    Acc02
    conf t
    hostname Acc02
    in et0/0
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    end
    wri

    • Gán port vào vlan
    Acc02:
    conf t
    vlan 102
    vlan 103
    exit
    int et0/2
    sw mode access
    sw acc vlan 102
    exit
    int et0/3
    sw mode access
    sw acc vlan 103
    end
    wri

    • Kiểm tra trên Acc02:
    Acc02#show interfaces trunk

    Port        Mode             Encapsulation  Status        Native vlan
    Et0/0       on               802.1q         trunking      1

    Port        Vlans allowed on trunk
    Et0/0       1-4094

    Port        Vlans allowed and active in management domain
    Et0/0       1,102-103

    Port        Vlans in spanning tree forwarding state and not pruned
    Et0/0       1,102-103
    Acc02#
    Acc02#show vlan

    VLAN Name                             Status    Ports
    ---- -------------------------------- --------- -------------------------------
    1    default                          active    Et0/1
    102  VLAN0102                         active    Et0/2
    103  VLAN0103                         active    Et0/3
    1002 fddi-default                     act/unsup
    1003 token-ring-default               act/unsup
    1004 fddinet-default                  act/unsup
    1005 trnet-default                    act/unsup
    {...}

    Acc02#

    6. Cấu hình trên DHCP server:
    • Đặt IP Address và Default Route như sơ đồ
    conf t
    hostname DHCP_Server
    int et0/0
    ip address 192.168.100.100 255.255.255.0
    no sh
    exit
    ip route 0.0.0.0 0.0.0.0 192.168.100.254
    end
    wri

    • Cấu hình các pool DHCP cho vlan 101, 102, 103
    conf t

    ip dhcp pool vlan_101
    network 192.168.101.0 255.255.255.0
    dns-server 8.8.8.8
    default-router 192.168.101.254
    lease 0 0 10
    exit
    ip dhcp pool vlan_102
    network 192.168.102.0 255.255.255.0
    dns-server 8.8.8.8
    default-router 192.168.102.254
    lease 0 0 10
    exit
    ip dhcp pool vlan_103
    network 192.168.103.0 255.255.255.0
    dns-server 8.8.8.8
    default-router 192.168.103.254
    lease 0 0 10
    end 
    wri

    Giải thích
    : lease 0 0 10: Thời gian cấp lại IP mới cho DHCP client ngày giờ phút

    Noted: Ở đây chúng tôi lấy router của cisco làm DHCP server, các bạn cũng có thể thay thế bằng Windows, Linux, ...

    • Vlan 103 chỉ cấp DHCP trong khoảng từ 192.168.103.104 đến 192.168.103.253

    conf t
    ip dhcp excluded-address 192.168.103.1 192.168.103.103
    ip dhcp excluded-address 192.168.103.254
    end
    wri
    Noted: Mặt định khi tạo pool DHCP thì cisco sẽ cấp từ 1 đến 254, trong trường hợp này chúng ta tạo danh sách ngoại trừ từ 192.168.103.1 đến 192.168.103.103 và 192.168.103.254

    7. Thực hiện trên switch core:
    • Tạo vlan 100, đặt ip cho vlan 100 theo sơ đồ, gán port Et0/0 vào vlan 100

    conf t
    vlan 100
    int vlan 100
    ip address 192.168.100.254 255.255.255.0
    no sh
    exit
    int et0/0
    sw mode access
    sw acc vlan 100
    end
    wri

    • Cấu hình dhcp relay agent cho vlan 101,102,103 đảm bảo các PC trong các vlan có thể lấy được địa chỉ IP do DHCP_Server 192.168.100.100 cấp
    conf t
    int vlan 101
    ip helper-address 192.168.100.100
    int vlan 102
    ip helper-address 192.168.100.100
    int vlan 103
    ip helper-address 192.168.100.100
    end
    wri

    Kiểm tra:

    PC3> ip dhcp
    DDORA IP 192.168.102.1/24 GW 192.168.102.254

    PC3>
    PC4> ip dhcp
    DDORA IP 192.168.103.104/24 GW 192.168.103.254

    PC4>
    PC3, PC4 đã lấy được IP từ DHCP server

    DHCP_Server#show ip dhcp binding
    Bindings from all pools not associated with VRF:
    IP address          Client-ID/              Lease expiration        Type
                        Hardware address/
                        User name
    192.168.102.1       0100.5079.6668.03       Jun 07 2021 06:19 AM    Automatic
    192.168.103.104     0100.5079.6668.04       Jun 07 2021 06:16 AM    Automatic
    DHCP_Server#
    Các IP đã cấp cho DHCP client

    8. Trên Internet ạo Static route 125.234.102.240/29 trỏ về IP 200.1.1.2 của ISP-Router

    • Cấu hình:
    conf t
    ip route 125.234.102.240 255.255.255.248 200.1.1.2
    end
    wri

    • Kiểm tra:
    Internet#show ip route static
    Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
           D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
           N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
           E1 - OSPF external type 1, E2 - OSPF external type 2
           i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
           ia - IS-IS inter area, * - candidate default, U - per-user static route
           o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
           a - application route
           + - replicated route, % - next hop override

    Gateway of last resort is not set

          125.0.0.0/29 is subnetted, 1 subnets
    S        125.234.102.240 [1/0] via 200.1.1.2
    Internet#

    Khi chúng ta mua thêm các địa chỉ IP tĩnh thì ISP phải tạo route để trỏ về router bên của chúng ta


    9. Tạo các default route và thực hiện NAT trên overload trên Firewall đảm bảo tất cả các PC có thể ping được 8.8.8.8

    • Tạo default route:
    ISP-Router:
    conf t
    ip route 0.0.0.0 0.0.0.0 200.1.1.1
    end
    wri

    Firewall:
    conf t
    ip route 0.0.0.0 0.0.0.0 125.234.102.241
    end
    wri

    Core:
    conf t
    ip route 0.0.0.0 0.0.0.0 192.168.200.1
    end
    wri

    • NAT overload trên Firewall:
    conf t
    interface Ethernet0/1
    ip nat inside
    exit
    interface Ethernet0/2
    ip nat outside
    exit
    ip nat inside source list 1 interface Ethernet0/2 overload

    access-list 1 permit any
    access-list 1 deny   any

    end
    wri

    Đến đây các PC chưa thể ping đến được 8.8.8.8 vì: trên môi trường internet một gói tin được cho là thành công thì phải đảm bảo có 2 chiều đi và về. Nếu chúng ta chỉ có NAT không thì mới chỉ có chiều đi còn thiếu chiều về, nên trên Firewall chúng ta phải tạo route ngược (có thể dùng bất kỳ kỹ thuật route nào cũng được) về các IP trong LAN.

    conf t

    ip  route  192.168.100.0  255.255.255.0  192.168.200.2
    ip  route  192.168.101.0  255.255.255.0  192.168.200.2
    ip  route  192.168.102.0  255.255.255.0  192.168.200.2
    ip  route  192.168.103.0  255.255.255.0  192.168.200.2
    end
    wri

    • Kiểm tra:

    PC3> ping 8.8.8.8

    84 bytes from 8.8.8.8 icmp_seq=1 ttl=252 time=2.684 ms
    84 bytes from 8.8.8.8 icmp_seq=2 ttl=252 time=3.233 ms
    84 bytes from 8.8.8.8 icmp_seq=3 ttl=252 time=2.536 ms
    84 bytes from 8.8.8.8 icmp_seq=4 ttl=252 time=2.128 ms
    84 bytes from 8.8.8.8 icmp_seq=5 ttl=252 time=2.252 ms

    PC3>
    PC4> ping 8.8.8.8

    84 bytes from 8.8.8.8 icmp_seq=1 ttl=252 time=3.107 ms
    84 bytes from 8.8.8.8 icmp_seq=2 ttl=252 time=3.087 ms
    84 bytes from 8.8.8.8 icmp_seq=3 ttl=252 time=2.000 ms
    84 bytes from 8.8.8.8 icmp_seq=4 ttl=252 time=2.140 ms
    84 bytes from 8.8.8.8 icmp_seq=5 ttl=252 time=2.865 ms

    PC4>
    Các PC đã ra được internet

    • Kiểm tra bảng NAT trên Firewall:
    Firewall#show  ip nat translations
    Pro Inside global      Inside local       Outside local      Outside global
    icmp 125.234.102.243:13030 192.168.102.1:13030 8.8.8.8:13030 8.8.8.8:13030
    icmp 125.234.102.243:13286 192.168.102.1:13286 8.8.8.8:13286 8.8.8.8:13286
    icmp 125.234.102.243:13542 192.168.102.1:13542 8.8.8.8:13542 8.8.8.8:13542
    icmp 125.234.102.243:13798 192.168.102.1:13798 8.8.8.8:13798 8.8.8.8:13798
    icmp 125.234.102.243:14054 192.168.102.1:14054 8.8.8.8:14054 8.8.8.8:14054
    icmp 125.234.102.243:10470 192.168.103.104:10470 8.8.8.8:10470 8.8.8.8:10470
    icmp 125.234.102.243:10726 192.168.103.104:10726 8.8.8.8:10726 8.8.8.8:10726
    icmp 125.234.102.243:10982 192.168.103.104:10982 8.8.8.8:10982 8.8.8.8:10982
    icmp 125.234.102.243:11238 192.168.103.104:11238 8.8.8.8:11238 8.8.8.8:11238
    icmp 125.234.102.243:11494 192.168.103.104:11494 8.8.8.8:11494 8.8.8.8:11494
    Firewall#

    Vì các IP private (192.168.102.x và 192.168.103.x) không được định nghĩa trên môi trường internet nên chúng ta phải NAT để dịch từ IP private sang ip public (định nghĩa IP private và public ở rfc 1918)

    Quit Configuration
    Internet
    conf t
    hostname Internet
    
    interface Loopback8
    no shutdown
    ip address 8.8.8.8 255.0.0.0
    exit
    interface et0/0
    ip address 200.1.1.1 255.255.255.252
    no sh
    exit
    
    ip route 125.234.102.240 255.255.255.248 200.1.1.2
    end
    wri
    
    ISP-Router
    conf t
    hostname ISP-Router
    
    interface et0/0
    ip address 200.1.1.2 255.255.255.252
    no sh
    exit
    interface et0/1
    ip address 125.234.102.241 255.255.255.248
    exit
    
    ip route 0.0.0.0 0.0.0.0 200.1.1.1
    no sh
    end
    wri
    
    
    Firewall
    conf t
    hostname Firewall
    
    interface et0/2
    ip address 125.234.102.243 255.255.255.248
    no sh
    exit
    interface et0/1
    ip address 192.168.200.1 255.255.255.248
    no sh
    exit
    
    interface Ethernet0/1
    ip nat inside
    interface Ethernet0/2
    ip nat outside
    ip nat inside source list 1 interface Ethernet0/2 overload
    
    ip route 0.0.0.0 0.0.0.0 125.234.102.241
    
    ip route 192.168.100.0 255.255.255.0 192.168.200.2
    ip route 192.168.101.0 255.255.255.0 192.168.200.2
    ip route 192.168.102.0 255.255.255.0 192.168.200.2
    ip route 192.168.103.0 255.255.255.0 192.168.200.2
    
    access-list 1 permit any
    access-list 1 deny   any
    end
    wri
    
    
    Core
    conf t
    hostname Core
    
    interface Ethernet0/1
    no switchport
    ip address 192.168.200.2 255.255.255.248
    no sh
    exit
    
    vlan 100
    vlan 101
    vlan 102
    vlan 103
    vlan 500
    exit
    
    interface Ethernet0/0
    switchport mode access
    switchport access vlan 100
    exit
    
    interface Ethernet0/2
    switchport mode access
    switchport access vlan 500
    exit
    interface Ethernet0/3
    switchport mode access
    switchport access vlan 500
    exit
    
    interface Vlan100
    ip address 192.168.100.254 255.255.255.0
    exit
    interface Vlan101
    ip address 192.168.101.254 255.255.255.0
    ip helper-address 192.168.100.100
    exit
    interface Vlan102
    ip address 192.168.102.254 255.255.255.0
    ip helper-address 192.168.100.100
    exit
    interface Vlan103
    ip address 192.168.103.254 255.255.255.0
    ip helper-address 192.168.100.100
    exit
    
    interface Ethernet1/1
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    exit
    interface Ethernet1/2
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    exit
    
    ip route 0.0.0.0 0.0.0.0 192.168.200.1
    end
    wri
    
    DHCP-Server
    conf t
    hostname DHCP_Server
    int et0/0
    ip address 192.168.100.100 255.255.255.0
    no sh
    exit
    ip route 0.0.0.0 0.0.0.0 192.168.100.254
    
    ip dhcp pool vlan_101
    network 192.168.101.0 255.255.255.0
    dns-server 8.8.8.8
    default-router 192.168.101.254
    lease 0 0 10
    exit
    ip dhcp pool vlan_102
    network 192.168.102.0 255.255.255.0
    dns-server 8.8.8.8
    default-router 192.168.102.254
    lease 0 0 10
    exit
    ip dhcp pool vlan_103
    network 192.168.103.0 255.255.255.0
    dns-server 8.8.8.8
    default-router 192.168.103.254
    lease 0 0 10
    exit
    
    ip dhcp excluded-address 192.168.103.1 192.168.103.103
    ip dhcp excluded-address 192.168.103.254
    end 
    wri
    
    
    Acc01
    conf t
    hostname Acc01
    interface Ethernet0/0
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    exit
    interface Ethernet0/1
    switchport mode access
    switchport access vlan 101
    exit
    interface Ethernet0/2
    switchport mode access
    switchport access vlan 101
    end
    wri
    
    Acc02
    conf t
    hostname Acc02
    interface Ethernet0/0
    switchport trunk encapsulation dot1q
    switchport mode trunk
    switchport trunk allowed vlan all
    exit
    interface Ethernet0/2
    switchport mode access
    switchport access vlan 102
    exit
    interface Ethernet0/3
    switchport mode access
    switchport access vlan 103
    end
    wri
    

    10. Cấu hinh trên Core switch phải đảm bảo các PC trong LAN truy cập 8.8.8.8 phải đi đúng thứ tự Core -> Firewall -> ISP-Router -> Internet; tuy nhiên khi Firewall down các PC có thể truy cập được 8.8.8.8 theo thứ tự Core -> ISP-Router -> Internet

    • Kiểm tra trước khi cấu hình:
    PC1> tracer 8.8.8.8
    trace to 8.8.8.8, 8 hops max, press Ctrl+C to stop
     1   192.168.101.254   1.291 ms  1.047 ms  0.968 ms
     2   192.168.200.1   1.814 ms  1.523 ms  1.661 ms
     3   125.234.102.241   2.160 ms  2.112 ms  1.928 ms
     4   *200.1.1.1   2.586 ms (ICMP type:3, code:3, Destination port unreachable)  *

    PC1>
    Chúng ta thấy các gói tin đã đi đúng yêu cầu ban đầu: Core -> Firewall -> ISP-Router -> Internet

    • Cấu hình:
    Core:
    interface Vlan500
    ip address 125.234.102.242 255.255.255.248
    no shut
    exit

    ip route 0.0.0.0 0.0.0.0 125.234.102.241 10
    end
    wri

    ISP-Router:
    interface Ethernet0/0
    ip nat outside
    exit
    interface Ethernet0/1
    ip nat inside
    exit

    ip nat inside source list LAN-to-INTERNET interface Ethernet0/0 overload
    ip access-list extended LAN-to-INTERNET
    deny ip 125.234.102.240 0.0.0.7 any
    permit ip any any
    exit

    ip route 192.168.100.0 255.255.255.0 125.234.102.242
    ip route 192.168.101.0 255.255.255.0 125.234.102.242
    ip route 192.168.102.0 255.255.255.0 125.234.102.242
    ip route 192.168.103.0 255.255.255.0 125.234.102.242
    end
    wri

    • Giải thích access-list:
    deny ip 125.234.102.240 0.0.0.7 any: dãy IP 125.234.102.240/29 là IP public đã được định nghĩa trên internet nên không cần phải NAT
    - permit ip any any: tất cả các ip còn lại (trường hợp này là các IP trong LAN) là phải NAT

    • Kiểm tra sau khi cấu hình
    Trên switch core:
    shutdown port Et0/1 và ping test
    Core#ping 8.8.8.8
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
    Core#ping 8.8.8.8 source vlan 101
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
    Packet sent with a source address of 192.168.101.254
    !!!!!
    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
    Core#

    Trên PC1
    PC1> tracer 8.8.8.8
    trace to 8.8.8.8, 8 hops max, press Ctrl+C to stop
     1   192.168.101.254   1.016 ms  0.841 ms  0.948 ms
     2   125.234.102.241   1.687 ms  1.561 ms  1.470 ms
     3   *200.1.1.1   2.417 ms (ICMP type:3, code:3, Destination port unreachable)  *

    PC1>
    Đúng yêu cầu đặt ra Core -> ISP-Router -> Internet

    P/s: Đã đúng yêu cầu tuy nhiên chúng ta có thể làm thêm IP SLA Tracking để kiểm tra IP đầu xa, nếu ping đến không được thì sẽ tư động điều chỉnh bản route cho phù hợp


    11. IP SLA Tracking

    • Cấu hình:
    Core:
    ip sla 2001
    icmp-echo 192.168.200.1
    threshold 5
    frequency 10
    exit
    !
    ip sla schedule 2001 life forever start-time now
    !
    track 1 ip sla 2001 reachability
    exit
    !
    no ip route 0.0.0.0 0.0.0.0 192.168.200.1
    ip route 0.0.0.0 0.0.0.0 192.168.200.1 track 1
    end
    wri
    Xoá default route cũ và thêm vào default route với track

    • Kiểm tra:
    Kiểm tra sla đã cấu hình:
    Core:
    Core#show ip sla configuration 2001
    IP SLAs Infrastructure Engine-III
    Entry number: 2001
    Owner:
    Tag:
    Operation timeout (milliseconds): 5000
    Type of operation to perform: icmp-echo
    Target address/Source address: 192.168.200.1/0.0.0.0
    Type Of Service parameter: 0x0
    Request size (ARR data portion): 28
    Verify data: No
    Vrf Name:
    Schedule:
       Operation frequency (seconds): 10  (not considered if randomly scheduled)
       Next Scheduled Start Time: Start Time already passed
       Group Scheduled : FALSE
       Randomly Scheduled : FALSE
       Life (seconds): Forever
       Entry Ageout (seconds): never
       Recurring (Starting Everyday): FALSE
       Status of entry (SNMP RowStatus): Active
    Threshold (milliseconds): 5
    Distribution Statistics:
       Number of statistic hours kept: 2
       Number of statistic distribution buckets kept: 1
       Statistic distribution interval (milliseconds): 20
    Enhanced History:
    History Statistics:
       Number of history Lives kept: 0
       Number of history Buckets kept: 15
       History Filter Type: None


    Core#
    Core#show ip sla statistics
    IPSLAs Latest Operation Statistics

    IPSLA operation id: 2001
            Latest RTT: 1 milliseconds
    Latest operation start time: 08:18:23 EET Wed Jun 9 2021
    Latest operation return code: OK
    Number of successes: 31
    Number of failures: 6
    Operation time to live: Forever


    Core#

    Bật debug ip routing: để thấy sự thay đổi bảng route trong lúc test sla

    Core#debug ip routing
    IP routing debugging is on
    Core#
    Shutdown interface Et0/1
    Core:
    Core#conf t
    int et0/1
    shut
    Core(config-if)#
    *Jun  9 06:24:31.200: is_up: Ethernet0/1 0 state: 6 sub state: 1 line: 0
    *Jun  9 06:24:31.200: RT: interface Ethernet0/1 removed from routing table
    *Jun  9 06:24:31.200: RT: del 192.168.200.0 via 0.0.0.0, connected metric [0/0]
    *Jun  9 06:24:31.200: RT: delete subnet route to 192.168.200.0/29
    *Jun  9 06:24:31.200: RT: del 192.168.200.2 via 0.0.0.0, connected metric [0/0]
    *Jun  9 06:24:31.200: RT: delete subnet route to 192.168.200.2/32
    *Jun  9 06:24:31.200: RT: del 0.0.0.0 via 192.168.200.1, static metric [1/0]
    *Jun  9 06:24:31.200: RT: delete network route to 0.0.0.0/0
    *Jun  9 06:24:31.200: RT: default path has been cleared
    *Jun  9 06:24:31.200: RT:
    Core(config-if)#updating static 0.0.0.0/0 (0x0):
        via 125.234.102.241

    *Jun  9 06:24:31.200: RT: add 0.0.0.0/0 via 125.234.102.241, static metric [10/0]
    *Jun  9 06:24:31.200: RT: default path is now 0.0.0.0 via 125.234.102.241
    Core(config-if)#
    *Jun  9 06:24:33.194: %LINK-5-CHANGED: Interface Ethernet0/1, changed state to administratively down
    Core(config-if)#
    *Jun  9 06:24:33.194: is_up: Ethernet0/1 0 state: 6 sub state: 1 line: 0
    *Jun  9 06:24:34.199: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/1, changed state to down
    *Jun  9 06:24:34.199: is_up: Ethernet0/1 0 state: 6 sub state: 1 line: 0
    Core(config-if)#
    *Jun  9 06:24:36.256: %TRACKING-5-STATE: 1 ip sla 2001 reachability Up->Down
    Core(config-if)#

    Noted: Chúng ta thấy khi interface Et0/1 down thì sla 1 cũng down theo và chúng sẽ thực hiện xóa default route hiện tại và cập nhật default route mới sẽ trỏ về gateway 125.234.102.241

    Cấu hình căn bản

    Bài Lab nâng cao

    Xong!

    /*header slide*/