[OCI / LINUX] 콘솔과 소켓 통신 하기 (포트 여는 방법) No route to host
인스턴스를 생성하고, 소켓 통신 또는 데이터베이스에 접속하기 위해
VCN 설정에서 INGRESS와 EGRESS 설정을 하게 되는데,
Oracle Database 카테고리의 Oracle Base Database (VM, BM) 을 통해 oracle 데이터베이스를 생성하고,
oracle base VM 서버와 통신을 하려고 하는데.. Oracle Database VM과 통신이 안되는 현상이 지속적으로 발생했다..
카테고리는 OCI이지만, Linux 환경에서도 공통적으로 적용되는 내용이다!
에러는 No route to host 가 발생했고, 이 에러가 발생했을 시 보통 리눅스의 해결 방법은 이러하다.
- 방화벽이 꺼져있는지 확인한다.
$ systmectl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) |
- 켜져있다면, 방화벽을 꺼준다.
<opc 계정 혹은 sudo 실행 권한이 있는 계정에서 수행>
$ sudo systemctl stop firewalld $ sudo systemctl disable firewalld |
-만일 'Loaded: masked (/dev/null; bad)'가 발생할 경우, 아래 커맨드를 수행 해 준다
$ sudo systemctl umask --now firewalld |
일단 여기까지 방화벽을 서버와 클라이언트 모두 해제해줬는데도 통신이 불가능 하다면
VCN 설정을 확인하게 될 것이다.
근데 아무리 봐도 Egress와 Ingress 설정이 너무너무 잘 되어있다 8903포트를 쓰고싶었고,
설정도 되어있는데 도대체 왜!! 안되는가!!
VM 인스턴스 였다면, 여기까지 잘 설정해 주면 통신이 잘 될것이다.... 하지만 Oracle Database VM은 달랐다..!
아까 위에서 'Loaded: masked (/dev/null; bad)' 가 되어있는 이유가 여기서 나온다..
iptables와 충돌나지 않기 하기위해서는 firewalld를 중지시키고, 마스킹을 등록하여야 했던 건데
이 곳에서는 이미 iptables를 사용하고 있었기 때문에 마스킹 등록이 되어있었던 것이다...
때문에 위에서 umask를 진행하셨다면 다시 mask를 해 주어야 한다.
마스킹이 된 firewalld는 실수로 방화벽을 실행시키더라도 실행이 되지 않기 때문에 안전하다.
- 방화벽 Mask 하기
<opc 계정이나 sudo 권한이 있는 계정에서 실행 (root권한으로 실행할 수 있기 때문에)>
$ sudo systemctl mask firewalld |
-iptables 명령어 존재하는지 확인
$ iptables iptables v1.4.21: no command specified Try `iptables -h' or 'iptables --help' for more information. |
iptables 커맨드를 실행시켰을 때, 위와 같이 출력된다면 iptables가 있는것이지만 없다면 설치 해 줘야 한다.
- iptables 설치 ( 이미 있으면 skip)
<opc나, sudo 권한이 있는 계정에서 실행 (root로 실행해야 하기 때문)> $ sudo yum install iptables 또는 $ sudo yum install iptables-service |
- 설치가 완료 후 iptables파일에 내가 사용할 포트를 추가
<opc나, sudo 권한이 있는 계정에서 실행 (root권한이기 때문)> $ sudo vi /etc/sysconfig/iptables |
- open 하고자 하는 port 추가
/etc/sysconfig/iptables 파일에는 아래와 같은 내용들이 적혀있다.
이 때 -A INPUT -p tcp -m --state 이 부분을 복사해서 내가 쓰고싶은 포트와 함께 추가 해 줄것이다.
--dport옵션 뒤 내가 사용하고 싶은 포트를 추가하면 된다.
파일을 열어 수정하는 것이 복잡하다면 명령어를 통해 추가할 수 있다.
변경 후에 save는 필수로 해 주어야 한다.
해당 포트를 입력하고 설명없이 포트만 추가하는 커맨드 $ sudo iptables -A INPUT -p tcp --dport [원하는 포트] -j ACCEPT 해당 포트를 입력하고 설명을 추가하는 커맨드 $ sudo iptables -A INPUT -p tcp --dport [원하는 포트] -j ACCEPT -m comment --comment "설명" $ service iptables save |
- iptables 재 시작
파일로 저장한 사람도, 명령어로 포트를 추가 한 사람도 iptable을 재 시작 해주어야 한다
$ service iptables restart |
- iptable 확인
추가된 iptables의 리스트를 확인해 추가한 포트가 출력되면 완료!!이다
$ sudo iptables -nL |
더 자세한 iptables의 옵션들은
[Linux] iptables 특정 포트 열기 / 닫기 (iptables 사용법)
목차 1. iptables 란 - 리눅스의 패킷 필터링(Packet Filtering) 도구로서 방화벽 구성이나 NAT(Network Address Translation)에 사용합니다. - 패킷 필터링 기능을 사용해 지나가는 패킷의 해더를 보고 그 전체 패
veneas.tistory.com
이분의 포스팅을 참고하면 좋을 것 같다 엄청 자세하게 잘 설명 되어있다