ssh 란 
- Secure Shell 의 약자  
- 네트워크상에서 다른 시스템에 로그인 또는 원격으로 명령어를 실행 
- 파일을 다른 시스템으로 복사 할 수 있는 응용프로그램의 protocol
- ssh 는 rsh,rlogin,telnet 명령어의 보안 취약점을 보완해주기 위해서 설계되었음

자주 사용되는 옵션
-p 옵션을 이용하여 port를 지정
ssh  -p 22 serverUserId@serverIP 
경우에 따라서는 -P를 사용해야 하는 버전도 있음

키 파일을 이용하여 접속하기
-i 옵션 뒤에 생성한 key파일의 절대위치경로를 포함여 key파일명을 위치 시킨다
ssh -i keyfile serverUserId@serverIP 

SSH 작업할 때 주로 사용하는 옵션
옵션	내용
-a	인증 에이전트 전송을 불허
-e	세션에 대한 이스케이프 문자를 설정
-f	인증과 전송이 설정된 후에 백그라운드에서 ssh를 설정
-l	원격 시스템에 사용할 로그인 이름을 설정
-p	원격 호스트에 연결할 포트를 지정
-v	디버깅모드 자세한 정보 표시 모드를 활성
-x	X11 전송을 불가능하게 설정
-L	지정된 원격 호스트와 포트에 전송할 로컬 포트 설정
-R	로컬 호스트와 지정된 포트로 전송될 원격 포트 설정

ssh 의 -L 과 -R 옵션의 구성
-L,-R 옵션을 사용하려면 
/etc/ssh/sshd_conf 에서 AllowTcpForwarding , GatewayPorts 옵션 주석을 해제 하고 변경

ssh -p 888 -R  3000:1.1.1.1:1000 1.1.1.3 은 아래의 그림과 같이 실행
- server(1.1.1.3)의 3000 포트가 리슨 하고 3000 port로 연결된 세션은 
   ssh 터널링을 통해서 1.1.1.1 서버의 1000 port로 전달되어 1.1.1.1 서버에 접속
- 1.1.1.2 서버와 1.1.1.3 서버의 터널링 포트는 888 
- 1.1.1.3 서버의 ssh 데몬이 888 포트로 리슨

ssh -p 888 -L 3000:1.1.1.3:3000 1.1.1.2 은 아래의 그림과 같은 연결을 유지한다
-  client( 1.1.1.1 ) 의 3000 포트가 리슨하고 3000으로 연결된 세션은 
-  ssh 터널링을 통해 연결되 1.1.1.2 서버를 통해서 end point 서버의 1000 포트로 연결
- 1.1.1.1 서버와 1.1.1.2 서버의 터널링 포트는 888 
- 1.1.1.2 서버의 ssh 데몬이 888 포트로 리슨

통신 릴리이를 통해서 clinet에서 1.1.1.1 서버의 8888 에 접속하는 방식

- D 서버에 다음의 설정
    ssh -p 1010 -R 888:1.1.1.1:8888 1.1.3.1
    1.1.1.2 서버는 1.1.3.1 서버에 1010 포트로 터널링
- B 서버에 다음의 설정
  ssh -p 1010 -L 80:1.1.3.1:888 1.1.3.1 
  1.1.2.1 서버는 1.1.3.1 서버에 1010 포트로 터널링
위의 두 설정으로 방화벽 뒤에 있는 1.1.1.1 서버에 클라이언트에서 1.1.2.1 서버의 80으로 접속을 하면 1.1.1.1 서버의 8888 포트로 접속하여 세션이 연결 성공

참고 
서버팜                        DMZ                             외부에있는기관
1.1.1.1   ------------------- 1.1.3.1 ----------------------   a.b.c.1
ssh 연결
 * 1.1.1.1 서버에 다음을 설정
   - ssh -p 888 -i key파일 -f -L 1010:a.b.c.1:8888 1.1.3.1 
  * 로그인이 안되면 PK 파일에 권한을 600으로 설정
    - chmod 600 ~/.ssh/mykey
 * key 생성 과 key 로그인을위한 처리
    - rsa 키를 생성
      ssh-keygen -t rsa
    - 키를 생성하면 공개키와 개인키 생성됨
     id_rsa.pub : 공개키
     id_rsa : 개인키
   - 생성된 공개키의 값을 접속하려는 서버의 ~/.ssh/authorized_keys 파일에 복사하여 입력    
   - 이후 키방식으로 클라이언트에서 서버로 접속 가능
   - 서버에 키방식만 접속가능하게 하려면 /etc/ssh/sshd_config 파일에 
     PermitRootLogin without-password 의 옵션을 입력하고 service ssh reload 를 이용하여
     ssh 서비스를 리로드하면 암호방식으로는 접속할 수 없음
   - 리눅스 에서 sftp 계정에 파일 write 권한이 부여되지 않을 때는 sshd_config 에 값을 수정해야 한다 

ftp의 passive와 active mode 차이점
Active 모드
ftp active mode
1) client는 서버의 21번 포트로 접속한 후 client가 사용할 두 번째 포트를 서버에 공지
2) 서버는 client의 요청에 응답합니다. (acks)
3) 서버의 20번 데이터 포트는 client가 알려준 두 번째 포트로의 접속을 시도합니다.
4) client가 서버의 요청에 응답합니다. (acks)
 21번은 제어 포트, 20번은 데이터 전송 포트
*액티브 모드
- 클라이언트가 서버에 접속을 하는 것이 아닌 서버가 클라이언트에 접속을 하는 것
- FTP 클라이언트에 방화벽이 설치되어 있으면 기보적으로 20번과 21번은 오픈되어 있어야 한다

Passive 모드
사용된 커맨드 포트와 데이터 포트는 서버 설정에서 변경
Passive 모드에서는 데이터 포트 번호를 특별하게 지정하지 않는 경우 1024 ~ 65535번 중에서 사용 가능한 임의 포트 사용
포트 번호를 지정할 때는 10001 ~ 10005번과 같이 범위를 지정 가능.
1) client가 커맨드 포트로 접속을 시도합니다. (Passive 모드 연결)
2) 서버에서는 사용할 두 번째 포트를 client에게 알려줍니다.
3) client는 다른 포트를 열어 서버가 알려준 포트로 접속을 시도합니다.
4) 서버가 client 요청에 응답합니다. (acks)
* Passive 모드
- 1024번 이후의 임의의 포트를 데이터 채널 포트로 사용

연결 방식 주의사항
* Active Mode
- 클라이언트 측의 방화벽에 20번 포트가 차단되면 데이터 채널 연결이 불가능
- 서버측은 20번 포트는 아웃바운드 허용
- 클라이언트는 인바운드 방화벽 설정
* Passive Mode
- 서버 측의 데이터 채널 포트가 close 되면 데이터 채널 연결이 불가능
- 데이터 채널 범위 지정하지 않는 경우는 1024 ~ 65535번의 포트를 사용
- 서버 측에서 데이터 채널 포트 범위를 지정하여 특정 범위의 포트 open 하면  방화벽 문제해결 가능

 ssh 옵션 참고 자료(출처 : https://hack-cracker.tistory.com/131#)
옵션 	 의미
 -1 	 ssh가 프로토콜 버전1만 사용하도록 한다.
 -4	 ssh가 IPv4만 사용하도록 한다.
 -6 	 ssh가 IPv6만 사용하도록 한다. 
 -A	인증 에이전트 연결 전달을 사용한다. 이는 구성 파일에서 호스트별로 지정할 수도 있다. 
 	공격자는 에이전트에서 키에대한 자료를 얻을 수 없지만 에이전트에 로드된 ID를 사용하여 인증할 수 있는 키에 대한 작업을 수행할 수 있기때문에 주의해야한다.
 -a	인증 에이전트의 전송을 불가능/비활성화 한다.
 -C	모든 데이터의 압축을 요청한다. 압축 알고리즘은 gzip에서 사용하는 것과 동일하다.
 -c 	세션을 암호화하는데 필요한 암호 사양을 선택한다. idea가 기본값이고, arcfour가 가장 빠르며, none은  rlogin이나, rsh( 암호화 없음 )를 사용하는 것과 같다.   
 -e	세션에 대한 이스케이프 문자를 설정한다. (기본값 :' ~ ' )  이스케이프 문자는 행의 시작 부분에서만 인식이된다. 
            마침표 ( ' . ' ) 다음에 오는 이스케이프 문자는 연결을 닫는다.
 -f	ssh가 명령 실행 직전( 인증과 전송이 설정된 후 ) 백그라운드로 이동하도록 요청한다. 
            ssh가 암호를 요구할 때 유용하지만 사용자가 백그라운드에서 암호를 원할 때 더 유용하다. 
 -g, -G	장비관련 옵션 ( 프린트, 스캐너,..) 
 -i 	공개 키 인증을위한 ID( 개인키 )가 읽히는 파일을 선택한다. 
            RSA인증을 위한 비밀 키를 읽어 올 아이덴티티 파일을 선택할때 쓰인다.
 -2	ssh가 프로토콜 버전2만 사용하도록 한다. 
 -L	지정된 원격 호스트와 포트에 전송할 로컬 포트를 지정한다. 
            이 작업은 소켓을 할당하여 로컬 측의TCP 포트를 수신하거나, 
            선택적으로 지전된 bind_address에 바인드하거나, 유닉스 소켓을 수신하는 방식으로 작동 
 -l 	 원격시스템에서 로그인할 사용자를 지정한다.  
 -o	 구성파일의 형식을 따르는 사용자 정의 옵션에 제공하는데 사용된다. 호스트별로 지정할 수 있다.
 -P	 특권이 부여되지 않은 포트를 사용한다 ( ex.22번 포트 ) 
 -p	 원격 호스트에 연결할 포트이다. 호스트별로 지정할 수 있다. 
 -t	 pseude 터미널 할당을 강제한다. 원격 시스템에서 임의의 화면 기반 프로그램을 실행하는 사용된다.  
 -q 	 대부분의 경고 및 진단 메세지가 표시되지 않도록한다. ( 치명적 오류 제외 ) 
 -v	 ( 디버깅에 유용한 ) 자세한 정보 표시 모드를 활성화 한다. 
 -x  	 X11 전송을 불가능하게 한다.