/*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 #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!

Juniper - Save And Transfer File Configuration With TFTP

Nên tham khảo bài TFTP trước khi xem bài này


NỘI DUNG:

1. Lưu Cấu Hình Hiện Tại Thành File Lên Switch

2. Copy File Config Từ Switch Đến TFTP

3. Copy File Từ TFTP Vào Switch

4. Backup Cấu Hình Tự Động


THỰC HIỆN:


1. Lưu Cấu Hình Hiện Tại Thành File Lên Switch

Commands Diễn Giải
configure Vào mode config
save 2021-04-27_IP127.246.cfg Thực hiện lưu cấu hình hiện tại vào file có tên 2021-04-27_IP127.246.cfg
exit Thoát khỏi mode config
file list Liệt kê/xem các file cấu hình mà mình tự lưu đã lưu trong thiết bị


2. Copy File Config Từ Switch Đến TFTP

Commands Diễn Giải
start shell Khởi động shell trên Junos
cd /var/home/admin Chuyển dấu nhắc lệnh vào đường dẫn /var/home/admin
ls Liệt kê (nhằm mục đích chọn file để copy) các file có trong đường dẫn /var/home/admin
tftp Khởi động tftp client trên switch
connect 125.234.103.242 Kết nối đến TFTP server có địa chỉ IP là 125.234.103.242
put 2021-04-27_IP127.246.cfg Đẩy file 2021-04-27_IP127.246.cfg (là file vừa tạo ra ở phần 1) lên TFTP server
^D% Nhấn phím Ctrl + D để disconnect khỏi TFTP server
exit Thoát chế độ shell trên switch


Chúng ta cũng có thể copy các file cấu hình hiện tại trên switch lên TFTP

Commands/File List Diễn Giải
file list /config/ Hiển thị các file config của switch
juniper.conf.gz Là file cấu hình đang active trên switch
juniper.conf.1.gz Nếu chúng ta rollback thì nội dung của file juniper.conf.gz sẽ được thay bằng nội dung của file juniper.conf.1.gz


3. Copy File Từ TFTP Vào Switch

Commands Diễn Giải
start shell Khởi động shell trên Junos
tftp 125.234.103.242 Kết nối vào tftp có địa chỉ ip tftp 125.234.103.242
get 2021-04-27_IP127.246.cfg.txt Copy file 2021-04-27_IP127.246.cfg.txt từ TFTP về switch
quit Disconnect khỏi TFTP server
exit Thoát chế độ shell trên switch



4. Backup Cấu Hình Tự Động

Juniper cho phép sao lưu cấu hình tự động thông qua FTP, HTTP, SCP sau mỗi lần chúng ta lưu cấu hình (commit). Tên file tạo ra theo định dạng là hostname+time

    system {

              archival {

                  configuration {

                          transfer-on-commit;

                          archive-sites {

                                  "ftp://username@<IP address of FTP server>" password <password>;

                                  }

                          }

               }

     }


Xong!

Using Commands Cat, Head, Tail, Less & More In Linux/Ubuntu/CentOS

Mục Lục:

1. Lệnh Cat
2. Lệnh Head
3. Lệnh Tail
4. Lệnh Less
5. Lệnh More

Nội Dung:

1. Lệnh Cat: Dùng để đọc, và xem nội dung của file

Command Giải Thích
cat /etc/passwd Hiển thị nội dung file passwd
cat -n /etc/passwd Hiển thị số dòng và nội dung file passwd
cat file1.txt file2.txt Nối nội dung file1.txt, file2.txt và hiển thị ra màn hình
cat file1.txt file2.txt > file12.txt Nội dung của file1.txt và file2.txt sẽ được copy vào file12.txt
cat file1.txt >> file12.txt Nếu file12.txt có nội dung rồi thì nội dung file1.txt sẽ được chèn vào dưới của nội dung file12.txt
cat > file.txt Tạo ra file.txt và nội dung cho phép nhập từ bàn phím. Nhấn Ctrl + D để kết nhập dữ liệu

2. Lệnh Head: Hiển thị các dòng đầu tiên của file, mặc định hiển thị 10 dòng đầu tiên, tuy nhiên chúng ta có thể tùy chọn thay đổi các tham biến được 

Command Giải Thích
head /etc/passwd Hiển thị 10 dòng đầu tiên của file passwd
head -5 /etc/passwd Hiển thị 5 dòng đầu tiên của file passwd
head -v /etc/passwd Hiển thị 10 dòng đầu tiên của file passwd và có hiển thị tiêu đề
head -c 20 /etc/passwd Hiển thị ra 20 byte(20 ký tự) đầu tiên của file

3. Lệnh Tail: Tương tự head, tuy nhiên tail hiển thị các dòng cuối cùng của file.

Command Giải Thích
tail -5 /etc/passwd Hiển thị 5 dòng cuối cùng của file passwd
tail -c 20 /etc/passwd Hiển thị ra 20 byte(20 ký tự) cuối của file
tail -f logfile.txt Hiển thị 10 dòng cuối cùng của file. Thường áp dụng để xem các file log của hệ thống, nhấn Crtl + C để thoát.

4. Lệnh Less: Với các file lớn nếu dùng lệnh cat để xem nội dung thì tốt rất nhiều bộ nhớ sẽ làm ảnh hưởng đến hệ thống. Với less giúp chúng ta xem 1 phần nội dung của file và chúng ta có thể chuyển chuyển lên xuống để xem nội dung toàn bộ file.

Cú pháp:

less  /etc/passwd

Các file thường sử dụng trong lệnh less:

  • Space: Hiển thị nội dung trang kế tiếp (trang dưới)
  • b: Hiển thị nội dung trang trên
  • G: Hiển thị trang cuối cùng
  • g: Hiển thị trang đầu tiên
  • /{chuỗi cần tìm}: Tìm kiếm nội dung
  • ?{chuỗi cần tìm}: Tìm kiếm nội dung
  • v: Cho phép chỉnh sửa nội dung file hiện tại
  • q: Thoát 


5. Lệnh More: Dùng để mở file và tương tác, tuy nhiên với lệnh more chúng ta KHÔNG thể cuộn lên trang trước như less.

Cú pháp: 

more  /etc/passwd


Xong!

Juniper - Clearing IDLE TTY Sessions in Junos



Khi có nhiều kết nối đồng thời đến thiết bị bạn có thể ngắt kết nối của user mà bạn muốn.

Hiển thị các session hiện tại đang kết nối trên switch bằng lệnh:
run show system users no-resolve




chúng ta có thể clear TTY sesion, ví dụ clear TTY có tên là u0 thi thực hiện bằng lệnh:

run request system logout terminal u0


Kiểm tra lại thì không session u0 đã được ngắt kết nối.


AWK Command In Linux/Ubuntu/CentOS

Command Giải Thích Kết Quả
echo "Linux commands" | awk '{$2="DONG LENH";print $0}' Thay đổi nội dung của cột thứ 2 của chuỗi "Linux command" trong lệnh echo thành "DONG LENH" và in toàn bộ nội của chuỗi sau khi thay đổi Linux DONG LENH
echo 'foo:123:bar:456' | awk -F: '{print $2}' In ra cột thứ 2 trong chuổi 'foo:123:bar:456' (F: có nghĩa căn cứ vào dấu ":" để tách cột). 123
echo 'foo:123:bar:456' | awk -F: '{print $NF}' In ra cột cuối cùng 456
echo 'foo:123:bar:456' | awk -F: '{print $(NF-1)}' IN ra cột trước cột cuối cùng 1 cột bar
awk '{print}' file.txt In toàn bộ nội dung của file.txt
awk '{print $2}' file.txt In ra nội dung của cột thứ 2 trong file.txt
awk -F: '{print $1}' /etc/passwd In ra nội dung của cột thứ nhất trong file passwd
awk '$2 > 300' file.txt In ra nội dung của dòng đó nếu giá trị của cột thứ 2 > 300
awk '{if($2 > 300) print $0 }' file.txt In ra cả dòng nếu giá trị của cột thứ 2 lớn hơn 300
awk '{if($2 > 300) print $2 }' file.txt In ra giá trị của cột thứ 2 nếu giá trị đó lớn hơn 300

Xong!
/*header slide*/