[CentOS] network connection error 시 checklist

CentOS 서버에 설치하여 다른 서버와 network 연결이 되어야 구동이 되는 서비스가 있다고 하자.

그런데 연결되어야 하는 서버와 network 문제로 정상적으로 실행이 안될 때가 있다.

이럴 때 다른 서버와 network연결이 왜 안되는지 check 할 것들, 필요한 command는 다음과 같다.

IP 설정 후 설정한 Gateway에 ping 정상응답하는지 확인

CentOS라면 /etc/sysconfig/network-script 디렉토리에서 ip주소, gateway, netmask, dns 등을 설정했을 것이다. 여기서 설정한 gateway와 통신이 되는지 확인한다.

$ route -n

# n옵션을 적용하면 gateway의 ip 주소를 확인할 수 있다.

위 명령어의 결과는 아래와 같다.

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.120.1.254    0.0.0.0         UG    100    0        0 ens192
10.120.0.0      0.0.0.0         255.255.254.0   U     100    0        0 ens192

가장 오른쪽 열인 'Iface' 를 보면 연결하고자하는 interface를 확인할 수 있다.

VM이 아닌 물리 서버라면 아래 명령어를 통해 해당 interface에 해당하는 이더넷 포트에 불이 깜빡이는 걸 확인가능하다.

$ ethtool -p [interface이름] 10

# 끝에 10을 입력하면 10초동안 깜박인다

다시 돌아와서, route 명령어의 결과에서 destination과 gateway 열을 보면, destination에 따라 통하는 gateway가 다를 수 있음 을 볼수 있다. 위 예제에서는 두번째 줄을 봤을때, 구동하고자하는 서비스가 10.120.0.0 대역으로 연결시도를 하면 0.0.0.0을 통해 packet을 보내려고하고, gateway가 0.0.0.0이라는 것은 해당 줄은 내부망으로 연결되어 있어 외부 네트워크로 나갈 게이트웨이가 없다는 표현이다.

보다 상세한 내용은 아래 링크 참고.

https://coding-chobo.tistory.com/61#:~:text=추가로 게이트웨이에서 0.0,없음"으로 표현할 수 있습니다.

첫번째 줄을 보면 Destination이 0.0.0.0이고 gateway는 10.120.1.254이다. 해석하면, 명시되지 않은 destination대역외에는 모두 10.120.1.254를 통해 packet을 내보낸다는 뜻이다.

연결하고자 하는 interface가 맞는지, gateway 설정이 잘되었는지 확인이 되었다면, 서비스가 packet을 보내고자하는 destination에 맞는 Gateway에 ping을 날려서 gateway와 통신이 잘 되는지 확인해보자

$ ping 10.120.1.254

#아래는 결과. 통신이 잘 되고 있음
PING 10.120.1.254 (10.120.1.254) 56(84) bytes of data.
64 bytes from 10.120.1.254: icmp_seq=1 ttl=255 time=0.266 ms
64 bytes from 10.120.1.254: icmp_seq=2 ttl=255 time=0.207 ms
64 bytes from 10.120.1.254: icmp_seq=3 ttl=255 time=0.249 ms
64 bytes from 10.120.1.254: icmp_seq=4 ttl=255 time=0.315 ms
64 bytes from 10.120.1.254: icmp_seq=5 ttl=255 time=0.294 ms
64 bytes from 10.120.1.254: icmp_seq=6 ttl=255 time=0.263 ms

iptables 확인

iptables 명령어로 이용하려는 port가 혹시 닫혀있지는 않은지 확인할 수 있다.

$ iptables -L

#아래는 결과
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

기본정책(policy)가 ACCEPT 라고 되어있으면 그 아래에 다른 조건이 없다면 ACCEPT이고

DROP일때는 특정 포트에 대해 ACCEPT 조건을 추가로 명시하지 않으면 닫혀있다는 뜻이다.

packet이 들어올 포트(INPUT), 나갈 포트(OUTPUT) 모두 허용되어 있는지 확인한다.

iptables에 대한 상세 : https://linuxstory1.tistory.com/entry/iptables-기본-명령어-및-옵션-명령어

netstat 으로 구동하려는 서비스가 port를 대기하는지 확인

CentOS 서버로도 packet이 들어와야한다면 구동하고자 하는 서비스가 port를 대기하고 있어야 한다.

아래 명령어로 확인한다.

$ sudo netstat -tnlp

#아래는 결과

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1459/master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1265/sshd
tcp6       0      0 :::3000                 :::*                    LISTEN      28420/docker-proxy
tcp6       0      0 :::5432                 :::*                    LISTEN      27398/docker-proxy
tcp6       0      0 :::5433                 :::*                    LISTEN      28213/docker-proxy
tcp6       0      0 ::1:25                  :::*                    LISTEN      1459/master
tcp6       0      0 :::8000                 :::*                    LISTEN      27586/docker-proxy
tcp6       0      0 :::9000                 :::*                    LISTEN      2060/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      1265/sshd

sudo 없이도 실행가능한데, sudo와 같이 실행하면 어떤 프로세스가 어떤 포트를 대기 하는지 같이 확인가능하다.

예를 들어,결과 두번째 줄을 보면 sshd라는 서비스의 프로세스 ID는 1265이고 22번 port를 대기하고 있다.

특정 목적지에 대한 요청을 특정 gateway로 보내야 하는 경우

$ route add -host 10.65.204.89 gw 27.101.112.45

→ 10.65.204.89가 목적지인 경우 27.101.112.45로 보내라

위 명령어가 쓰인 사례 :

기관 A에 설치한 CentOS서버에서 기관 B에 packet를 보내야하는 상황. 10.65.204.89가 기관 B, 27.101.112.45는 CentOS서버와 같은 ip 대역 vpn(gateway)

특정 ip까지 연결 안될때 어느 ip대역에서 끊겼는지 확인

아래 명령어를 이용하면 목적지(ip주소)까지 통신할때 어떤 경로로 통신하는지 알 수 있다.

$ traceroute 8.8.8.8

# 아래는 결과. 8.8.8.8까지 도달하는 과정을 보여준다
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  gateway (10.120.1.254)  0.872 ms  0.837 ms  0.813 ms
 2  218.236.12.169 (218.236.12.169)  3.084 ms  3.086 ms  3.097 ms
 3  100.70.69.233 (100.70.69.233)  0.688 ms  0.696 ms  0.685 ms
 4  10.63.252.18 (10.63.252.18)  1.085 ms  0.961 ms  0.698 ms
 5  10.222.7.126 (10.222.7.126)  2.639 ms 10.222.16.136 (10.222.16.136)  1.743 ms 10.222.16.140 (10.222.16.140)  33.889 ms
 6  10.222.22.97 (10.222.22.97)  1.019 ms 10.222.23.45 (10.222.23.45)  0.732 ms 10.222.23.201 (10.222.23.201)  0.907 ms
 7  142.250.162.182 (142.250.162.182)  31.223 ms  31.253 ms 142.250.163.48 (142.250.163.48)  27.694 ms
 8  * 10.252.44.254 (10.252.44.254)  28.250 ms *
 9  dns.google (8.8.8.8)  28.538 ms  31.648 ms  32.044 ms
#icmp 전송을 막아논 경우 ping이나 traceroute로 확인할 수 없다.

tcpdump 확인


# tcpdump -i 인터페이스명(em1등) : 특정 인터페이스에 들어오는 packet확인
# tcpdump -i any -nn : 모든 인터페이스, -nn옵션은 port 번호표시
# tcpdump -i any icmp : ping은 icmp packet. ping 걸어놓고 들어오는지 확인할때

댓글 쓰기

0 댓글