1. 사용 명령어 |
(1) route
(2) awk
(3) ping
2. 키워드 & 사용처 |
(1) 키워드
ICMP, 디폴트 게이트웨이, Default Gateway
(2) 사용처
디폴트 게이트웨이르르 자동으로 얻어서 ping 명령어로 네트워크 연결을 확인하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./gwping-linux.sh
[Syccess] ping -> 192.168.1.1
4. 스크립트 |
#!/bin/sh
# route 명령어 출력에서 디폴트 게이트웨이 얻기
# 첫 번째 컬럼이 "0.0.0.0"인 줄의 두 번째 컬럼을 추출
gateway=$(route -n | awk '$1 == "0.0.0.0" {print $2}') ①
# 디폴트 게이트웨이에 ping
ping -c 1 $gateway > /dev/null 2>&1 ②
# ping 종료 스테이터스로 성공, 실패 확인
if [ $? -eq 0 ]; then
echo "[Success] ping -> $gateway"
else
echo "[Failed] ping -> $gateway"
fi
5. 해설 |
이 스크립트는 리눅스 서버에서 디폴트 게이트웨이에 네트워크 연결을 확인합니다. ping 명령어로 ICMP 패킷을 송신하여 네트워크가 정상적으로 통신 가능한지 확인합니다.
디폴트 게이트웨이는 네트워크 접근 경로에서 외부 네트워크의 출입구가 되는 기기로 일반적으로 라우터라고 합니다.
그림에서 192.168.1.10과 192.168.1.20이 통신할 때는 같은 세그먼트 내부이므로 디폴트 게이트웨이를 사용하지 않습니다.
자신이 소속되지 않은 네트워크 예를 들어 192.168.2.10와 통신할 때는 디폴트 게이트웨이인 192.168.1.1(라우터)에 패킷을 보냅니다. 라우터는 192.168.2.10이라는 상대방 IP주소를 따라서 적절한 경로를 선택합니다.
서버 관리 시 네트워크에 어떤 문제가 생기면 우선은 디폴트 게이트웨이에 ping을 보내서 연결을 확인합니다.
리눅스 서버에서 디폴트 게이트웨이를 확인하는 여러 방법이 있지만 루팅 테이블을 표시하는 route 명령어 출력을 사용합니다. route 명령어 출력은 리눅스와 BSD 계열이 다른데 여기서는 리눅스 예를 소개합니다.
route 명령어는 -n 옵션만 사용하면 현재 경로 테이블 내용을 호스트명이 아닌 IP 주소를 표시합니다.
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
여러 항목이 있지만 여기에서는 Destination과 Gateway 값을 사용합니다. Destination은 상대 네트워크를 나타내는데, 예제에서는 디폴트 게이트웨이를 얻고 싶으므로 0.0.0.0인 줄(마지막 줄)을 읽습니다. 이 줄의 Gateway는 192.168.1.1이므로 192.168.1.1이 디폴트 게이트웨이 입니다.
①에서 route 명령어 출력에서 텍스트를 가공해서 IP 주소를 취득하기 위해 awk 명령어를 사용합니다. awk는 $1, $2, $3, ...이라는 변수가 각각 첫 번째, 두 번째, 세 번째 컬럼을 가리킵니다. 첫 번째 칼럼 Destination이 0.0.0.0인 줄만 출력하도록 필터링하고, 액션을 지정하는 중괄호 {}에서 두 번째 칼럼인 Gateway를 print 명령어로 출력합니다. 이 출력을 명령어 치환 기법 $()로 셸 변수 gateway에 대입합니다.
②에서 취득한 디폴트 게이트웨이 IP 주소에 ping을 실행합니다. 윈도우 ping 명령어는 ICMP 패킷을 4회 보내고 자동 종료하지만 리눅스 ping은 옵션을 지정하지 않으면 ICMP 패킷을 계속 보냅니다. 따라서 -c 옵션을 사용해서 한 번만 보내도록 지정합니다. 예제에서는 ping 명령어 종료 스테이터스만 사용하고 출력은 필요하지 않으므로 표준 출력 및 표준 에러 출력을 /dev/null로 리다이렉트해서 버립니다.
③에서 ping 명령어 실행 결과를 판별합니다. ping 명령어로 보낸 ICMP Echo Request에 대해 정상적으로 ICMP Echo Reply가 돌아오면 ping 명령어 종료 스테이터스는 0이 됩니다. 셸 특수 변수 $?는 명령어 종료 스테이터스가 들어 있으므로 이 값이 0인지를 확인하여 성공인지 실패인지 메시지를 출력합니다.
<주의사항>
리눅스 서버 자체에 디폴트 게이트웨이가 설정되어 있지 않으면 ② ping 명령어는 셸 변수 gateway에 아무것도 들어 있지 않으므로 인수 에러가 발생합니다. 따라서 예제를 실행해서 failed가 표시되면 이런 아래와 같은 가능성이 있습니다.
- 서버 설정 자체에 문제 발생(네트워크 설정을 잘못했을 가능성 등)
- 네트워크 경로에 문자 발생(LAN 케이블이 빠졌을 가능성 등)
- 디폴트 게이트웨이에 문제 발생(전원이 꺼졌을 가능성 등)
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 네트워크 - 057 ping으로 특정 호스트 응답 평균 시간을 취득하기 (0) | 2021.03.30 |
---|---|
[Linux 셸 스크립트] 네트워크 - 056 디폴트 게이트웨이에 ping이 통하는지 확인하기(FreeBSD/Mac) (0) | 2021.03.30 |
[Linux 셸 스크립트] 날짜 처리 - 054 윤년인지 확인하기 (0) | 2021.03.29 |
[Linux 셸 스크립트] 날짜 처리 - 053 한 달 전에 만든 로그 파일을 일괄 아카이브 하기 (0) | 2021.03.29 |
[Linux 셸 스크립트] 날짜 처리 - 052 오늘이 말일인지 판별하기 (0) | 2021.03.26 |
댓글