본문 바로가기
개발

iwinv ssh 포트 변경 후 접속 실패 해결 방법

by hyperhand 2023. 12. 23.

OS: 우분투 22.04LTS

 

문제 발생

처음 서버를 생성하고 기본적인 ssh 포트를 변경한 뒤 접속하려니 계속 접속이 안되는 현상이 발생했다.

$ ssh ubuntu@도메인 -p 38622
ssh: connect to host 도메인 port 38622: No route to host

 

처음에는 아래와 같이 진행했다.

1. iwinv 콘솔 화면에서 elcap 방화벽의 인바운드에 38622 포트를 추가

 

2. 서버의 설정 파일 편집으로 ssh port 변경

$ sudo nano /etc/ssh/sshd_config
#Port 22  ==> Port 38622    // 주석 해제 후 포트 번호 변경

 

3. 서버 자체 방화벽(ufw)도 돌고 있지 않음을 확인

$ sudo ufw status
Status: inactive

 

4. ssh port포트도 바뀐 포트로 listen 상태임을 확인

$ netstat -nltp
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name   
tcp        0      0 0.0.0.0:36822          0.0.0.0:*              LISTEN      7299/sshd: /usr/sbi
tcp        0      0 127.0.0.53:53          0.0.0.0:*              LISTEN      544/systemd-resolve
tcp6      0      0 :::36822                :::*                    LISTEN      7299/sshd: /usr/sbi

 

여기까지는 iwinv 매뉴얼에서도 설명한 내용이기에 당연히 될 줄 알았으나 접속이 안된다.

 

그래서 iwinv측에 문의하려고 했으나 게시판이 따로 없고 무조건 유료 결제를 유도하는 듯 기술지원쪽으로만 문의를 하란 식이었다. 1:1 문의도 그렇고, 고객지원 이메일로 문의를 넣어도 그렇고. 이래서 iwinv를 사용하는 유저가 별로 없는 듯 하다. 저렴한 이용료를 기술지원으로 충당하겠다는 방침인건지. 그래서 사소한 것도 기술지원을 받도록 하겠다는 의도가 느껴졌다.

 cloudv라고 패밀리사이트가 있던데 뭐가 다른 서비스인지는 모르겠지만 거기는 게시판이라도 있었다. 하지만 거기서도 유료 기술지원을 유도하는 식이었다.

 구글링도 해봤지만 별다른 해결책은 찾을 수 없었다. 사용하는 곳이 많지 않으니 당연한걸까?

 그래서 이러저래 몇번 더 시도해보고 안되면 그냥 비싸더라도 aws로 가기로 마음먹고 좀 더 방법을 찾기로 했다. 그래도 aws 사용 경험은 어디서든 인정받는 경험이니 비싼 비용을 지불할만하고 나름 저렴하게 사용할 수 있는 가격정책도 있었다.

 

 

 

 

 

해결

서버상에서 돌고 있는 서비스들 중 보안과 관계된 것은 ufw밖에 없다고 생각했는데 확인해보니 netfilter-persistent 라는 것이 돌고 있다는 것을 확인했다. 처음에는 정확히 뭐하는 건지는 몰랐지만 이름에서 유추해보면 네트워크 관련 필터링 역할을 하는 일종의 방화벽 역할 같은 것이지 않을까 싶었다. 방화벽이 있는데 이게 왜 있는지는 모르겠으나 아래 명령을 통해 구동중임을 확인했다.

$ sudo service --status-all
 [ + ]  apparmor
 [ + ]  apport
 [ - ]  console-setup.sh
 [ + ]  cron
 [ - ]  cryptdisks
 [ - ]  cryptdisks-early
 [ + ]  dbus
 [ + ]  docker
 [ - ]  grub-common
 [ - ]  hwclock.sh
 [ + ]  irqbalance
 [ - ]  iscsid
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ - ]  lvm2
 [ - ]  lvm2-lvmpolld
 [ + ]  netfilter-persistent    # <--------------
 [ - ]  open-iscsi
 [ - ]  open-vm-tools
 [ + ]  plymouth
 [ + ]  plymouth-log
 [ + ]  procps
 [ - ]  rsync
 [ - ]  screen-cleanup
 [ + ]  ssh
 [ + ]  udev
 [ + ]  ufw
 [ + ]  unattended-upgrades
 [ - ]  uuidd

 

구글링 해보니 netfilter-persistent는 iptables와 관계된 서비스고, iptables의 설정에서 특정 체인에 원하는 포트로 규칙을 추가하면 될 것이란 생각이 들었다.

 아래 명령을 통해 현재 설정된 iptables 리스트를 확인했다.

$ iptables -vS
-P INPUT ACCEPT -c 0 0
-P FORWARD DROP -c 0 0
-P OUTPUT ACCEPT -c 315 54116
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-N RH-Firewall-1-INPUT
-A INPUT -c 437 28704 -j RH-Firewall-1-INPUT
-A FORWARD -c 0 0 -j DOCKER-USER
-A FORWARD -c 0 0 -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -c 0 0 -j ACCEPT
-A FORWARD -o docker0 -c 0 0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -c 0 0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -c 0 0 -j ACCEPT
-A FORWARD -c 0 0 -j RH-Firewall-1-INPUT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -c 0 0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -c 0 0 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -c 0 0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -c 0 0 -j RETURN
-A DOCKER-USER -c 0 0 -j RETURN
-A RH-Firewall-1-INPUT -i lo -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -c 434 28544 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -c 1 40 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 25 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 110 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 143 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 50001:50005 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -c 2 120 -j REJECT --reject-with icmp-host-prohibited

 

 

다음 명령을 통해 INPUT 체인에 포트를 추가했다.

$ sudo iptables -A INPUT -p tcp --dport 38622 -j ACCEPT

# 설정 내용 저장
$ sudo service netfilter-persistent save

# 서비스 재시작
$ sudo service netfilter-persistent reload

 

 

위와 같이 설정 후 접속을 시도하니 여전히 접속이 안된다. 그래서 일단 설정한 내용을 제거했다.

# 설정 규칙 제거할 때는 추가할때와 동일하게 내용을 입력해고 옵션만 -D로 주면 된다.
$ sudo iptables -D INPUT -p tcp --dport 38622 -j ACCEPT
$ sudo service netfilter-persistent save
$ sudo service netfilter-persistent reload

 

 

안되는 이유를 찬찬히 들여다보니 기존 설정에서 22번이나 80번 등의 포트들이 RH-Firewall-1-INPUT이라는 체인에 설정돼 있음을 확인했다. 그래서 해당 체인에 규칙을 추가하고 포트를 제외한 다른 옵션들도 동일하게 맞춰줬다.

$ sudo iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW --dport 38622 -j ACCEPT
$ 저장 및 재시작

 

위와 같이 하고 다시 접속을 시도했으나 여전히 접속이 안된다ㅠㅠ

그래서 규칙이 제대로 적용이 안됐나 싶어 다시 테이블을 확인해봤다.

$ sudo iptables -vS
...
-A RH-Firewall-1-INPUT -i lo -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -c 20 1384 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 25 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 110 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 143 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 50001:50005 -c 0 0 -j ACCEPT
-A RH-Firewall-1-INPUT -c 0 0 -j REJECT --reject-with icmp-host-prohibited
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 38622 -c 0 0 -j ACCEPT

 

맨 마지막에 추가된 규칙이 들어가 있음에도 접속이 안된다. 그래서 문제가 뭘까 곰곰히 생각해보다 추가된 규칙 위에 REJECT 때문에 차단되는게 아닌가 싶어 규칙을 그 위로 올리고 싶어졌다. 22번 포트 다음으로 이동하기로 했다. 기존 규칙 사이로 삽입하는 옵션이 있었다.

# 기존 규칙 삭제
$ sudo iptables -D RH-Firewall-1-INPUT -p tcp -m state --state NEW --dport 38622 -j ACCEPT

# 기존 규칙 사이로 이동하려면 기존 규칙들의 위치를 알아야하는데 --line-number 옵션이 그것이다.
$ sudo iptables -nvL --line-numbers
Chain RH-Firewall-1-INPUT (2 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        8   940 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 255
3      577 42634 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:20
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:21
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
7        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:25
8        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:110
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:143
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:443
12       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:5901
13       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpts:50001:50005
14       2   120 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

# 22번 포트가 6번이므로 그 다음 위치인 7번 자리에 삽입되도록 설정
$ sudo iptables -I RH-Firewall-1-INPUT 7 -p tcp -m state --state NEW --dport 38622 -j ACCEPT
$ 저장 및 재시작

 

$ sudo iptables -nvL --line-numbers
Chain RH-Firewall-1-INPUT (2 references)
num   pkts bytes target     prot opt in     out     source               destination         
1       44  4694 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 255
3      260 24843 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:20
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:21
6        1    40 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
7        2   120 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:38622
8        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:25
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:110
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:143
12       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:443
13       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:5901
14       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpts:50001:50005
15       0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

 

위와 같이 규칙을 이동시킨 후 다시 접속 시도하니 드디어 성공~!!

 

 해결해서 좋긴 하지만 구글링이며 이리저리 시도해본다고 대략 이틀을 허비한 것 같은데 이건 그냥 어디 게시판이나 매뉴얼에 써주면 5분도 안걸릴 일을 업체의 장사속에 놀아난 것 같아 씁쓸한 기분이 든다.

 

 이번 문제는 어찌어찌 해결했지만 또다른 문제가 발생했을 땐 어찌해야 할지. 서비스가 좀 안정화되면 그땐 aws로 갈아탈 것이다.  aws는 그래도 레퍼런스들이 많아서 문제가 생겨도 금방 해결책을 찾을 수 있으므로.

반응형