728x90
반응형

SSH 포트 변경이 필요한 이유

SSH 서비스의 기본 포트는 22번이다.

하지만 인터넷에 서버를 공개하게 되면 네트워크 공간에 떠돌고 있는 수많은 자동 프로그램들이 로그인 시도를 한다.

이때 기본 포트를 사용하면 보안에 취약하기 때문에 포트를 변경해주는 것이 좋다.

(물론 nmap 등의 툴을 통해 포트 스캔하면 다 나온다.)

 

아래 사진은 최근 Django 웹서버 구축을 위해 잠시 열어둔 서버를 누군가 접속 시도한 기록이다.

ssh로 root 로그인 금지해야하는 이유

 

초 단위로 여러 아이피에서 root로 로그인 시도한 걸 볼 수 있다.

만약 방금 설치한 서버에서 별다른 조치없이 ssh 서비스부터 열었다면, 서버는 순식간에 특정 국가 해커들의 채굴 도구나 C&C 서버 역할을 할 것이다.

 

로그인 시도 기록을 보려면 아래 명령어를 사용한다.

'접속 시도 기록'
$ cat /var/log/auth.log

'로그인 기록'
$ last

SSH 포트 변경 방법

 

포트 변경 방법은 간단하다.

$ vi /etc/ssh/sshd_config

/etc/ssh/sshd_config 파일을 열어 주석처리된 #PORT 22 부분을 해제하고 원하는 포트를 입력하면된다.

 

이후 ssh 데몬을 재실행한다.

$ service sshd restart

공유기 포트 포워딩

도메인을 구입하거나 클라우드 서비스를 이용한다면 모르겠지만 집에서 iptime 공유기가 제공하는 무료 도메인을 사용한다면 포트 포워딩을 해줘야 한다.

대부분 정보를 가려두었지만, 원하는 포트를 바인딩해준다.

 

예시)
규칙 이름 : 서버_ssh_서비스
내부 IP 1.1.1.1 (서버 주소)
프로토콜 : TCP 
외부 포트 : 1234~1234 
내부 포트 : 1234~1234

변경된 포트로 접속하는 방법

접속 방법은 ssh 설치된 환경에서 아래 명령어를 사용한 뒤 로그인한다.

ssh user_name@server_url -p 1234

 

 

728x90
반응형

'Computer Science > Server & Network' 카테고리의 다른 글

[프로토콜] TCP  (0) 2022.03.19
[서버] scp 명령어 사용  (0) 2022.03.19
[서버] Django 홈 서버 구축하기  (0) 2022.03.17
[프로토콜] FTP  (0) 2022.03.11
[서버] MariaDB 서버 구축 - 작성 중  (0) 2022.03.09
[서버] Cent OS-7 설치 및 초기 설정  (0) 2022.03.03
728x90
반응형

** 추가 내용이 있을 경우 지속적으로 업데이트 되는 게시글입니다.

 

TCP ? 

  • Transmission Control Protocol
  • RFC 793
 

RFC 793 - Transmission Control Protocol

 

datatracker.ietf.org

 

  • 등장 배경

헤시넷 참조

 


 

참조 자료 링크

728x90
반응형
728x90
반응형

목적

  • Linux -> Linux, Linux -> Windows, Windows -> Linux등 여러 운영체제(서버) 간의 파일 전송

 

윈도우에서  OpenSSH 설치 확인하기

  • OpenSSH Client 기능 활성화 확인 

1. 윈도우 키 -> 앱 및 기능 검색 후 엔터 -> 선택적 기능 클릭

 

2. openssh 검색

** 설치되지 않았을 경우 아래 링크 참조

https://docs.microsoft.com/ko-kr/windows-server/administration/openssh/openssh_install_firstuse

 

OpenSSH 설치

Windows용 OpenSSH 클라이언트 및 서버를 설치합니다.

docs.microsoft.com


 

리눅스에서 SCP 설치 확인하기

  • scp 설치 확인 : scp 명령어 입력해보기
  • scp 설치
# Ubuntu
sudo apt-get install openssh-server -y

# cent
yum -y install openssh-server openssh-clients

 

윈도우에서 SCP 사용하기

  • 윈도우에서 리눅스로 파일 보내기
scp '윈도우 파일 경로' '리눅스 계정@리눅스 서버:리눅스 디렉토리 경로'

ex)
scp c:\users\hwan\desktop\test.txt linux_user@192.168.0.0:/home/linux_user/Desktop

 

  • 윈도우에서 리눅스에 있는 파일 가져오기
scp '리눅스 계정@리눅스 서버 주소:리눅스 파일 경로' '윈도우 디렉토리 경로' 

ex)
scp linux_user@192.168.0.0:/home/linux_user/Desktop/test.txt c:\users\hwan\desktop\

 

리눅스에서 SCP 사용하기

  • 리눅스에서 윈도우로 파일 보내기 (윈도우에 ssh 서비스가 실행중이라고 가정)
scp '리눅스 파일 경로' '윈도우 계정@윈도우 IP : 디렉토리 경로' 

ex)
scp /home/user/file.txt hwan@x.x.x.x:/c:\users\hwan\desktop\

** 윈도우에서 서비스 실행은 아래 링크 참조

https://superuser.com/questions/414803/how-to-scp-from-linux-server-to-windows-client

 

How to SCP from Linux server to Windows client

I'm SSHing into a Linux machine using PuTTY and trying to copy a file down somewhere (anywhere) to my local machine. I figure SCP is the best candidate for the job but don't really care, so long as...

superuser.com

 

  • 리눅스에서 윈도우 파일 가져오기
scp '윈도우 계정@윈도우 IP : 파일 경로' '리눅스 디렉토리 경로' 

ex)
scp hwan@x.x.x.x:/c:\users\hwan\desktop\file.txt /home/user/

 

정리

  • scp는 콘솔에서 서버로의 파일 송수신을 도와주는 도구이다.
  • scp의 사용을 위해서는 openssh가 설치되어 있어야하며, 서버에서는 ssh 서비스가 실행 중이어야 한다.
  • 위 조건이 만족되면 운영체제에 상관없이 파일의 송수신이 가능하다.
# 명령어는 클라이언트에서 실행

# 클라이언트에서 서버로 파일 보내기
scp '클라이언트 내부의 파일 위치' '유저명@서버주소:파일이 위치할 서버 내부의 경로'

# 서버에서 클라이언트로 파일 가져오기
scp '유저명@서버주소:서버 내부의 파일 위치' '파일이 위치할 클라이언트 내부의 경로'

 

728x90
반응형
728x90
반응형

개요

  • Dorker와 Django를 사용하여 Web 서버를 구축한다.
  • 집에 있는 장비를 활용하여 서버를 구축하고 Django 공부한다.
  • 만들어진 Docker 이미지를 AWS에 이식하고 남는 장비는 포맷 후 보관한다.

구성

  • OS : 우분투 20.04 LTS
  • 도메인 : iptime 공유기 도메인 등록 후 사용
  • 장비 : 남는 노트북 활용

macbook air 2010


집에서 로컬 웹 서버 구축하기

각 항목들은 아래 링크의 글에 설명되어 있다.

 

  • Ubuntu 20.04 LTS 설치 및 설정

리눅스 서버 설치 및 설정 : 

 

  • Docker 설치하고 사용하기

도커 설치 : https://hwan001.tistory.com/180

도커 사용 : https://hwan001.tistory.com/184

 

  • Django 설치

Django 설치 : https://hwan001.tistory.com/186

 

  • 공유기 도메인 등록 및 보안 설정

iptime 공유기 무료 도메인 등록 및 설정 방법 : 

ssh 접속 포트 변경 : https://hwan001.tistory.com/182

 

  • 우분투 컨테이너로 Django 웹 서버 구축 후 hub 배포

우분투 컨테이너에서 Django 띄우기 : https://hwan001.tistory.com/193

 

  • 도메인 구매, 적용

hosting.kr 구매 및 도메인 적용 후기 : 

 

  • AWS, Docker, Django 서버 열기

AWS 구매 :

AWS에 Docker 환경 설정 :

 


 

728x90
반응형
728x90
반응형

** 추가 내용이 있을 경우 지속적으로 업데이트 되는 게시글입니다.

 

FTP ?

  • File Transfer Protocol 약어
  • TCP/IP 기반의 응용 프로토콜로 서버와 클라이언트 간의 파일 전송을 위해 고안됨
  • 크게 2개의 연결 종류가 있음 (명령 연결, 데이터 전송용 연결)
  • 위키피디아 링크
  • RFC 114 (1971년 4월) : 최초의 FTP (CNP 기반?)
  • RFC 765 (1980년 6월) : TCP/IP 버전
 

RFC 765 - File Transfer Protocol specification

 

datatracker.ietf.org

  •  RFC 959 (1985년 10월) : 현재 사양의 FTP
 

RFC 959 - File Transfer Protocol

 

datatracker.ietf.org

  • RFC 1579 (1994년 2월) : RFC 959의 방화벽 친화 FTP (수동 모드)
 

RFC 1579 - Firewall-Friendly FTP

 

datatracker.ietf.org

  • RFC 2228 (1997년 6월) : 보안 확장
 

RFC 2228 - FTP Security Extensions

 

datatracker.ietf.org

  • RFC 2428 (1998년 9월) : IPv6 지원
 

RFC 2428 - FTP Extensions for IPv6 and NATs

 

datatracker.ietf.org

 


 

프로토콜 구조

  • Active Mode와 Passive Mode

Active Mode와 Passive Mode

  • FTP 구조
    FTP는 TCP기반의 응용 프로토콜로 이더넷 헤더 + IP 헤더 + TCP 헤더 + FTP 데이터 로 이루어져 있음

 

 


 

FTP 보안 문제

 

RFC 2577 - FTP Security Considerations

 

datatracker.ietf.org

 

 

 

 

- FTPS : File Transfer Protocol Secure

- SSH : Secure SHelll

- SFTP : SSH File Transer Protocol

 

728x90
반응형
728x90
반응형

목적

  • Maria DB를 구축하고 Sql 연습하는데 사용함
  • 나중에 개발할 크롤러 및 RPA 봇과 연계하여 정보를 수집하고 REST API 서버를 통해 Post, Get 할 예정임

구성

  • OS : CentOS 7 Minimals
  • DB : Maria DB
  • 장비 : 남는 노트북 활용

서버로 사용할 노트북과 라즈베리 파이


서버 설치

 


서버 설정

  • 시간 동기화

 

  • 네트워크 설정

 

  • 유저 생성

 

  • SSH 설치 및 설정

 

  • SELinux 해제

 

  • Firewall 해제

 

  • net-tools, iptables 설치

 

  • mariadb 설치

 

  • DB, User 생성 및 권한 부여

 

  • 라즈베리파이와 다이렉트 연결

 

  • 원격 접속 테스트

 

 

 

https://ksr930.tistory.com/42

 

centos, c++ MariaDB 연동 테스트 해보기 (Makefile)

회사에서 진행중인 프로젝트에서 오라클 DB 기반의 서버를 오픈소스 DB로 바꾸는 프로젝트를 진행하게 되어서 실제 소스에 적용하기전에 테스트 프로그램을 만들어서 컴파일 하는 작업을 해보

ksr930.tistory.com

 

https://jamanbbo.tistory.com/43

 

django REST framework로 간단한 api 만들기

django REST ramework (DRF)는 RESTful한 API를 쉽게 만들 수 있도록 해준다.  지금부터 DRF를 사용해 영화 리스트를 CRUD (Create,Read,Update,Delete) 할 수 있는 간단한 API를 만들어 볼 것이다. 혹시 REST..

jamanbbo.tistory.com

 

728x90
반응형
728x90
반응형

1. 구분

  • DVD ISO 파일
  • Everything ISO
  • Minimal ISO

 

2. 네트워크 설정

  • vi /etc/sysconfig/network-scripts/ifcfg-enpXXX -> ONBOOT=YES, gateway, dns, ...
  • systemctl restart network or service network-manager restart
  • ip addr

 

3. 네트워크 관련 설치

  • yum -y install net-tools bind-tools nmap

 

4. 시간 동기화

  • yum -y install rdate
  • rdate -s time.bora.net
  • timedatectl set-ntp y
  • date

 

4. 유저 생성

  • adduser -m -u 10001 hwan
  • passwd hwan

 

5. ssh 설정

  • yum -y install openssh-server openssh-clients openssh-askpass
  • vi /etc/ssh/sshd_config
  • PermitRootLogin no
  • MaxAuthTries 3
  • MaxSessions 5
  • service sshd start
  • service sshd status

 

7. iptables 설정

  • yum -y install iptables-services
  • systemctl enable iptables
  • systemctl start iptables 
  • iptables -nL
  • iptables -A INPUT -d tcp --dport port -j ACCEPT

 

728x90
반응형
728x90
반응형

1. 개요

 - 라즈베리파이 재설치를 위해 공식 홈페이지에 접속했지만 iso 파일이 아닌 RaspberryPi OS Imager(exe)를 제공

 - 해당 툴을 사용하여 진행했지만 너무 느린 속도로 인해 설치가 제한됨

 - 직접 이미지 파일을 다운로드하여 Rufus를 이용하여 설치하기로함

 - 해당 방식으로 설치 시 ssh 활성화, wifi 연결 등의 작업을 미리해둘 수 없으므로, 별도의 인터페이스가 필요함

 - 2020-02-13 버전 이후로 파일이 없음 (최신버전 필요 시 Imager 활용)

 - 공식 홈페이지(https://www.raspberrypi.com/software/raspberry-pi-desktop/)에서 설치 시 iso 파일 다운로드 가능


2. 라즈베리 파이 OS 이미지 파일 다운로드

    ** 위 경로에서 아래와 같은 폴더를 찾기

 

  • raspbian full OS 선택

 

  • images 폴더 선택

 

  • 최신버전 선택 후 .zip 파일 다운로드

 


3. Rufus 포터블 다운로드

   ** 위 경로에서 아래 이미지와 같은 링크 찾기

 


4. micro SD 카드 연결 후 포맷

** 내용은 아래 사진과 다를 수 있음, 어댑터로 PC에 연결 > 해당 드라이브 우클릭 > 포맷 > 시작

 


5. 이미지 작성

** 다운로드 받은 zip 파일 압축해제 > img파일 획득

** 장치 선택 후 선택 버튼으로 해당 img 파일 선택

시작 클릭
완료

 


6. 확인

728x90
반응형
728x90
반응형

1. 라즈비안 OS 다운로드

- 링크 : https://www.raspberrypi.org/downloads/raspbian/

 

 

2. 이미지 기록용 툴 다운로드 (Win32Disklmager or UltraISO)

- 링크 : https://sourceforge.net/projects/win32diskimager/

 

3. 이미지 파일 기록

  1) 이미지 파일 선택

  2) Device 선택 (SD카드)

  3) write

 

 

4. 부팅 후 로그인

  - ID : pi

  - PW : raspberry

 

 

728x90
반응형
728x90
반응형

1. 목적

 esp8266을 사용하여 아두이노와 PC가 WiFi, Socket을 사용하여 TCP로 데이터를 주고 받음

 

2. 설명

 1) 만들 것 : 와이파이로 연결된 TCP/IP Client (Python)와 Server (esp8266)

 2) 재료 : esp8266, 아두이노 UNO, FTDI

esp8266
아두이노 UNO
FTDI

 

  3) 회로

    - 펌웨어 업로드 : esp8266의 통신속도를 늦춰주기 위해서 115200 -> 9600 (SoftwareSerial 라이브러리 사용위함)

1. esp의 RX는 FTDI의 TX와 TX는 RX와 연결

2. vcc는 3.3v

3. 펌웨어와 업로드 프로그램은 아래 참고 링크 참조.

 참고 : http://kocoafab.cc/tutorial/view/592

 

- UNO-esp8266 : arduino-esp8266-master 라이브러리 사용

1. 코드 내에서 Rx, Tx 할당한 핀에 연결, (RX-TX, TX-RX로 연결하면됨)

2. vcc는 3.3v

라이브러리 다운 : https://github.com/Diaoul/arduino-ESP8266

참고 : http://m.blog.naver.com/damtaja/220311412393

 

3. 코드

<Client>

# python 버전은 2.7.13
import socket

HOST = '' # esp8266에 접속후 ipconfig 명령을 통해 알아낸 게이트웨이의 주소를 입력하면됨. ex) 192.168.4.1
PORT = 4000 # 정해둔 포트 사용

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
print 'socket created'

HOST = raw_input("IP: ")

s.connect((HOST, PORT))
print 'connet success'

while 1:
    data = raw_input("data :")
    s.send(data)
    print 'send success'

s.close()

 

<Server>

#include <SoftwareSerial.h>
#include "ESP8266.h"

SoftwareSerial esp8266Serial = SoftwareSerial(10, 11); // 10번 11번을 rx tx로 설정함. (TIMEOUT 뜨면 아두이노에 연결한 rx tx 핀을 바꿔서 껴볼 것)
ESP8266 wifi = ESP8266(esp8266Serial);

void setup()
{
    Serial.begin(9600);

    // ESP8266
    esp8266Serial.begin(9600);
    wifi.begin();
    wifi.setTimeout(1000);

    /******        WiFi commands       ******/
    // setWifiMode
    Serial.print("setWifiMode: ");
    Serial.println(getStatus(wifi.setMode(ESP8266_WIFI_ACCESSPOINT))); // ESP를 AP로 사용

    // setAPConfiguration
    Serial.print("setAPConfiguration: ");
    Serial.println(getStatus(wifi.setAPConfiguration("ESP8266", "awesomelib", 10, ESP8266_ENCRYPTION_WPA_WPA2_PSK))); // SSID 이름, 비밀번호, 채널, 암호화방식 설정
    wifi.restart();

    // getAPConfiguration
    char ssid[32] = {};
    char password[63] = {};
    uint8_t channel;
    ESP8266Encryption encryption;

    wifi.getAPConfiguration(ssid, password, channel, encryption);
    
    Serial.print("getAPConfiguration: ");
    Serial.print(ssid);
    Serial.print(", pw: ");
    Serial.print(password);
    Serial.print(", ch: ");
    Serial.print(channel);
    Serial.print(", encrypt: ");
    Serial.println(encryption);//*/

    // setDHCP
    Serial.print("setDHCP STA: ");
    Serial.println(getStatus(wifi.setDHCP(ESP8266_WIFI_STATION, false)));
    Serial.print("setDHCP AP: ");
    Serial.println(getStatus(wifi.setDHCP(ESP8266_WIFI_ACCESSPOINT, true)));//*/

    // getIP
    IPAddress ip;
    Serial.print("getIP STA: ");
    Serial.print(getStatus(wifi.getIP(ESP8266_WIFI_STATION, ip)));
    Serial.print(" : ");
    Serial.println(ip);
    Serial.print("getIP AP: ");
    Serial.print(getStatus(wifi.getIP(ESP8266_WIFI_ACCESSPOINT, ip)));
    Serial.print(" : ");
    Serial.println(ip);//*/

    /****************************************/
    /******       TCP/IP commands      ******/
    /****************************************/
    // setMultipleConnections
    Serial.print("setMultipleConnections: ");
    Serial.println(getStatus(wifi.setMultipleConnections(true)));

    // createServer
    Serial.print("createServer: ");
    Serial.println(getStatus(wifi.createServer(4000)));
}

int power=0;

void loop()
{
	// Wi-Fi Command
    // getConnectedStations -> esp8266이 AP모드일 때 연결된 장비들 보여줌
    /*
    ESP8266Station stations[5];
    unsigned int stationCount;
    
    Serial.print("getConnectedStations: ");
    Serial.print(getStatus(wifi.getConnectedStations(stations, stationCount, 5)));
    Serial.print(" : ");
    Serial.println(stationCount);
    
    for (uint8_t i = 0; i < stationCount; i++) {
      Serial.print(" - ");
      Serial.print(stations[i].ip);
      Serial.print(" - ");
      for (uint8_t j = 0; j < 6; j++) {
        Serial.print(stations[i].mac[j], HEX);
        if (j < 5)
          Serial.print(":");
      }
      Serial.println();
    }
    delay(1000);
    */

    /****************************************/
    /******       TCP/IP commands      ******/
    /****************************************/
    // getConnectionStatus -> TCP 연결된 기기들 주소 보여줌
    /*
    ESP8266Connection connections[5];
    unsigned int connectionCount;
    
    Serial.print("getConnectionStatus: ");
    Serial.print(getStatus(wifi.getConnectionStatus(connectionStatus, connections, connectionCount)));
    Serial.print(" : ");
    Serial.println(connectionCount);
    
    for (int i = 0; i < connectionCount; i++) {
      Serial.print(" - Connection: ");
      Serial.print(connections[i].id);
      Serial.print(" - ");
      Serial.print(getProtocol(connections[i].protocol));
      Serial.print(" - ");
      Serial.print(connections[i].ip);
      Serial.print(":");
      Serial.print(connections[i].port);
      Serial.print(" - ");
      Serial.println(getRole(connections[i].role));
    }
    
    delay(5000);
    
    // 데이터 읽어옴
    unsigned int id;
    int length;
    int totalRead;
    char buffer[11] = {};

    if ((length = wifi.available()) > 0) {
      id = wifi.getId();
      totalRead = wifi.read(buffer, 10);

      if (length > 0) {
        Serial.print("Received ");
        Serial.print(totalRead);
        Serial.print("/");
        Serial.print(length);
        Serial.print(" bytes from client ");
        Serial.print(id);
        Serial.print(": ");
        Serial.println((char*)buffer);
      }
    }*/
}

String getStatus(bool status)
{
    if (status)
        return "OK";

    return "KO";
}

String getStatus(ESP8266CommandStatus status)
{
    switch (status) {
    case ESP8266_COMMAND_INVALID:
        return "INVALID";

    case ESP8266_COMMAND_TIMEOUT:
        return "TIMEOUT";

    case ESP8266_COMMAND_OK:
        return "OK";

    case ESP8266_COMMAND_NO_CHANGE:
        return "NO CHANGE";

    case ESP8266_COMMAND_ERROR:
        return "ERROR";

    case ESP8266_COMMAND_NO_LINK:
        return "NO LINK";

    case ESP8266_COMMAND_TOO_LONG:
        return "TOO LONG";

    case ESP8266_COMMAND_FAIL:
        return "FAIL";

    default:
        return "UNKNOWN COMMAND STATUS";
    }
}

String getRole(ESP8266Role role)
{
    switch (role) {
    case ESP8266_ROLE_CLIENT:
        return "CLIENT";

    case ESP8266_ROLE_SERVER:
        return "SERVER";

    default:
        return "UNKNOWN ROLE";
    }
}

String getProtocol(ESP8266Protocol protocol)
{
    switch (protocol) {
    case ESP8266_PROTOCOL_TCP:
        return "TCP";

    case ESP8266_PROTOCOL_UDP:
        return "UDP";

    default:
        return "UNKNOWN PROTOCOL";
    }
}

 

 cf. 라이브러리 기본 샘플 코드를 그대로 사용함, 라이브러리는 내부적으로 AT 커맨드를 사용함.

728x90
반응형
728x90
반응형

[살거]

1. 라즈베리 파이 3 세트 라즈베리파이3 + 공식 정품 엔클로져 + 방열판 세트

 

[사진 출처] 아이씨뱅큐 (https://www.icbanq.com/P007115238//?catg_code=120)

 

[특징]

- 블루투스, 와이파이 기능 추가됨. -> 무선 랜 카드 구입할 필요 x

- 64bit CPU -> 라즈비안 OS는 64bits가 없음 (32bits 설치해서 사용 중)

 

2.  파이카메라 : 라즈베리파이 카메라모듈 V2, 8MP (RPI 8MP CAMERA BOARD)

 

[사진 출처] 디바이스 마트 (http://www.devicemart.co.kr/1077951)

 

[특징]

- CSI 인터페이스 사용

 

[주의]

- 라즈베리 파이는 충전기 연결 시 바로 부팅됨.

- Micro SD 카드에 운영체제를 넣어서 사용하므로 마이크로SD 필요함. (이미 있어서 구입 안 함, 16GB 사용 중, class 10 이상 권장)

cf. UHS도 class 10 이상임, MLC 방식 추천 -> 잘 모르겠으면 링크

- 카메라와 파이를 원활하게 사용하려면 정격 출력 5V, 2A 이상은 되어야 할 듯.

cf. VEGA 스마트폰 충전기 사용 중 (정격 출력 5V, 2A)

- HDMI 포트 하나 있음 -> 모니터 연결은 알아서 잘할 것!

 

[링크]

- 디바이스 마트 : 파이 카메라 (약 3만원)

- 아이씨뱅큐 : 라즈베리 파이3 (약 5만원)

 

728x90
반응형

+ Recent posts