Linux - ssh-sshfs

ssh 사용 팁과 sshfs 이용 방법에 대해서 정리한다.

ssh

터미널에서 ssh를 사용하는데 이용하는 구성과 설정을 정리했다.

비밀키 이용

ssh를 사용하는 클라이언트에서 ssh-keygen 으로 비밀키공개키를 생성하고, 접속하는 서버 계정 밑에 클라이언트 공개키를 저장하면 ssh 접속시 비밀번호 응답 없이 처리되어 로그인 할 수 있다.

1. ssh 클라이언트

클라이언트에서 개인 비밀키를 생성한다. ssh-keygen 명령은 기본적으로 비밀키와 공개키 파일을 사용자 홈디렉토리 ~/.ssh 폴더에, 기본 파일이름 id_rsa.pub, id_rsa.prb 파일로 저장한다.

1
(CLIENT)$ ssh-keygen -t rsa -b 4096 -C "USER@localhost"

2. ssh 서버

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@server"

서버에 공개키 배포

클라이언트에 생성한 공개키 id_rsa.pub 파일을 업로드해서 ./ssh/authorized_keys 파일에 추가해야 한다. 보통 scp 명령으로 복사해서 authorized_keys 파일에 더해주면 된다.

일반적으로 scp 명령으로 복사하고, 서버에 ssh 접속해서 업로드한 공개키 파일을 authorized_keys 파일에 더해준다.

1. 클라이언트에서 복사하기:

1
scp ~/.ssh/id_rsa.pub USER_ID@HOST_NAME:~/client.pub

ssh로 서버에 로그인한다.

2.서버 authorized_keys 붙여넣기:

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

위 2 과정을 아래 명령 한 줄로 복사->붙여넣기를 동시에 할 수 있다.

클라이언트:

1
cat ~/.ssh/id_rsa.pub | ssh <USERNAME>@<IP-ADDRESS> 'cat >> .ssh/authorized_keys'

이제 해당 서버로 로그인해 본다.

ssh config 사용하기

사용자를 위한 ssh 구성을 하려면 ~.ssh/config 설정 파일을 이용한다.

keep alive session

ssh 접속시 옵션을 주어 세션 유지 시간을 지정할 수 있다.

ServerAliveInterval 사용

접속시 ServerAliveInterval=TICK를 사용하면 TICK초 마다 한번씩 ServerAliveInterval를 보낸다.

옵션을 직접 사용하거나 ~/.ssh/config 설정 파일에 지정해 둘 수 있다.

ssh 접속시 -o 옵션으로 지정한다.

1
ssh -o ServerAliveInterval=10 192.168.0.1

~/.ssh/config 이용

사용자의 ssh 설정 파일은 ~/.ssh/config 이다.

1
2
3
4
5
# For all hosts
ServerAliveInterval 20
# For a selection of hosts
Host 192.168.0.1 192.168.1.1
ServerAliveInterval 20

시스템 전체에 적용한다면 /etc/ssh_config 에 (혹은 데비안 계열은 /etc/ssh/ssh_config) 지정해도 된다.


## sshfs

원격 호스트에서 작업중인 소스등을 편집하는데 터미널로 접속해 vim, nano 같은 편집 도구를 이용할 수 있지만, 개발 컴퓨터에서 손에 익은 GUI 개발 도구를에서 개발하고 편집해서, 원격 호스트에서 실행하는 방법을 선호해서 sshfs를 이용하고 있다.

보통 Sublime Text, TextMate 등의 에디터에서 파이썬 등의 프로그래밍 코드를을 작성하고 sshfs를 이용해 원격 디렉토리에 저장하는 방법을 사한다.

설치

Ubuntu/Debian

1
$sudo apt install sshfs

Mac OS X

Mac OS X Fuse 설치

sshfs 설치후 재시동 필요.

Window

다음 설치 파일을 받아 설치한다.
https://win-sshfs.googlecode.com/files/win-sshfs-0.0.1.5-setup.exe

Mac OS X 사용

Mac OS X에서는 OSXFuse를 사용해서 사용자 계정에서 sshfs를 이용한다. 그래서 sudo 명령을 사용하지 않는다.

1
$ sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

sudo 명령을 이용해서 마운트할 경우 마운트 포인트를 찾지 못해서 다음 같은 에러가 난다.

1
2
$ ls
ls: odoomodules: No such file or directory

Ubunto/Debian

1
sudo sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

사용후 언마운트는 다음과 같다.

1
$sudo umount /Volume/remote

마운트 고정: Mac OS X

https://amaral.northwestern.edu/resources/guides/mounting-remote-folder-os-x-over-ssh

파일 /etc/fstab

1
sshfs#USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote
DS_Store 파일

OS X는 파일을 다룰 때 .DS_Store 파일로 폴더를 지저분하게 한다. 이것을 비활성화 할 수 있다.
마운트할 때 noappledouble 옵션을 사용한다.

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

Mounting an OSX SSH Volume using FUSE and SSHFS

ssh authentication

1
sudo sshfs -o IdentityFile=~/.ssh/id_rsa USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

자주사용하는 sshfs 명령

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

sshfs options

sshfs 구현마다 조금 다르지만 https://linux.die.net/man/1/sshfs 에서 옵션 내용을 조금 살펴보자:

  • -o reconnect : reconnect to server
  • -o delay_connect : delay connection to server
  • o sshfs_sync: synchronous writes
  • -o no_readahead: synchronous reads (no speculative readahead)
  • -o sshfs_debug: print some debugging information
  • -o cache=BOOL: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N: sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N: sets timeout for {stat,dir,link} cache
  • -o workaround=LIST: colon separated list of workarounds
  • none: no workarounds enabled
  • all: all workarounds enabled

cache

느린 네트워크에서는 캐시를 끄고 사용하는게 좋겠다.

  • -o cache=YESNO: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N : sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N : sets timeout for {stat,dir,link} cache

보증된 네트워크에서 암호화 없이 mount

sshd 가 암호화를 지원하는 상황에서 안된다.

안전한 네트워크에서는 Ciphers, Compression 옵션을 사용 ^Blazingly fast sshfs 하면 빠른 속도를 얻을 수 있다.

1
sshfs -o Ciphers=arcfour -o Compression=no server://some/folder /mnt/some_local_folder
  • Ciphers=arcfour : 빠른 암호화 메서드, 다만 안전하지 않다.
  • Compression : ssh 내장 압축 사용하지 않는다.

rsync 에도 사용할 수 있다.

1
rsync -e"ssh -c arcfour -o Compression=no" ...rest of rsync cmd...

TCP Optimization

MTU(Maximum Transmission Unit)

네트워크 인터페이스에서 세그먼트 없이 보낼수 있는 최대 데이터그램 크기 값입니다. 만약 데이터가 MTU 값 이상이라면 여러개의 패킷으로 분할이 될 것입니다. 간단하게 보자면 MTU 는 패킷이 한번에 보낼 수 있는 최대 크기라고 볼 수 있습니다.

이더넷의 MTU 값은 일반적으로 1500 바이트이며 옛날에 모뎀을 통해 접속하던 PPPoE 연결은 1492 바이트를 가지고 있습니다.

MTU 는 각 패킷 프레임안에 최대 전송할 수 있는 값 MSS(Maximum segment size) 가 정의되어 있습니다. 그렇다면 MTU는 MSS + TCP/IP 헤더 크기가 될 것이고 반대로 MSS 는 MTU - 40 바이트가 됩니다. 40 바이트는 IP 와 TCP 헤더 20 바이트씩을 뜻합니다.

Linux

리눅스에서 MTU 값은 ifconfig 명령으로 확인할 수 있다.

1
2
3
4
5
6
7
8
9
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr b8:27:eb:c8:5f:4b
inet addr:220.121.140.239 Bcast:220.121.140.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fec8:5f4b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1633606 errors:0 dropped:44758 overruns:0 frame:0
TX packets:73808 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85875027 (81.8 MiB) TX bytes:22615535 (21.5 MiB)

기본 MTU가 1500인데 이 값을 조정하려면 sudo ifconfig 명령으로 할 수 있다.

1
$ sudo ifconfig eth0 mtu 9000

재시동 후에도 지속적으로 MTU 값을 유지하고 싶으면 /etc/network/interfaces 에 명시하면 된다.

1
2
3
4
5
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
mtu 9000
링크

MTU

SSHFS-MUX

http://www.linux-magazine.com/Issues/2014/165/SSHFS-MUX

Error

에러 mount_osxfuse: the file system is not available (255)

There appears to be a problem loading the KEXT installed by the regular osxfuse Homebrew package. You can use brew cask to install the official FUSE for OS X build from their own DMG:

1
2
3
brew rm osxfuse
brew install caskroom/cask/brew-cask
brew cask install osxfuse

참조

ssh 관련 사용 옵션

SSH Usages

Ssh timeout

ssh를 사용시 접속 시간이 지나면 자동 끎김을 막아주는 옵션들이 있다.

운영하는 서버는 보안상 alive 메시지를 모두 막아 두었다.
다만, ssh 접속시 ServerAliveInterval 을 사용해서 클라이언트가 alive 메시지를 서버에 있다.

sshd

sshd 데몬은 클라이언트 접속후 sshd_config에 구성한 설정데로 alive 메시지를 클라이언트에 주고 받아 접속 시간을 연장할 수 있다. 아래 그림 [^1]

1
2
3
4
5
6
7
8
9
10
11
# alive 메시지 사용 결정
#TCPKeepAlive yes # 기본 yes.

# 클라이언트가 살아있는지 확인하는 간격.
ClientAliveInterval 60 # 기본 0.
# 클라이언트에서 응답이 없을 때 메시지를 보내는 횟수
ClientAliveCountMax 3 # 확인 횟수

# Login Prompt에서 사용자 입력을 기다리는 시간을 초 단위로 입력.
LoginGraceTime 20 #( 1m: 기본 1분지정, 0은 시간제한없음)

ssh 옵션

ssh 사용시 /etc/ssh/ssh_config 구성 파일에 있는 ServerAliveInterval 옵션을 사용하면 ssh 접속시 alive 메시지를 서버가 클라이인트에게 주어진 시간 간격으로 보낸다.

[그림. ServerAliveInterval]

ssh_config 파일에 구성하거나 ssh 사용시 -o ServerAliveInterval 옵션을 사용하는 방법 두 가지가 있다.

ssh -o

ServerAliveInterval option every time you’re connecting to a server by using the -o ServerAliveInterval= prefix as the following example;

1
ssh -o ServerAliveInterval=300 user@example.com

key파일 사용

키파일 이용

키파일을 원하는 위치에 복사하고 퍼미션을 400으로 조정합니다. (저는 ~/Desktop/key/로 정했습니다.)

1
$ chmod 400 ~/Desktop/key/keyfile.pem

터미널에서 키파일 옵션을 추가한 명령으로 ssh 접속

1
$ ssh -i ~/Desktop/key/keyfile.pem ec2-user@[서버 아이피 또는 도메인]

포트가 다르다면

1
$ ssh -i ~/Docments/cloud-server.pem root@220.11.11.173 -p 8888

서버 키 생성

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@server"

scp -i /Documents/ncloud-key/qkbooo-ncloud.pem ~/.ssh/id_rsa.pub root@210.89.190.173:/ -p 2525

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

포트변경 사용

rsync 포트 사용

rsync에서 다른 ssh 포트를 사용하고 있을 경우 아래와 같이 옵션을 붙여준다.

1
$ rsync -e 'ssh -p 0000'

혹은

1
rsnyc --rsh'=ssh -p0000'

참조

[^1]: How to keep your ssh connection