Today Key :  AWS, VPC, Cloud, Network, Peering, region, 접속, 피어링


 이번 포스팅은 VPC 간의 연동을 해주는 VPC Peering에 대한 정리입니다.

 실제 VPC Peering을 연동하는 예제는 포스팅용으로 이미지를 정리해야해서.. 다음 포스팅에서 다뤄집니다. ^^

 혹시 수정이 필요한 내용이나, 보완해야 될 내용이 있으면 덧글로 남겨주세요! 



VPC Peering 

 · VPC 간의 인터넷을 통하지 않고 직접 통신 할 수 있도록 연결하는 기술

 · AWS 내에서 정의하는 정의하는 가상의 네트워크인 VPC는 논리적으로 독립적인 네트워크 망을 선언한 것이기 때문에

   기본적으로 VPC 간에는 서로 통신이 불가하여 VPC 간에 서로 영향을 미치지 않음.

 · VPC 간에 서로 통신을 하기 위해서는 VPC 내에서 인터넷을 통해서 다른 VPC로의 통신을 하는 구조였음.

 · 2014년에 VPC Peering 이라는 기술을 통해서 같은 리전 간의 VPC 네트워크를 서로 연결 할 수 있게 됨.

 · 2017년에 멀리 Region 간의 VPC Peering을 지원하도록 함.

 · 서울 Region에서의 VPC Peering은 2018년 중반부터 지원

 

 

VPC Peering 구성

 · 동일 Region 간의 Peering 예

 

 

  · 멀리 Region 간의 Peering 예

 

 

   · 공유 서비스를 이용하는 VPC Peering 예

 

 

VPC Peering 구성 관련

 · VPC Peering으로 연결 시에 VPC 간의 네트워크 대역이 겹치지 않도록 설계해야 함.

  · VPC Peering을 이용하면 Peering 된 VPC 네트워크은 AWS 백본을 통해서 통신하여 Pulbic 인터넷 망을 통과하지

   않기 때문에   보안적으로 보다 우수함.

   또한 내부 백본 네트워크를 통하기 때문에 이중화나 네트워크 병목에 대한 이슈도 없음.

 · VPC Peering은 단일 계정으로도 가능하며, 서로 다른 계정 간의 VPC Peering 구성도 가능

 

 VPC Peering 제한

· 멀티 Region 간의 VPC Peering 시에는 security group 참조 지원 안 함.

· 멀티 Region 간의 VPC Peering 시에는 DNS resolution 지원 안 함.

· IPv6와 Jumbo 프레임 지원 안 함.

·  VPC Peering을 통해서 외부 혹은 다른 VPC에서 VPC를 통해서 또 다른 VPC로 접근하는 Transit 기능은 지원하지 않음.

 

 

 

 

Posted by 네떡지기

 

Today Key :  AWS, VPC, Cloud, Network, region, subnet, CIDR, AZ


 Last Updated : 18.11.28



AWS VPC

 · AWS 내에서 정의하는 가상의 네트워크 환경 (논리적인 네트워크 구성)

 · 사내망(On-Promise)과 VPN이나 Direct Connect와 같은 서비스를 이용하여 연결 가능

 · VPC 내에는 Public 서브넷과 Private 서브넷을 구성 할 수 있음.

 

 

VPC 특징

 · VPC는 하나의 region 속함.

 · Region 내의 AZ 간에는 VPC를 같이 사용 가능.

 · 네트워크 주소와 라우팅을 직접 설정

 · 복수의 region 사용 시에는 네트워크 주소 설계 고려

 · VPC 생성 시 VPC에 속하는 하나의 CIDR을 생성

       - 최대 네트워크 : 16bit /  최소 네트워크 : 28bit

 · VPC 내에서 사용 할 서브넷은 추가로 설정해야 하고

  서브넷은 VPCCIDR 내에 속해야 하기 때문에 서브넷 크기를 고려하여 CIDR 크기를 결정해야 함.

 · VPC 생성 시에 만든 CIDR 은 변경이 불가능하기 때문에 초기 생성 시에 향후 만들어질 설계 방안을 고려해서 CIDR을 디자인해야 함. 

 · VPCCIDR 생성 시에는 사설 IP 대역을 사용 할 것을 권장

       - 10.0.0.0/8 , 172.16.0.0/12, 192.168.0.0/16

 · VPCCIDR은 생성 이후 변경이 불가하기 때문에 Region, On-Premise과의 연동을 고려하여 IP 중복이 되지 않도록 설계 필요.

 · VPC의 CIDR에서의 IP 중복은 On-Premise 뿐 아니라, 나중에 다뤄질 VPC 간의 연결을 하는 VPC Peering도 고려하여 
   각 VPC 간의 네트워크 대역도 중복되지 않도록 설계해야 함.

 · VPC 생성 시 입력이 필요한 항목

       - Name tag

       - CIDR block  : VPC에서 사용 할 네트워크 대역 선언

       - Tenancy  : 전용 물리 하드웨어를 사용 할 것인지에 대한 옵션

 · VPC 네트워크는 기본 설정으로는 폐쇄망 구성이기 때문에 외부와 통신 불가

 · VPC가 외부 네트워크와 통신하기 위해서는 Internet-Gateways가 필요

 · 하나의 VPC 내에 속한 서브넷은 Local Router를 통해서 서로 통신이 가능.

 

 

서브넷 특징

 · 하나의 VPC 내의 하나의 AZ에 속함 (AZ 간에는 서브넷이 다름)

 · 서브넷 생성 시 입력이 필요한 항목

      - Name tag

      - VPC

      - Availability Zone

      - CIDR block

 · VPC에 속하는 네트워크(CIDR)로 설정해야 하며, 해당 네트워크를 벗어나면  오류 발생(생성 불가)

 · 서브넷 설 정 시에 1~3번은 다음과 같은 목적으로 사용되기 때문에 사용 불가(네트워크 주소 및 브로드캐스트 주소 제외)

      - 1 : VPC 라우터용

      - 2 : AWS에서 예약한 DNS 주소

      - 3 : AWS에서 예약(향후 사용)

 

 

 

 


Posted by 네떡지기
DevOps/Programmability2018.03.30 13:30

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 제가 진행한 세션과 관련된 내용입니다.

이번 행사에서는  [예제로 보는 '네트워크 엔지니어를 위한 Python 101'] 이라는 주제로 세션을 하였고

세션 시간에 사용된 간단한 예제에 대해서 코드를 공유합니다.

코드에 대한 내용은 세션 시간에 다루었기 때문에 자세한 설명은 생략합니다.

그리고 본 예제에 사용된 코드는 완성형 코드는 아닙니다.

우선 대표적인 예가 예외처리가 전혀 없습니다. (기본 라이브러리에서 제공되는 부분 제외)

아래의 코드들은 처음 접근을 어렵게 생각하시는 분들을 위해서 최대한 쉽게 접근할 수 있을 정도로 짧게 짧게 만들었으며

이후에 아래의 코드들을 조금씩 변형해가면서 본인만의 코드를 만들어보면 좋을 것 같습니다.

 

예제 1) 장비 접속 및 기본 명령어 수행 및 실행

from netmiko import ConnectHandler

arista= {
    'device_type': 'arista_eos',
    'ip':   'device',
    'username': 'admin',
    'password': 'admin',
    'port' : 2222,          # 기본 값이 22포트를 사용할 경우에는 사용하지 않아도 무방


net_connect = ConnectHandler(**arista)

output = net_connect.send_command('show int desc')
print(output)

 ○ 세션 시에 IP를 숨기기 위해서 'device'라는 이름으로 사용을 하였으며, 실제로는 해당 위치에 IP가 들어가면 됩니다

   단,IP 값은 문자열이기 때문에 ' ' 혹은 " "를 사용해야 합니다.

   문자열이기 때문에 도메인 값으로 대체해도 무방합니다

 

예제 2-1) 장비 접속 및 기본 명령어 수행 및 실행

from netmiko import ConnectHandler
import device

print("Connecting....")
nwnode = ConnectHandler(**device.ARI)
shver = nwnode.send_command("show ver")
print(shver)

예제 2-2) 장비 접속 및 기본 명령어 수행 및 실행  (device.py)

ariuser='admin'
aripwd='admin'
dv='arista_eos'

ARI={'device_type':dv,'verbose':False,'username':ariuser,'password':aripwd,'ip':'device','port':2222} 

 ○ 장비 인벤토리 정보를 기능을 수행할 코드와 별도로 분리한 예제입니다.

    예제 1과 동일하지만, 단순히 인벤토리를 분리한 내용입니다

    인벤토리 정보는 py코드를 사용할 수도 있지만, 별도의 파일로 관리해서 관리도 가능할 수 있습니다.

 

예제 3-1) 장비 인터페이스 상태 출력  

shstatus ='''
Port    Name               Status       Vlan       Duplex Speed Type
Fa1/0   ZIGI-SVR0          notconnect   1            auto    auto 10/100BaseTX
Fa1/1   ZIGI-SVR1          notconnect   1            auto    auto 10/100BaseTX
Fa1/2   ZIGI-SVR2          notconnect   1            auto    auto 10/100BaseTX
Fa1/3   ZIGI-SVR3          connected   1            auto    auto 10/100BaseTX
Fa1/4   ZIGI-SVR4          notconnect   1            auto    auto 10/100BaseTX
Fa1/5   ZIGI-SVR5          notconnect   1            auto    auto 10/100BaseTX
Fa1/6   ZIGI-SVR6          connected   1            auto    auto 10/100BaseTX
Fa1/7   ZIGI-SVR7          notconnect   1            auto    auto 10/100BaseTX
Fa1/8   ZIGI-SVR8          notconnect   1            auto    auto 10/100BaseTX
Fa1/9   ZIGI-SVR9          notconnect   1            auto    auto 10/100BaseTX
Fa1/10  ZIGI-SVR10         connected   1            auto    auto 10/100BaseTX
Fa1/11  ZIGI-SVR11         notconnect   1            auto    auto 10/100BaseTX
Fa1/12  ZIGI-SVR12         notconnect   1            auto    auto 10/100BaseTX
Fa1/13  ZIGI-SVR13         notconnect   1            auto    auto 10/100BaseTX
Fa1/14  ZIGI-SVR14         notconnect   1            auto    auto 10/100BaseTX
Fa1/15  ZIGI-SVR15         notconnect   1            auto    auto 10/100BaseTX

'''

status = shstatus.split('\n')

for op in status:
    print(op)
 

○ 장비 인터페이스 정보를 출력하는 예제입니다.  

   이번 예제는 실제 장비를 접속한 것이 아니라, 장비에 접속하여 인터페이스 정보 가져온 내용을 출력하는 부분입니다.

   장비 정보를 가져오게 되면, 하나의 길 문자열로 되어 있는 데 이를 가공하는 방법에 대한 예제이며

   이 예제에서는 결과 값을 각 Line 단위로 쪼개는 함수(split)를 사용하여 정보 Line 단위로 저장하고

   저장된 값을 하나씩 가져와서 출력합니다.

 

예제 3-2) 장비 인터페이스 상태 출력 

shstatus ='''
Port    Name               Status       Vlan       Duplex Speed Type
Fa1/0   ZIGI-SVR0          notconnect   1            auto    auto 10/100BaseTX
Fa1/1   ZIGI-SVR1          notconnect   1            auto    auto 10/100BaseTX
Fa1/2   ZIGI-SVR2          notconnect   1            auto    auto 10/100BaseTX
Fa1/3   ZIGI-SVR3          connected   1            auto    auto 10/100BaseTX
Fa1/4   ZIGI-SVR4          notconnect   1            auto    auto 10/100BaseTX
Fa1/5   ZIGI-SVR5          notconnect   1            auto    auto 10/100BaseTX
Fa1/6   ZIGI-SVR6          connected   1            auto    auto 10/100BaseTX
Fa1/7   ZIGI-SVR7          notconnect   1            auto    auto 10/100BaseTX
Fa1/8   ZIGI-SVR8          notconnect   1            auto    auto 10/100BaseTX
Fa1/9   ZIGI-SVR9          notconnect   1            auto    auto 10/100BaseTX
Fa1/10  ZIGI-SVR10         connected   1            auto    auto 10/100BaseTX
Fa1/11  ZIGI-SVR11         notconnect   1            auto    auto 10/100BaseTX
Fa1/12  ZIGI-SVR12         notconnect   1            auto    auto 10/100BaseTX
Fa1/13  ZIGI-SVR13         notconnect   1            auto    auto 10/100BaseTX
Fa1/14  ZIGI-SVR14         notconnect   1            auto    auto 10/100BaseTX
Fa1/15  ZIGI-SVR15         notconnect   1            auto    auto 10/100BaseTX

'''

status = shstatus.split('\n')

for op in status:
    if(op.find('connected') > 0):
        print(op.split()[0]) 

○ 장비 인터페이스 정보를 출력하는 예제의 변형입니다.

    각 Line별로 가져온 값에서 현재 연결된 인터페이스 정보만을 출력하기 위해서 'connected'라는 값을 찾아서

    'connected'된 인터페이스만을 출력합니다.

 

 

 

예제 4-1) 장비 Uptime 출력 

shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"
uptime = shverinc.split(" uptime is ")
print(uptime)

 

예제 4-2) 장비 Uptime 출력 

shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"

uptime = shverinc.split(" uptime is ")
print("Device Host : {0}\t\tUptime : {1}".format(uptime[0],uptime[1]))

 ○ 장비 Uptime을 출력하는 예제입니다.

    출력된 값은 기본적으로 가져온 값을 어느 정도 수준까지 가공해서 사용할 것인지에 대한 부분입니다.

 

예제 5) 장비 Mac-address 정보 출력

shmac = '''VDX# show mac-address-table
VlanId   Mac-address       Type     State        Ports
41       0000.0000.fe00    Dynamic  Active       Te 1/5/1
41       0000.0000.fe01    Dynamic  Remote       Te 2/5/1
41       001c.7f63.950f    Dynamic  Active       Te 1/5/1
41       02e0.52b2.f50d    System   Active       XX 1/X/X
41       c4f5.7c18.3962    System   Remote       XX 2/X/X
43       0000.0000.fe00    Dynamic  Active       Po 3
43       0000.0000.fe01    Dynamic  Active       Po 4
43       001c.7f63.7efc    Dynamic  Active       Po 4
43       001c.7f69.7b76    Dynamic  Active       Po 3
43       02e0.52c3.940e    System   Active       XX 1/X/X
43       c4f5.7c18.3962    System   Remote       XX 2/X/X
701      0050.5686.049e    Dynamic  Remote       Te 15/0/14
701      0050.5686.09d9    Dynamic  Remote       Te 15/0/19
701      0050.5686.123f    Dynamic  Remote       Te 15/0/4
701      0050.5686.1384    Dynamic  Remote       Te 15/0/15
701      0050.5686.1647    Dynamic  Remote       Te 15/0/18
701      0050.5686.44ff    Dynamic  Remote       Te 15/0/6
701      0050.5686.4614    Dynamic  Remote       Te 15/0/9
701      0050.5686.6265    Dynamic  Remote       Te 15/0/8
701      0050.5686.7078    Dynamic  Remote       Te 15/0/3'''

mactables = shmac.split('\n')
macinfos = []
for mactb in mactables:
    if((mactb.lower().find(' te'))>0):
        macinfos.append(mactb)

for macinfo in macinfos:
    macinfo=macinfo.split()
    print("MAC : {0} \t Interface : Te {1}".format(macinfo[1],macinfo[5]))

○ 장비의 Local Mac Address 정보를 출력하는 내용입니다.

   

 

예제 6) 파일 입출력해보기 

zigifile = open("zigi.txt",'w')
zigifile.write("zigispace.net")
zigifile.close()

zigifile2 = open('zigi.txt','r')
zigi = zigifile2.read()
zigifile2.close()
print (zigi)

○ 초간단 파일 입출력 예제입니다.

예제 7) 장비 정보 가져온 후, 파일로 만들기

from netmiko import ConnectHandler
import device

print("Connecting....")
nwnode = ConnectHandler(**device.ARI)
shver = nwnode.send_command("show ver")

zigifile = open('zigi.txt','w')
zigifile.write(shver)
zigifile.close() 

○ 장비의 정보를 가져와서, 해당 값을 파일로 만드는 예제입니다.

Posted by 네떡지기
DevOps/Programmability2018.02.07 08:02

안녕하세요.

이번 포스팅은 Programmability for Networker의 25번째 포스팅입니다.

ACI Cobra를 이용하여 Port Channel 혹은 vPC Profile을 만들어주는 코드에 대해서 공유합니다.

세부적인 코드 설명은 포함되어 있지는 않지만, 현업에서 아래의 코드를 사용한다면

보다 쉽고, 빠르게 Profile을 만드실 수 있을겁니다.

이번 코드는  운영 중인 커뮤니티에서 진행된  '제 22회 네트워크 전문가 따라잡기 'N.EX.T''에서 발표하였던 코드이기도 합니다.

(정리해서 올리기로 하고.. 1년 가까이가 지났네요. ^^)

 

물론 포스팅 설명에 앞서서 한가지 미리 얘기를 드리면,

'왜 Port Channel이나 vPC Profile을 대량을 으로 만들어야 하지?' 라고 생각하실 수 있습니다.

ACI에 대한 포스팅을 준비만 하면서 계속하지 못하고 있어서 다루지 못한 부분이기는 하지만..

이 부분은 ACI를 어떻게 설계해서 사용하느냐에 따라서 많아질 수도.. 혹은 적어질 수도 있을 것이라고 생각합니다.

(물론 개인적인 생각은 최적화 된 Profile로 설계해서 사용한다면 그리 많지 않은 Profile로 모두 수용이 가능합니다.)

 

그럼 이제 본 내용을 시작합니다.

 


 

ACI에서 기본적으로 제공되는 APIC GUI에서 Click! Click을 이용해서 설정하는 방법 이외에

 

일괄적으로 대량을 설정을 하기 위해서는

JSON이나, XML 포맷의 파일을 미리 만들어 POST 하여 설정을 하거나,

ACI에서 제공되는 API를 이용해서 코드로 설정하는 방법이 있을 것입니다.  (CLI를 제외하고..)

 

하지만, 오늘 다룰 내용인 Interface Policies 항목에서는 POST를 할 수 있는 메뉴가 없습니다.

최상단의 Interface Policies에도 없고요.

 

 

 

 

 

 

하단의 Policy Groups에도 없습니다.

 

 

 

물론 그 하단인 Leaf Policy Groups에도 없습니다.

 

 

그래서 PC Profile이나 vPC Profile을 생성하기 위해서 ACI SDK인 Cobra를 이용하여 Port Channel이나 vPC Profile을 만들려고 합니다.

 

다음은 Port Channel이나 vPC Profile을 만드는 코드입니다.

 

 

위의 코드 이외에 Port Channel 혹은 vPC Profile의 이름이 선언된 info.txt라는 파일이 있어야 합니다.

info.txt에는 단순히 Profile에 사용할 이름만 한 줄씩 나열합니다.

 

그러면 info 파일에서 한 줄씩 읽어서 해당 이름으로 Profile을 생성하게 됩니다.

코드 본문에 있는 AEP 변수에서 사용하실 AEP 이름을 수정하시고

Port Channel을 사용할지, vPC를 사용할지에 따라서 AccBndlGrp 메서드 호출 시에 lagT에 대해서

 

Port Channel은 'link'로 설정하시고, vPC의 경우에는 'node'로 설정하시면 됩니다.

 

위의 코드에서는 Link Level Policy, Port Channel Policy, Attach Entity Profile에 대한 속성만 설정하였지만,

기타 그 밖의 설정을 추가할 수도 있습니다.

 

혹시라도 대량으로 PC, vPC Profile을 설정하셔야 하는 경우에 이 코드를 사용하시면 조금은 쉽게 설정이 가능하실 겁니다.

물론 자동화의 장점은 설정에 대한 편의성도 있지만, 잘못된 설정으로 인한 휴먼에러의 방지도 가능할 것입니다.

 

참고로, 위의 코드에서는 설정 시의 기본 예외처리만 만들었으며

기타 다른 상황에 대한 세부 예외 처리가 되어 있지 않기 때문에 더 보완해서 사용해보시는 것도 좋을 것 같습니다.

 

 

Posted by 네떡지기
분류없음2018.01.02 09:47

 

Today Key : Server, Network, Check, 서버, 네트워크, 확인, 체크, 명령어, command, ping, tcping, tracert, tcproute


이번 포스팅은 서버에서의 네트워크를 확인하기 위한 몇 가지 명령에 대해서 알아 보겠습니다.

 

이번 포스팅에서 다뤄지는 내용은 서버를 네트워크에 연결하는

초기 구성 시에  서버의 네트워크 설정이 잘 되었는지 확인 하기 위해서 사용하기도 하지만,

갑자기 서버가 정상적으로 통신이 되지 않거나 서비스가 정상적으로 제공 되지 않는 문제가 발생 할 경우에  더 유용하게 사용될 수 있습니다.

 

이번 포스팅에서는 윈도우에서 사용 가능한 명령에 대해서 살펴보지만,

실제 리눅스에서도 거의 동일하게 사용이 가능합니다.

향후 포스팅에서는 리눅스에서의 사용 방법이나, 아래의 명령어 이외에 추가적인 네트워크 확인을 위한 명령에 대해서 살펴보도록 하겠습니다.


 

Ping

네트워크 상태를 확인하는 데, 가장 많이 사용되는 명령어이며 또한

네트워크 엔지니어나 서버 엔지니어에게나 모두 익숙한 명령입니다.

Ping은 IP 네트워크를 통해서 목적지까지 정상적으로 네트워크가 잘 도달하는지를 확인 할 수 있습니다.

 

 ping [옵션] 목적지_IP주소

 

ping에서 사용되는 주요 옵션은 다음과 같습니다.

주요 옵션

리눅스

-n count

Ping을 보내는 패킷(ECHO_REQUEST) 을 몇 번 보내고 종료할 것인지를 지정.

기본 설정은 4회 전송

-t

중지될 때가지 지정한 호스토로 지속적으로 ping 전송..

-S srcaddr

사용할 원본 IP주소로, 리눅스의 –I 옵션과 동일

-size

패킷 크기를 지정. 기본 설정 값은 32바이트

-r count

count 홉의 경로를 기록(최대 9홉까지 설정 가능)

 

 

 

tcping

ping이 목적지까지의 네트워크가 정상적으로 도달하는지 주로 사용하는 명령어이지만,

실제 목적지까지 가는 경로 상에서는 ping에 대해서 보안장비에서 차단하는 경우가 있습니다. 

가장 대표적인 예를 들면, ping naver.com 을 하게 되면 다음과 같은 결과를 확인할 수 있습니다.  

따라서, 목적지까지 정상적으로 서비스가 되는지 확인하기 위해서는 단순히 ping이 아니라

실제 서비스 포트까지도 고려해서 테스트 해야 하는 경우가 있을 수 있습니다.

이럴 때 사용할 수 있는 것이 tcping 입니다.

tcp의 서비스 포트를 사용해서 테스트를 하는 것으로 실제 목적지까지의 서비스가 정상적으로 열리는지를 확인 할 수 있습니다.

실행 결과는 다음과 같이 볼 수 있습니다.

 

tcping의 사용 방법은 일반 ping의 사용법과 동일합니다.

 tcping [옵션] 목적지_IP주소

 

tcping에서 사용되는 주요 옵션은 다음과 같습니다.

주요 옵션

윈도우

-n count

tcping을 전송하는 횟수 (기본 5)

-t

중지될 때가지 지정한 호스토로 지속적으로 ping 전송..

-i interval

tcping을 전송하는 시간 간격

serverport

tcping으로 확인하고자 하는 서비스 포트이며, 미 설정 시에 80이 기본 값

 

* tcping은 기본 윈도우 프로그램이 아니기 때문에 아래의 사이트에서 다운받아서 사용할 수 있습니다.

      https://elifulkerson.com/projects/tcping.php

 

 

 

tracert

 

ping은 네트워크 상태를 확인하는 데, 가장 많이 활용되지만 그만큼 많이 사용되는 명령어가 tracert입니다.

ping 출발지부터 목적지까지의 통신이 되는지 단순히 체크만 한다면, tracert는 출발지부터 목적지까지의 통신이 되는지에 대한 체크를

통과하는 중간 경로를 출력해서 확인하게 됩니다.

 

tracert는 IP 헤더의 TTL(Time To Live) 필드를 이용합니다.

TTL을 1부터 1씩 증가시키면서 목적지에 도달 할 때까지 반복해서 패킷을 전송하면서 경로를 추적하게 됩니다.

네트워크 구간에서 라우터 장비를 하나 지날 때 마다 패킷의 TTL 값이 1씩 줄어들게 되고,

TTL 이 0이 되는 순간 해당 라우터에서 이 패킷을 드랍시키고

패킷 드랍의 이유를 출발지 단말에 icmp 메시지를 이용해서 알려주게 됩니다.

 TTL이 1인 경우에는 1홉까지의 장비로 전달이 되고, TTL이 0으로 만료가 되면서

해당 장비는 ‘ICMP time exceed’ 메시지를 출발지로 전달하게 됩니다.

tracert는 이 메시지를 전달한 장비의 IP를 출력하는 과정을 반복하면서 경로를 추적하는 작업을 하게 됩니다

tracert의 사용법은 다음과 같습니다 .

 tracert [옵션] 목적지_IP주소

 

tracert에서 사용되는 주요 옵션은 다음과 같습니다

주요 옵션

리눅스

-d

IP 주소를 도메인이 아닌 숫자 형식으로 표시(도메인 리졸브 미 수행)

-h maximum_hops

대상 검색을 위한 최대 홉 수

 

 

tcproute

tcproute는 이름에서 대충 감을 잡을 수 있듯이, tracert의 tcp 버전입니다.

마치 앞에서 알아본 ping에 대한 tcping 과 같은 명령어입니다.

tracert를 통해서 출발지부터 목적지까지의 경로를 체크하는 것을 서비스 포트를 이용해서 체크하는 방법입니다.

사용하는 방법은 tracert와 동일하며, 서비스 포트를 별도로 지정하는 등의 옵션을 사용할 수 있습니다 .

 tcproute [옵션] 목적지_IP주소          

tcproute 에서 사용되는 주요 옵션은 다음과 같습니다 

주요 옵션

리눅스

-p PORT

목적지 서비스 포트 지정

-d

IP 주소를 도메인이 아닌 숫자 형식으로 표시(도메인 리졸브 미 수행)

-i INT#

특정 인터페이스로 출발지 인터페이스를 지정

해당 옵션 미 사용 시에는, 명령 실행 시 인터페이스를 선택하게 됨.

--http

HTTP request를 보내서 접속 확인

* tcping과 마찬가지로 tcproute도 기본 윈도우 프로그램이 아니기 때문에 아래의 사이트에서 다운받아서 사용할 수 있습니다.

https://www.elifulkerson.com/projects/tcproute.php

 

 



Posted by 네떡지기
분류없음2017.06.16 20:02

Today Keys : Programmable, config, 프로그래머블, 백업, netmiko, programmability, networker, network


 이번 포스팅은 다시 시작하는 Programmability for Networker의 23번째 포스팅입니다. 

 이번 내용은 장비의 Configuration을 백업해주는 코드입니다.  

 주기적으로 반복해서 수행되는 장비 백업 작업에 대해서 손쉽게 코드로 해결해 줄 수 있습니다. 

 이 포스팅에서는 앞 포스팅에서 소개한 netmiko 라이브러리를 사용하였고, Cisco 장비에 대해서만 진행했습니다.

 하지만 유사한 방식으로 다른 장비들도 손쉽게 구현이 가능할 것입니다.

 netmiko에서 지원되는 다양한 네트워크 장비들도 거의 동일한 방법으로 구현이 가능합니다. 

 물론 멀티벤더에 대한 부분들도 코드를 나눠서도 할 수 있겠지만, 하나의 코드에서 장비 벤더를 구분해서 코드를 

 실행하도록 할 수도 있을 것입니다. 

 하지만, 우선 시작하는 단계에서는 조금 더 쉽고 최대한 코드를 나눠서 연습해가며 진행을 하신다면 좋을 것 같습니다.

 



 아래의 코드는 별도의 파일에서 지정된 네트워크 장비 목록을 지정하고, 

 해당 목록의 모든 장비의 Configuration을 Text파일로 백업해주는 역할을 하게 됩니다. 

 아래의 코드를 Linux에서 크론탭으로 돌리거나, Windows의 스케쥴러를 이용하시면, 간단하게 정기적으로

 장비의 Configuration을 백업 받으실 수 있습니다. 


[ Config Backup ]

import device

from netmiko import ConnectHandler


for dev in device.ZIGI_devices:

    nwnode = ConnectHandler(**dev)

    hostname = nwnode.send_command("show hostname")

    print("Collecting {0}Device Running Coning".format(hostname))

    run_config = nwnode.send_command("show running")

    print("Collect Complete")

    filename = "c:\\backup\\" + hostname + "-" + backupdate + '.log'

    print("Saving configuration file")

    configFile = open(filename,'w')

    configFile.write(run_config)

    print("{0}Device Configuration Backup complete".format(hostname))

    configFile.close() 


nwnode = ConnectHandler(**dev)

 ▷ 별도의 파일에 백업하고 싶은 장비의 목록을 지정해놓고, 순환문을 이용해서 장비 정보를 불러오게 됩니다. 

     현재 백업하고자 하는 장비를 가져오는 부분입니다.

hostname = nwnode.send_command("show hostname")

  ▷ 현재 장비의 hostname을 가져오는 부분입니다. 'show hostname' 명령어를 이용해서 hostname을 변수에 

     저장하게 하게 됩니다. 

run_config = nwnode.send_command("show running")

 ▷ show running config 명령으로 전체 config를 가져와서 변수에 저장합니다.

filename = "c:\\backup\\" + hostname + "-" + backupdate + '.log'

 ▷ 파일을 저장하고 싶은 폴더에 파일명을 hostname과 백업 날짜를 해서, 텍스트 파일 형태로 이름을 지정합니다.

     여기에서는 backupdate라고 적혀있는 변수는 현재 날짜를 갖고 있는 변수라고 생각하시면 됩니다. 

     현재 시스템 날짜를 가져와서 변수에 넣어서 사용하시면 됩니다. 

configFile = open(filename,'w')

 ▷ 파일을 저장하기 위해서 file객체를 열고

configFile.write(run_config)

 ▷ running config 내용을 파일에 쓰게 됩니다.

configFile.close() 

 ▷ 마지막으로 파일 객체를 닫습니다. 


위와 같은 동작을 전체 장비 리스트를 다 백업할 때까지 반복하게 됩니다. 

아래의 코드는 실제 장비 리스트를 관리하는 파일입니다. 

계정은 공통 변수로 사용을 하게 되고, 각 장비의 이름과 ip를 지정해 놓았습니다. 


[ device.py ]

user1='admin'

pass1=‘zigipass'

dv='cisco_nxos'


CoreSW1={'device_type':dv,'verbose':False,'username':user,'password':pass,'ip':'10.0.0.1'}

CoreSW2={'device_type':dv,'verbose':False,'username':user,'password':pass,'ip':'10.0.0.2'}

ExtSW1={'device_type':dv,'verbose':False,'username':user,'password':pass,'ip':'10.0.0.3'}

ExtSW2={'device_type':dv,'verbose':False,'username':user,'password':pass,'ip':'10.0.0.4'}


ZIGI_devices = [CoreSW1,CoreSW2,ExtSW1,ExtSW2]


Posted by 네떡지기
분류없음2017.06.13 12:33

지난 주 토요일(6월 10일)에 광화문에 있는 한국 Microsoft 에서 

제 22회 네트워크 전문가 따라잡기 'N.EX.T' 행사를 진행했습니다. 


전체적인 행사 준비와 함께.. 마지막 세션에서 'Programmable Network'라는 주제로 세션을 진행했습니다. 

당일 발표된 내용 중에 많은 장수는 살짝 빠졌지만 당일 진행된 전체 흐름에는 큰 영향은 없습니다.
(내용과 함께 듣지 않으면 큰 의미가 없던 이미지라..)

세션에서 진행된 Code에 대한 부분은 앞으로의 포스팅에서 차츰 공개될 예정입니다.

Posted by 네떡지기
DevOps/Programmability2017.05.17 19:37

 

Keyword : netmiko, paramiko, ssh, python, programmability, automation, network, 자동화, 프로그래머빌리티


Programmability for Networker를 새롭게 시작하는 포스팅입니다. ^^; 지난번 Part에 이어서 Part 22부터 시작입니다.

당분간 진행하는 부분이 예전에 진행을 하면서 사용했던 부분이긴 하지만,

Netmiko라는 멀티벤더에서 손쉽게 Paramiko SSH를 사용할 수 있도록 해주는 라이브러리로 진행을 하게 될 예정이라서,

먼저 Netmiko 라이브러리를 설치하는 것으로 가볍게 시작해봅니다.

 

 

Netmiko 

 Multi-vendor library to simplify Paramiko SSH connections to network devices

 

* 관련 링크 : https://github.com/ktbyers/netmiko

 

 

○ Python 버전

         Python 2.7, 3.4, 3.5

 

○ 지원되는 장비

         Paramiko >= 1.13+

         scp >= 0.10.0

         pyyaml

         pytest(for unit tests)

 

 ※ Paramiko

   - Python SSH 모듈 

 

 

 

○ 지원되는 장비

       - Regularly tested

          Arista vEOS / Cisco ASA / Cisco IOS / Cisco IOS-XE / Cisco IOS-XR / Cisco NX-OS / Cisco SG300
          HP Comware7 / HP ProCurve / Juniper Junos / Linux

 

       - Limited tested

          Avaya ERS / Avaya VSP / Brocade VDX / Brocade ICX,FastIron / Brocade MLX,NetIron / Cisco WLC
          Dell-Force10 DNOS9 / Dell PowerConnect / Huawei / Mellanox / Palo Alto PAN-OS / Pluribus / Vyatta VyOS

 

       - Experimental
          A10 / Alcatel-Lucent SR-OS / Ciena SAOS / Cisco Telepresence / CheckPoint Gaia / Enterasys / Extreme
          F5 LTM / Fortinet

 

 

 

○ 설치 방법

       - Netmiko의 설치방법은 아래의 페이지에 안내되어 있지만, 실패하실 수 있습니다.

        * https://pynet.twb-tech.com/blog/automation/netmiko-tools.html

 

 

 

 

 

설치 시에 아래와 같은 에러메시지를 만날 수도 있습니다.

 

 

       -

 

혹시 설치에 실패를 하게 되면, 아래와 같이 설치를 진행하시면 됩니다. (Cent OS 7.3 기준입니다)

 

 

   rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
   yum install python-pip

   yum install python-dev
   yum install python-lxml
   yum install opensll
   yum install openssl-devel

   pip install netmiko

 

 

 

 

 

 

 

 

 

Posted by 네떡지기
DevOps/Programmability2017.05.01 09:49

안녕하세요.

 

이번 포스팅은 기존에 진행하던 Programmabiliy for Networker 라는 주제의 포스팅을..

다시 오랜만에 재개하기 위한 사전 동영상 포스팅입니다.

 

아래의 동영상은 Access-list를 관리하기 위한 방법으로 작성한 코드입니다.

차단하기 위한 별도의 IP리스트 파일을 관리를 하여,

기존의 있는 Access-list에 해당 파일에 있는 IP를 차단하는 역할을 해줍니다.

 

또한 이력관리를 위해서 앞에 Access-list Numbering을 ACL이 추가되는 현재의 날짜와 그 날의 순번대로 작성됩니다.

즉, 2017년 5월 1일에 작성되는 ACL의 경우에는 1705010000, 1705010001 과 같이 Accesss-list가 만들어집니다.

 

개인적으로 진행하는 스터디에서 다뤄질 소모임이기도 하고...

공부를 위한 부분이기도 하고..

6월에 진행되는 네전따 커뮤니티 세미나 발표를 위한 부분이기도 하고..

업무를 위해서 필요한 부분이기도 할...

Programmability for Networker 포스팅이.. 곧 다시.. 재개합니다. ^^

 

 

.

Posted by 네떡지기
DevOps/Automation2015.03.09 22:39

 

Ansible Arista 제어

 

거의 한 달여만의 포스팅이자, Automation for Networker 시리즈로는 거의 3~4달여만 남기는 것 같습니다.

이래 저래.. 일도 있고, 2월부터 4월까지 예정중인 네트워크 타임즈 기고 건 때문에 조금 더디게 정리하고 있기도 합니다. ^^;

이번 포스팅은 4월 네트워크 타임즈 기고에서도 다뤄지게 될 내용인, Ansible을 통한 Arista Switch를 제어하기의 첫 번째 시간인

환경 구축입니다.  다음 포스팅은 이 환경 구축을 통한 실제 Ansible로 Arista swtich 제어하는 에제를 다루게 될 예정입니다.

길이는 무척이나 짧지만, 인고의 삽질 끝에 얻어낸 축약된 내용입니다. ^^;


Ansible로 Arista Switch 제어하기 

 

1. Arista 장비에서 EOS Command API를 활성화

    ZIGI-ARI# management api http-commands

    ZIGI-ARI(config-mgmt-api-http-cmds)# no shutdown

 

 

2. Ansible에서 Arista 장비를 SSH 통해서 제어하기 위해서,  Ansible Control Node가 Arista Linux Shell에 직접 접근하도록 구성.

        - Ansible Control Node는 Arista EOS Node에 Password를 입력하지 않고 SSH Key를 통해서 접속하도록 구성

    2-1 Ansible에서 사용할 SSh 접속용 User 생성

    2-2 Ansible Control Node에서 SSH Key를 전송하기 위한 디렉토리를 생성 후, 권한 설정

 

 

 

 

 

3. Ansible Control Node에서 SSH Key를 Arista EOS Node로 전송 후, SSH 접속 테스트

         - Key를 접속하기 전에는 SSH 접속 시, Password를 입력해야 하지만 Key 전송 후에는 바로 접근 가능

 

 

 

 

4. Arista 장비에서 Ansible 사용자가 key를 이용해서만 Login하도록, 재부팅 시에 Password를 할당하지 않게 설정한다.

 

 

 

 


 

● 라이브러리 종속성

     - Ansible을 사용하여 Arista Switch를 제어하기 위한 설치 과정에서 아래와 같은 종속성이 있기 때문에 각각 모두 설치가 필요하다.

 

 

※ 초기에는 devops extension을 설치하였지만, 현재는 arista.eos로 대체

 

 

Posted by 네떡지기

티스토리 툴바