반응형

Python에서 xlsx을 돌리면 시간이 굉장히 오래 걸리고, 제약사항 또한 많기 때문에 csv를 사용한다.

하지만 대부분의 엑셀office에서는 xlsx 에서 csv 변환이 헷갈리고 잘 안되기 때문에 그냥 python에서 아래와 같은 방법을 사용해서 파일 변환을 할 수 있다.

Python 코드

################################

### xlsx -> csv 파일변환

em_df = pd.ExcelFile('employment_results.xlsx').parse(sheet_name=0, dtype=object, engine='xlrd', verbose=True)

 

# csv는 구분자로 ","를 쓰기 때문에, 혹시 데이터 중에 ","가 있다면 이게 구분자로 쓰일 수 있으므로

# 공백으로 치환 후 csv로 변환한다.

# 공백 치환은 안전하게 string이 있는 열에만 사용한다. em_df['입사기관명/진학학교명'] = em_df['입사기관명/진학학교명'].str.replace(',',' ')

#csv로 파일 변환 em_df.to_csv(path_or_buf='employment_results.csv', sep=',', header=True, index=False, mode='w', encoding='CP949')

#em_df에 해당 csv파일 삽입 em_df = pd.read_csv('employment_results.csv', engine='c', dtype=str, sep=',', encoding='CP949')

이제 파일 변환이 제대로 되었는지 describe()와 head()를 통해 확인해보자.

Python 코드

em_df.describe() em_df.head()

 

아주 잘 들어갔다.

Good!

반응형
반응형

wPython에서 pandas pkg를 이용하여 Dataframe 작업을 할 때 열 생성/변경/삭제 작업이 많다.

단순한 열 생성/변경/삭제 작업의 경우 간단하지만, 다수 개의 조건하에 있는 열 변경 작업은 생각이 조금 필요하다.

오늘 원소 값 변경을 위해 삽질을 여러 번 하다가.. 발견한 조건에 따른 원소 값 변경 코드를 정리해본다.

1. Dataframe 생성

original dataframe으로 Name, Gender 열을 가진 간단한 df를 생성했다. 이후에는 새로운 열을 생성하고, 그 열에 대한 원소값을 변경할 것이다.

a = pd.DataFrame({'Name':['Jane','Young','Tester','Tester2'], 'Gender':['man','woman','woman','man']}) print('***** original dataframe *****') print() print(a)

2. 조건에 따른 Dataframe에 새로운 Column 생성

나는 python의 loc 와 str.contains 함수를 사용할 것이므로, 이것을 먼저 간단하게 알아보고 넘어간다.

x.loc: label(값)을 이용하여 values 그룹에 접근(indexing)하는 것.

아래 예시(Example)과 같이 label(값 = viper)에 따른 값들을 출력해주는 method이다.

str.contains: string에서 아주 유용한 함수로, 인자값에 따른 문자열을 찾아준다.

예를들어, a={"장미", "집", "배나무", "매화는 매실의 ", "가나다", "abc", "꽂", "꼽", "꽁", "꼿꼿"} 라는 배열에서 a.str.contains("꽃")을 실행하면 "꽃"을 포함한 모든 단어를 출력할 수 있다.

즉, '기업명' 이라는 열에서 'xx전자'라는 이름을 가진 기업명을 찾아 '업무분야' 라는 카테고리를 새로 만든 후, '전자'라는 값을 삽입한다고 치자. 그럴 경우 기업명엔 '삼성전자', 'LG전자', 'ABC전자'등 많은 값이 있을 지라도 이 분류는 '전자'로 처리될 수 있다.

그러면 이제 나의 예시에서 loc와 contains method를 함께 사용해본다.

a.loc[a['Gender'].str.contains("wo")]) # a['Gender']열에서 "wo"가 포함된 값의 grp을 찾는다.

그 결과값으로 1, 2번 값들이 출력된다.

그러면 이제 해당 값("wo")을 가진 그룹에 'category'라는 column을 추가하여 '여자'라는 값을 생성한다.

a.loc[a['Gender'].str.contains("wo"), 'category'] ='여자' print(a)

3. 기존 Dataframe에 새로운 조건 삽입

2번에서 category가 '여자'라고 설정된 a dataframe에 새로운 조건을 적용해본다.

a.loc[a['Gender'].str.contains("man"), 'category'] ='사람' #man이 포함된 경우 '사람'을 입력한다. print(a)

* np.where()

: 배열 요소를 검색해 인덱스를 반환. 검색 조건을 응용하여 True, False 형태로 많이 사용함.

(예시) 1. dataframe에서 '입사기관명/진학학교명' 값들의 대분류를 만들기 위해, 기존 df에 'Category' 열을 삽입하고, '화학' or '에너지' or 환경 키워드를 포함한 입사원들에 대해 '화학.에너지.환경'의 데이터를 category로 입력해준다.

1) 초기 dataframe의 행은 3511명의 data로 구성되어 있다. 3번 순번을 가진 사람은 'LG화학'에 입사했으므로 'Category'열에 '화학.에너지.환경'이라는 값을 가질 것이다.

2) '화학' or '에너지' or '환경' 키워드를 포함한 입사기관명/진학학교명을 찾아, 그 값이 포함되었을 경우 'True', 미포함했을 경우 'False'로 값이 생성된다.

em_df['Category'] = em_df['입사기관명/진학학교명'].str.contains('화학' or '에너지' or '환경') em_df.head()

3) 그리고 True값을 가진 열을 '화학.에너지.환경'으로 값을 치환시킨다.

em_df['Category'] = np.where(em_df['Category']==True,'화학·에너지·환경', em_df['Category']) em_df.head()

4) 치환이 잘 됐는지 확인해본다.

2, 49, 66, ... 번의 사람들이 화학/에너지/환경 분야에 취업또는 진학했다.

*** 하지만 이렇게 np.where, str.contains을 사용해서는 여러 조건에 대한 값을 변경할 수 없다.

왜냐? 화학.에너지.환경으로 이미 바뀐 값들이 텔레캅/미작성에 대해 True/False를 다시 하게되면,

이전 바뀌었던 화학.에너지.환경은, 텔레캅/미작성 조건에서는 False가 되어버리기 때문이다.

+ str.contains에서 or을 쓸 경우 앞의 값만 체크가 된다! '미작성'값 Category는 '테스트중'으로 바뀌지 않았다.

즉, 여러 조건을 중첩하여 값을 바꿀 때엔 아래와 같이 loc를 사용해야한다.

em_df.loc[em_df['입사기관명/진학학교명'].str.contains("화학"), 'category'] ='화학' em_df.loc[em_df['입사기관명/진학학교명'].str.contains("텔레캅"), 'category'] ='테스트중' em_df.head()

오늘 몇 시간 삽질한 결과.... 다행히 정리됐다.

구글링을 많이 해봤지만 loc를 여러 조건을 통해 중첩시키는 예제는 없고,

중첩되는 조건을 쓰는 건 쉬운 숫자값들밖에 없었다.

+ 내용은 제대로 안알려주고 광고만 덕지덕지 붙은 티스토리, 네이버블로그 들까지...

나는 정말 나뿐만 아니라 남들에게도 도움이 되는 글을 쓰고싶다. 

오늘의 삽질 끄읕!!

 

반응형
반응형

딥러닝을 돌리기 위해 텐서플로우(tensorflow)에서 필요한 패키지가 몇 가지 있는데, 그 중 opencsv 및 cv2가 설치되지 않는 문제가 있다.

powershell 에서 pip install opencv, pip install cv2로 해당 패키지를 설치하게 되면 아래와 같은 에러가 발생하여 설치가 실패되는데, 이유는 python 패키지 이름이 아니기 때문에 에러가 발생한다.

이들은 둘 다 pip에서 설치할 수있는 opencv-python 패키지의 일부로 포함되어 있는데, 한번 설치해보자.

pip install cv2 pip install opencv 실행 결과 PS C:\Users\BAEK> pip install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2

 

대안으로 opencv-python 설치하기

# pip install opencv-python

PS C:\Users\BAEK> pip install opencv-python Collecting opencv-python Downloading opencv_python-4.2.0.34-cp38-cp38-win_amd64.whl (33.1 MB) |████████████████████████████████| 33.1 MB 211 kB/s Requirement already satisfied: numpy>=1.17.3 in c:\users\baek\appdata\local\programs\python\python38\lib\site-packages (from opencv-python) (1.18.2) Installing collected packages: opencv-python Successfully installed opencv-python-4.2.0.34

설치 잘 됐다. 이제 다음 에러는...

반응형
반응형

Colab은 Google에서 제공하는 클라우드기반 가상 개발환경이다.

일반적으로 Python은 PyCharm 또는 Jupyter notebook을 많이 사용하는데, PyCharm의 경우 한줄한줄 코딩이 되지 않아 불편한 점이 있고 Jupyter notebook의 경우 윈도우 환경 제약을 간혹 받게 된다.

본인 또한 인공지능1 수업의 프로젝트를 진행하려다가 Jupyter notebook에서 딥러닝 관련 pkg가 설치되지 않아 구글링 끝에 Colab을 발견하여 사용하게 되었다.

별도의 설치없이 구글 계정만 있으면 사용 가능하고, 별도의 제약사항또한 없어 아주 잘 사용하고 있다!

즉, 인터넷만 가능하다면 언제어디서든 코딩이 가능하며 (아직까진)제약사항이 없어 모든이들에게 정말 추천한다.

구글은 아래와 같이 Colab을 소개한다.

Colaboratory(또는 줄여서 'Colab')를 사용하면 브라우저에서 Python을 작성하고 실행할 수 있습니다.

- 구성 필요 없음

- GPU 무료 액세스

- 간편한 공유

학생이든, 데이터 과학자든, AI 연구원이든 Colab으로 업무를 더욱 간편하게 처리할 수 있습니다. Colab 소개 영상에서 자세한 내용을 확인하거나 아래에서 시작해 보세요.

UI는 위와 같다. 거의 Jupyter notebook과 동일하다고 보면 된다.

하지만 Jupyter notebook에서 제약있는 몇몇의 패키지가 Colab에선 문제 없이 잘 설치되고, Colab 자체가 python 등 별도의 프로그램 설치 없이 코딩이 가능하다. 특히 딥러닝을 몇 개 돌려보았는데 문제없이 잘 돌아간다.

Google Colab 주소

https://colab.research.google.com/notebooks/intro.ipynb#scrollTo=5fCEDCU_qrC0

 

Google Colaboratory

설정에서 어두운 테마 옵션을 확인해 보세요.

colab.research.google.com

Colab 기본 설정 및 구성

아래 블로그에 해당 내용이 굉장히 잘 설명되어 있어 링크를 첨부한다. (본인과 관련 1도 없읍니다. 정말 유용해요.)

https://theorydb.github.io/dev/2019/08/23/dev-ml-colab/

[Colab] Google Colab (코랩) 환경설정 및 사용법

개요 파이썬을 활용한 머신러닝의 첫 관문! 구글 Colab(코랩)의 환경구성 및 기본 사용법을 다룬 포스트입니다. 목차 Colab이란 무엇인가? Colab 환경설정 Colab을 활용한 간단한 예제 작성 Colab & Markdown Colab이란 무엇인가? 구글 코랩(Colab)은 클라우드 기반의 무료 Jupyter 노트북 개발 환경이다. 내부적으로는 코랩 + 구글드라이브 + 도커 + 리눅스 + 구글클라우드의 기술스택으로 이루어진...

theorydb.github.io

[출처] [Colab] 구글 코랩(Google Colaboratory): Jupyter notebook보다 편한 python 개발 환경|작성자 사색

반응형
반응형

인공지능1 기말과제로 제출한 개인 프로젝트이다. 기말고사를 열심히 공부하느라(?) 과제에는 많은 힘을 쏟진 못하였다... 그래도 언젠가는 도움이될 것 같아서 제출한 과제 그대로 복붙을 해본다.

요약

Object detection을 주제로 인공지능1 이미지분석 개인프로젝트를 진행하였다. 이미지 분석에는 Classification, Object detection 등이 존재하나 Object detection이 결국 Classification이 포함되며, 더 심화되는 개념으로 Object Detection에 대해 금번 프로젝트로 정리해보았다. 해당 분석을 진행하기 위해 제2장에서 CNN, R-CNN, Fast R-CNN, Faster R-CNN 그리고 SSD(Sigle Shot Multi-box Detector)에 대한 이론을 정리하였으며, 제 3장에서는, Google에서 제공하는 Tensorflow Hub를 통해 Faster R-CNN과 SSD+mobilenet v2 모듈을 다운받아 구현함으로써 해당 방법론들에 대한 결과값과 소요시간을 계산하고 Output 이미지를 확인해보았다.

제 1 장 서론

현재 인공지능은 인간과 기계사이의 능력 격차를 해소하는 획기적인 성장을 기록해오고 있다. 연구원들은 기계(Machine)가 놀라운 성과를 거둘 수 있도록 수많은 필드의 방면을 연구하는데, 그런 많은 분야 중 하나가 Computer Vision이다. 이 분야는 기계가 인간처럼 세상을 보고, 비슷한 방식으로 인지하고, 심지어 이미지&비디오 인식(Image & Video recognition), 이미지분석&분류(Image Analysis & Classification), 미디어 재생산(Media Recreation), 추천시스템(Recommendation Systems), 자연어처리(Natural Language Processing) 같은 다수 작업에 지식을 사용할 수 있도록 한다. 딥러닝(Deep Learning)과 함께하는 Computer Vision의 발전은 주로 특정한 알고리즘인 CNN을 통해 구성되며 시간에 따라 완벽해지고 있다.

금번 과제의 구성은 제2장에서 CNN의 발전과정(CNN, R-CNN, Fast R-CNN, Faster R-CNN)에 대해 이론적으로 알아본 뒤, 제 3장에서 R-CNN 코드 구현을 통해 이미지를 예측 및 결과에 대해 기술하였다. 제4장 결론에서는 금번 프로젝트 내용을 정리하고 한계점에 대해 기술하였다.

제 2 장 CNN의 발전과정 및 SSD

2.1. CNN (Convolutional Neural Networks)

CNN(Convolutional Neural Network)은 딥러닝 알고리즘(Deep Learning Algorithm)으로, 이미지를 입력하여 이미지 내 다양한 측면/객체의 가중치(learnable weights, biases)를 할당하여 각각을 서로 다른 것으로 구별할 수 있게 할 수 있다. 전처리과정은 다른 분류 알고리즘과 비교했을 때 훨씬 적어 계산에 편리하며, 이전 방법에서 필터는 직접 손으로 동작하도록(hand-engineered) 설계되어 충분한 training을 진행해야 했지만, CNN은 이러한 필터/특성을 스스로 학습할 수 있는 능력을 가지고 있다. CNN의 구조는 인간 뇌에 있는 뉴런의 연결 패턴과 유사하며, 개별 뉴런은 Receptive Field로 알려져 있는 visual field의 제한된 영역에서만 자극에 반응한다. 인공지능1 수업에서 배웠듯, 해당 필드의 집합이 이미지 전체를 다루기 위해 아래 ‘[그림-1] CNN sequence to classify handwritten digits’ 과 같이 손으로 쓴 숫자를 CNN에서 분류하기위해CONV, RELU, POOL, FC layer가 사용되며, Convolution layer에서는 tensor를 입력 받아 영역별로 weights를 곱해 각 뉴런의 아웃풋을 계산한다. 여기서 filter라는 개념이 추가되는데, filter가 많아질수록 결과 값이 복잡해지기 때문에, 이후 Pooling layer를 통해 이미지를 downsizing 하여 계산결과가 작아지게 된다. 최종적으로는 FC(Fully Connected) Layer를 사용하여 class의 점수를 계산하게 된다. 각 layer내에서는 계산을 위해 Padding, Filter, Stride등 여러 Hyperparameters가 사용된다.

그림 1. A CNN sequence to classify handwritten digits

 

2.2. R-CNN (Regions with Convolutional Neural Networks)

RCNN은 CNN을 본격 이용하여 딥러닝 기반 이미지 분류기를 feature extractor로 사용하여 object detection, segmentation에서 높은 보였다는 점에서 주목을 끌었다. 최초의 R-CNN 논문에서의 문제 정의는 1) Localizing objects with DNN, 2) Training a high-capacity model with small quantity of annotated detection data로 완전히 새로운 방식이 아닌, Neural Network 기반의 detection feature extractor를 만들어내려고 시도했던 것으로 판단한다. R-CNN은 크게 아래 4가지 방법으로 나뉜다.

그림 2. R-CNN 학습 구조

1) Input image: 이미지를 입력한다.

2) Region proposal algorithm

대상의 class를 구분하지 않고 이미지로부터 region을 추출해낸다. 알고리즘은 상관없으며 비슷한 질감이나 색, 강도를 가진 인접한 픽셀들을 연결하여 bounding box를 구성하는 Selective search 방법 등을 이용한다. 이 방법으로 생성된 bounding box의 output을 다시 CNN 레이어의 input으로 활용하고, input으로 변환하는 과정에서 압축(warp)을 한다.

3) CNN: Feature vector extract

앞 단계에서 생성한 region을 압축한 input으로, 미리 training된 CNN 모듈에 통과시켜 새로운 Feature를 생성한다. AlexNet, VGGNet을 기반으로 튜닝 과정을 거친 CNN 모델을 사용한다. 기존의 CNN Classifier에서 최종 softmax 분류기 부분을 제외한 output을 결과물 feature로 사용하는데, 예를 들면 Kaggle이나 다른 분석 대회용 dataset을 보면 불분명한 image feature들이 존재하는 경우가 있는데, 이 feature를 나타낸 다는 것이 그 예이고, 이 결과물을 fixed-length feature vector라고 부른다.

4) Classify Algorithm

마지막으로 Fixed-length feature vector를 input으로 하는 분류기를 추가한다. Region proposal 단계에서 생성된 object를 CNN 레이어에 통과시켜 fixed-length feature vector로 변환한다. 그리고 이 input값을 바탕으로 객체여부를 분류한다. 이 단계를 나눈 이유는, 도메인 목적에 맞는 분류기를 설정 및 유효한 영역 판별을 판단하기 위함이다.

 

2.3. Fast R-CNN

Fast R-CNN은 R-CNN으로부터 속도를 개선시키기 위해 Rol pooling을 중간 과정에 삽입, 연산을 급격하게 줄여 속도를 개선시킨 모델이다. 기존 R-CNN은 RP(Region Proposal)마다 CNN을 적용했기 때문에 Selective search * CNN의 연산을 수행했지만, Fast R-CNN은 (Selective search +Rol Pooling) *1의 연산으로 급격하게 연산이 줄었다.

그림 3. Fast-CNN 구조

 

2.4. Faster R-CNN

Fast R-CNN을 통해 많은 시간과 비용이 절약되었지만, RP(Region Proposal) 생성 자체에 많은 시간이 소요되었다. Fast R-CNN에서는 selective search를 수행하는 region proposal이 외부에 존재하여 inference에서 병목(Bottleneck)을 일으켰기 때문에, Faster R-CNN에서는 RPN(Region Proposal Network) 자체를 학습함으로써 selective search 없이 RPN을 학습하는 구조로 모델이 만들어졌다. RPN은 Feature map을 input으로, RP를 output으로 하는 네트워크이며, selective search의 역할을 온전히 대체한다. 또한, Fast R-CNN의 경우 Selective search가 주는 bounding box 좌표를 이용하여 학습했지만, Faster R-CNN은 미리 정의한 reference bounding box인 anchor라는 개념을 도입하여 다양한 크기와 비율로 n개의 anchor를 미리 정의하여 sliding window시 sliding 마다 n개의 bounding box 후보를 생성하여 이미지를 학습하게 된다.

그림 4. Faster R-CNN RPN

 

2.5. SSD(Single Shot Multi-Box Detector)

Faster R-CNN이 등장한 후 더 빠르고 강력한 Detector인 SSD가 등장했다. Faster R-CNN은 기존 R-CNN의 속도와 비용을 개선했지만 7FPS with mAP 73.2% 의 느린 속도에 실시간 영상분석에 사용할 수 없었다. YOLO는 속도는 빨랐으나 45FPS with mAP 63.4%로 성능을 포기해야 했다. 하지만 SSD는 기존 R-CNN에서 사용했던 RP 추출 및 Resampling 과정을 제거하여 59FPS with mAP 74.3%으로 높은 정확성과 빠른 속도를 모두 얻어냈다. SSD는 말 그대로 사진의 변형 없이 그 한장으로 훈련, 검출을 하는 Detector이다. 기존 CNN에서는 이미지에서 객체 유무를 판단하기 위해 그림을 자르거나 변형해야 하여 오랜 시간이 소요되었지만, SSD는 기존 구조 뒤 보조 구조를 붙여 얻은 Multi-scale feature maps을 이용하여 이 문제를 해결하였다. 아래 사진에서 개의 크기는 사진의 1/3이지만, 고양이는 1/6정도로 둘 간 크기 차이가 크다. 이를 한 가지 feature map에서 구하려면 bounding box의 크기 차이로 인해 box의 크기 추정, 위치추정까지 많은 과정이 필요하다. SSD는 feature map을 여러 개의 크기로 만들어서 큰 map에서는 작은 물체의 검출을, 작은 map에서는 큰 물체의 검출을 하도록 만들어 이 방식은 resampling을 없애면서도 정확도 높은 결과를 도출하게 되었다.

그림 5. SSD feature map

 

제 3 장 Faster R-CNN & SSD+mobilenetV2 Object Detection 실습

Faster R-CNN패키지와 SSD+mobilenetV2 Object Detection 패키지를 활용하여 Object Detection을 진행하였다. 페이지 용량 문제로 코드는 주석처리를 포함하여 GitHub에 업로드 하였으며, 해당 페이지에서는 Input image에 따른 각 Detection별 Output만 기술한다.

2.1. Input Image 및 Object detection 결과

Input 이미지는 우리학교 NEW H 에서 찍은 사진으로 faster R-CNN과 SSD를 적용하였다.

좌측 결과가 faster R-CNN 적용, 우측 결과가 SSD 적용 결과이다. 이론대로 SSD가 더 빠른 Detection time(Inference time)을 가지고 더 많은 object를 탐지함을 알 수 있었다.

* 코드는 다른 포스팅으로 이어서 업로드하겠다.

 

 

제 4 장 결론 및 한계점

인공지능1 수업에서 간략히 다룬 R-CNN에 대해 이론적으로 더 알아보고, 실제 코드 적용을 통해 Object Detection을 확인하였다는 데에 의의가 있다. 하지만 R-CNN, Fast R-CNN, Faster R-CNN에 대해 Google의 TensorFlow Hub에서 Faster R-CNN을 제외한 패키지를 찾지 못하여 직접 Inference Time과 Accuracy 측정값을 비교해보지 못하였다. 아쉬움을 극복하기 위해 Object detection 분야에서 small하고 fast한 장점을 가진 SSD-based object detection model을 함께 학습해보았고, 실제로 SSD 모듈이 Faster R-CNN보다 2배이상 빠르고 많은 예측을 가짐을 확인할 수 있었다. 해당 코드와 결과는 Github에 주석을 포함하여 업로드 하였다.

 

참고 문헌

Sumit Saha(2018), A Comprehensive Guide to Convolutional Neural Networks — the ELI5 way

Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik(2014), Rich feature hierarchies for accurate object detection and semantic segmentation Tech report (v5)

Shaoquing Ren, Kaiming He, Ross Girshick, and Jian Sun(2016), Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

Matthijs hollemans(2018), MobileNetV2 + SSDLite with Core ML

Wei Liu 외(2016), SSD: Single Shot MultiBox Detector

전지원(2017), Single Shot MultiBox Detector 리뷰

반응형
반응형

* 망 구성
10.100.30.101 -- VPN 1 -- ( Public ) -- VPN 2 (10.251.212.240) -- 10.90.65.182

10.100.30.101 -> 10.90.65.182로 pkt을 전송할 경우, 
VPN2 <-> 10.90.65.182 사이 망이 굉장히 복잡하여 10.100.30.101 - 10.90.65.182에 대한 라우팅을 설정할 수 없는 구간이다.

이에따라 아래와 같이 NAT를 설정했다.
NAT를 설정한 구간은, 10.100.30.101 --> 10.90.65.182 이며 'Use Outgoing Interface Address'를 설정했다.


* 설정방법
 . Policy & Objects > IPv4 Policy > 구간선택


* packet 확인
아래와 같이 10.100.30.101 -> 10.90.65.182 pkt이 인입될 경우
10.100.30.101은 10.251.212.240으로 Translation 되어 통신이 완료된다. 


FortiVPN # dia sniffer packet any 'host 10.90.65.182' 4
interfaces=[any]
filters=[host 10.90.65.182]
1.026395 iTest_server in 10.100.30.101.36277 -> 10.90.65.182.21: syn 2654734121 
1.026511 port4 out 10.251.212.240.36277 -> 10.90.65.182.21: syn 2654734121  
4.032451 iTest_server in 10.100.30.101.36277 -> 10.90.65.182.21: syn 2654734121 
4.032509 port4 out 10.251.212.240.36277 -> 10.90.65.182.21: syn 2654734121 
4.989417 iTest_server in 10.100.30.101.40113 -> 10.90.65.182.21: syn 3357824665 
4.989526 port4 out 10.251.212.240.40113 -> 10.90.65.182.21: syn 3357824665 
7.990786 iTest_server in 10.100.30.101.40113 -> 10.90.65.182.21: syn 3357824665 
7.990834 port4 out 10.251.212.240.40113 -> 10.90.65.182.21: syn 3357824665 

반응형
반응형

* VPN에서 Local Network로 Ping 되더라도, VPN Interface - Local Network간 대역이 다를 경우
Local Network에 대한 Routing을 추가해놓아야 한다.
왜?  VPN - Local Network간에는 대역이 동일 or 라우팅 설정 등으로 ping이 이미 되는 상황일 수 있으나,
Site-to-Site는 Remote Network 대역을 Source IP로, 우리 Local Network 대역에 붙어야 하기 때문.
따라서, Local Network <-- VPN <-- Remote Network로 pkt이 올 경우
정확한 가이드를 위해 VPN에서도 Local Network에 대해 라우팅 추가를 미리 설정해준다.

  
* 문제 현상
VPN에 Local Network와 ping이 되지만, 대역이 다른 경우에,
그리고 라우팅이 설정 안 되어 있을 경우, 아래와 같이 수신된 packet을 out 시킬 수 없다.
FortiVPN# dia sniffer packet nay 'host 10.100.30.101' 4
intefaces=[any]
filters=[host 10.100.30.101]
1.140135 iTest_server in 10.100.30.101 -> 10.90.65.182: icmp: echo request
6.142442 iTest_server in 10.100.30.101 -> 10.90.65.182: icmp: echo request
11.134851 iTest_server in 10.100.30.101 -> 10.90.65.182: icmp: echo request
21.124414 iTest_server in 10.100.30.101 -> 10.90.65.182: icmp: echo request


* 보완
Local Network에 대한 Routing을 설정 후, 아래와 같이 packet은 정상 out된다.
FortiVPN # dia sniffer packet any 'host 10.100.30.101' 4
interfaces=[any]
filters=[host 10.100.30.101]
73.304160 iTest_server in 10.100.30.101 -> 10.90.65.182: icmp: echo request
73.305211 iTest_server out 10.90.65.182 -> 10.100.30.101: icmp: echo reply
74.309417 iTest_server in 10.100.30.101 -> 10.90.65.182: icmp: echo request
74.312548 iTest_server out 10.90.65.182 -> 10.100.30.101: icmp: echo reply
249.096258 iTest_server out 10.90.65.182 -> 10.100.30.101: icmp: echo reply
250.098714 iTest_server out 10.90.65.182 -> 10.100.30.101: icmp: echo reply
^C
6 packets received by filter
0 packets dropped by kernel

반응형
반응형

* 우분투 18.04 버전 기반(Ubuntu 18.04)

1. vpnclient 프로그램 설치
sudo apt install vpnc network-manager-vpnc-gnome



2. 설정
root@VL-harbor:~# cat  /etc/vpnc/default.conf
#IPSec gateway <gateway>
#IPSec ID <group-id>
#IPSec secret <group-psk>
#IKE Authmode hybrid
#Xauth username <username>
#Xauth password <password>
※ sudo vpnc /etc/vpnc/default.conf 혹은 sudo vpnc \default.conf 


3. VPN 연결
# sudo vpnc-connect (끊을때는 sudo vpnc-disconnect)
예시)
root@VL-harbor:~# cat /etc/vpnc/default.conf
IPSec gateway [VPN Public IP]
IPSec ID [VPNGroupID]
IPSec secret [VPNGroup-password]
#IKE Authmode hybrid  ---> 주석 처리해도 무방함
Xauth username [VPN Client ID]
Xauth password [VPN Client password]
root@VL-harbor:~#


4. VPN 연결 확인:  sudo vpnc-connect 이후  ip addr 에서 tun0 로 client IP 할당 된것 확인가능
root@VL-harbor:~# ip addr

  : tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1412 qdisc fq_codel state UNKNOWN group default qlen 500    link/none
    inet 172.20.38.153/32 scope global tun0  //# Assigned
       valid_lft forever preferred_lft forever
    inet6 fe80::59bf:bd0d:ee37:3533/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

 * 혹은 아래처럼 default route가 tun0 로 잡힌것도 확인 가능함
:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 tun0  //# set
121.137.98.146  150.100.200.1   255.255.255.255 UGH   0      0        0 ens3
150.100.200.0   0.0.0.0         255.255.255.0   U     0      0        0 ens3
172.20.38.152   0.0.0.0         255.255.255.248 U     0      0        0 tun0


* VPN 서버에서 split vpn 설정해두었다면, 외부망 ping도 가능
:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=3.87 ms\


위는 CLI 로 하는 방법이며, 리눅스에 GUI 가 있다면 아래 링크를 통해 GUI base 로도 설정 가능함.
https://johnpili.com/how-to-connect-to-a-cisco-vpn-in-ubuntu-18-04-lts/


출처: 부서의 VPN 전문가 선배님

반응형
반응형

양단의 IPSec이 Phase-2까지 Completed 되었으나 실제 local IP간 icmp가 실패하는 문제가 발생하였다.

이유를 확인하기 위해 Cisco ASDM의 Monitoring에서 해당ip로 Logging을 잡아보면, 아래와 같은 NAT 이슈가 발생하고 있다.

현상

5 Apr 28 2020 11:04:18 305013 10.10.0.214 20.20.20.50

Asymmetric NAT rules matched for forward and reverse flows; Connection for icmp src outside:10.10.0.214 dst AWS:20.20.20.50 (type 8, code 0) denied due to NAT reverse path failure

설명 및 해결방법

10.10.0.214 -> 20.20.20.50 connection에 대해 잘못된 NAT rule이 적용되어(동일하게 사용하는 existing pool이 또 있다는 것임), NAT reverse path failure로 인해 connection이 deny 되고있었다.

이는 해당 VPN Group의 NAT Exempt 설정을 dst쪽 network로 설정해주면 된다.

설정

Configuration > Site-to-Site VPN > Connection Profiles > 해당 Connection profile name 클릭 > Basic > NAT exempt > Exempt ASA side host/network from address translation 에서 dst쪽 inteface 선택.

이후 해당 vpn profile은 NAT Exemption이 되므로 connection은 정상연결 완료된다.

* NAT Exempt: This allows you to exempt the local network addresses from network translation.

반응형
반응형

 

문제가 발생했을 때 분석을 위해 알아본 Cisco ASA VPN의 packet 캡처 방법.

ASDM의 Monitoring에서 실시간 logging을 제공하나, ACL/NAT단에서 걸릴 경우 아무런 패킷도 Trace 창에 보이지 않게되는데, 이럴 때 유용한 패킷 캡처 방법이다.

 

1. packet capture 방법(설명)

- 출처: Cisco사 CLI 설명서 1: Cisco ASA Series 일반 운영 CLI 구성 가이드, 9.10 : 1223 page ~ 1228 page

옵션 값이 매우 많아서 자료를 그대로 들고왔다.

 

 

 

이렇게 패킷캡처를 설정한 후에는 아래와 같이 패킷 캡처를 보는 명령어가 별도로 존재한다.

패킷 캡처 설정 후, 아래 명령어를 실행해야 실제 캡처되는 패킷을 확인할 수 있다.

 

 

2. 설정 및 실습 - CLI

그렇게 직접 실습해 본 packet capture.

현재 20.20.20.50 - 20.20.20.246은 NAT 설정 오류로 인해 20.20.20.246 -> 20.20.20.50으로 Ping을 실행할 경우 packet이 drop되는 상태이다. 그래서 20.20.20.50 -> 20.20.20.246 방향과 20.20.20.246 -> 20.20.20.50 패킷 캡처를 진행해보았다.

 

1) packet capture

ciscoasa# capture CAP_TEMP_AWS buffer 2048 interface AWS match icmp host 20.20.20.246 any
ciscoasa# capture LOG_DROP type asp-drop all match ip host 20.20.20.50 host 20.20.20.246
ciscoasa# capture LOG_DROP type asp-drop all match ip host 20.20.20.246 host 20.20.20.50

 

2) show capture

packet 캡처를 설정 후, show capture를 통해 패킷 캡처를 확인한다.

#show capture    // 전체 capture되고 있는 packet capture 확인

Result of the command: "show capture"
capture CAP_TEMP_AWS type raw-data buffer 2048 interface AWS [Capturing - 456 bytes] 
  match ip host 20.20.20.246 any 
  match ip host 20.20.20.248 any 
capture LOG_DROP type asp-drop all [Buffer Full - 524284 bytes] 
  match ip host 20.20.20.50 host 20.20.20.248 

 

2-1) 전체 packet capture 확인

#show capture // 전체 capture되고 있는 packet capture 확인 Result of the command: "show capture" capture

 

CAP_TEMP_AWS type raw-data buffer 2048 interface AWS [Capturing - 456 bytes] match ip host 20.20.20.246 any match ip host 20.20.20.248 any capture LOG_DROP type asp-drop all [Buffer Full - 524284 bytes] match ip host 20.20.20.50 host 20.20.20.248

 

2-2) 특정 packet capture 확인

Remove the captures when done.

ciscoasa# no capture CAP_TEMP_AWS
ciscoasa# no capture LOG_DROP


그리고 원인 파악을 위해 show nat로 NAT를 확인한다.

설정된 NAT에는 패킷이 걸렸으나, 다른 이슈로 인해 untranslate가 되었다.

현재 왜 untranslate가 되었는지 파악하는 중이다.

 

2-2. 설정 및 실습 - ASDM

패킷캡처는 ASDM에서도 아래 방법을 통해 진행할 수 있다.

1) Configuration > Firewall > NAT Rules > Packet Trace

 

 

 

Packet Trace를 클릭 후 interface와 packet Type을 설정 후 설정값들을 입력하면 애니메이션과 함께 어떤 부분에서 어떤 rule이 적용됐는지 + 버튼을 통해 확인할 수 있다.

 

어떤 단계들을 거쳐왔는지 + 버튼을 통해 확인해본다.

 

 

 

반응형

+ Recent posts