ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Windows 클라이언트 , Linux 서버 간의 SMB (공유파일) 설정방법 (100% 구동확인) (2)
    개발/개발환경구축 2020. 3. 11. 10:34

    (1)편에서 ssh를 다운로드 받았고, 내용들을 진행했다고 가정하에 진행합니다.

    https://mytory.tistory.com/2

     

    Windows 클라이언트 , Linux 서버 간의 SMB (공유파일) 설정방법 (100% 구동확인) (1)

    작성자는 제한된 정보속에서 일주일간 삽질한 끝에 smb 구동에 성공했네요. 부디 저처럼 삽질하지 말라는 의미로 구동법을 공유합니다. 여러분의 시간은 소중하니까요. -----------------------------------------..

    mytory.tistory.com

     

    +2022-11-20 내용 소량 수정 및 작동 확인 완료


    windows 클라이언트 설정

     

    1.smb 활성화

     

    기본적으로 smb가 막혀 있기 때문에 먼저 활성화 해야합니다.

     

    Windows 기능 켜기/끄기 검색창에 쓰고 열어줍니다

     

     

    SMB Direct를 해제하고

    SMB 1.0/CIFS 파일 공유 지원을 체크한뒤 확인을 누르면 됩니다.

    재부팅은 다른 설정 하고 또 해야 하니 그냥 끝냅니다.

     

    linux 에서 기본적으로 사용하는 smb는 smb 1버전입니다.

    (설정에 따라 v2,v3으로 사용이 가능하다고 합니다.)

     

    SMB Direct를 해제한 이유는

    간혹, 서버 에서 SMB 정보를 가져오는 중에

    이 smb가 1버전인지 2, 3버전인지 분간을 못해서

    연결에 실패하는 경우가 종종 있다고 합니다.

     


     

    2.방화벽 해제

     

    제어판>시스템 및 보안>Windows Defender 방화벽>고급 설정>인바운드 규칙

     

    옆에 체크표시가 없으면 그냥 두면 됩니다.

    만일 체크표시가 되어있다면 위의

    '규칙 사용' 버튼 위치에있을 '규칙 사용 안함' 을 클릭해주세요.

     

    ...이론적으로는 여기서 되야 맞겠지만 안됩니다 이거.

     

    해제 한 뒤에

    관리자 권한으로 cmd를 열어서 따로 포트를 개방합니다.

     

    복붙 하시면 됩니다.

     

    netsh advfirewall firewall delete rule name="파일 공유 TCP"

    netsh advfirewall firewall delete rule name="파일 공유 UDP"

    netsh advfirewall firewall add rule name="파일 공유 TCP" dir=in action=allow profile=any protocol=TCP localport=111,139,445

    netsh advfirewall firewall add rule name="파일 공유 UDP" dir=in action=allow profile=any protocol=UDP localport=111,137,138

    dism /online /enable-deature /featurename:SMB1Protocol

     

     

    작성자의 경우.

     

    그냥 방화벽을 꺼버렸습니다.

     


     

    3.루프백 만들기

     

    일단. 다른 블로그에서 많이 봤을 LoopBackAdapter를 설치하겠습니다.

     

    가장 위에있는 장치를 클릭한뒤에

    동작(A) 버튼에 있는 레거시 하드웨어 추가 버튼을 누릅니다.

     

    설정을 하겠습니다.

     

    제어판>네트워크 및 인터넷>네트워크 및 공유센터>어뎁터 설정 변경

     

    작성자는 이름을 임의로 loopback으로 변경해 놨습니다. 속성에 들어갑니다.

     

    저 두개를 빼고 다 체크 해제 합니다. smb에만 집중하게 하는것이 목적입니다.

     

    인터넷 프로토콜 4을 클릭한뒤에 속성으로 들어가서

     

    ip 주소는 자신이 쓰고 싶은것 마음대로 써도 됩니다.

    서브넷 마스크는 255.255.255.0을 지정 해야 합니다.

    DNS서버 같은 경우... smb 쓸꺼면 없어도 됩니다.

     

    고급을 눌러서

    WINS 항목에서

    NetBIOSE 체크표시만 수정 하면 하면 loopback 설정은 끝났습니다.

     


    4.서버 포트를 리다이렉트

    서버측에서 <임의 포트번호>를 445포트로 리다이렉트를 했었습니다.

    그 이유는 445번 포트가 윈도우즈에서 특정 프로그램이 할당중인 포트이기 때문에 연결이 막히기 때문입니다.

    클라이언트 측에서는 이 445번 포트를 <임의 포트 번호> 로 리다이렉트 하는 작업을 하겠습니다.

    다만 , 윈도우에서 사용하는 공유폴더 포트가 445번과 139로 두개가 있고

    둘중에 어느쪽의 포트가 사용될지는 알 수 없기 때문에 둘다 리다이렉트 하겠습니다.

     

    cmd 를 관리자 권한으로 열고 입력합니다

     

    netsh interface  portproxy add v4tov4 listenaddress=<루프백 아이피> listenport=445 connectaddress=<루프백 아이피> connectport=<서버에서 지정했던 임의 포트 번호>

     

    netsh interface  portproxy add v4tov4 listenaddress=<루프백 아이피> listenport=139 connectaddress=<루프백 아이피> connectport=<서버에서 지정했던 임의 포트 번호>

     

    나중에 복구는 이 명령어로 합니다.

     

    netsh interface portproxy delete v4tov4 listenaddress=<루프백 아이피> listenport=445

     

    이제 관련값들 설정이 끝났습니다. 재부팅합니다.

     


    5.ssh 터널링

     

    이제 하나만 하면 됩니다. puTTy를 실행합니다.

     

    아이피와 키를 입력한뒤 (방법은 1번글 확인)

    Tunnels로 가서

     

    Surce port 에는 <루프백 아이디>:<서버에서 지정했던 임의 포트 번호>

    Destination 에는 127.0.0.1:445 를 적어서 Add 버튼을 눌러줍니다.

    작성자의 경우는 이렇습니다.

     

    이제 puTTy로 리눅스에 접속해서 접속을 유지해 둡니다.

     


    6.연결하기

     

    내 PC 로 갑니다.

     

     

     

     

    \\<루프백 ip>\<서버에서 smb.conf 만질때 추가했던 [smb 이름]>

    '로그인할때 다시 연결' 기능을 사용하고 싶다면 3번글을 보실 것을 추천합니다.

     

    아이디:smb.conf수정할때 valid user 에 적었던 유저이름

    비밀번호:smbpasswd 로 설정했던 비밀번호.

     

    smb 접속에 성공합니다.

     

     

     


     

    원리 설명

     

    *여기에서 쓰는 ip는 쉬운 이해을 위해서 가상으로 지정한 ip 입니다.*

     

    네트워크 드라이브 연결을 누르고 확인버튼을 누르면 발생하는 일입니다.

     

    0.확인버튼을 클릭

    1.192.168.0.1:????(자신의 아이피:연결에 사용되는 포트)가 10.0.0.3:445 포트로 접속

    2.netsh 설정에 의해서 10.0.0.3:455 는 10.0.0.3:5445 포트로 포트 포워딩됨(마이크로 소프트가 막은 445 포트를 우회)

    3.ssh 가 터널링으로 이 10.0.0.3.5445를 인지하고 연결되어있는 리눅스 서버로 전달해줌

    4.리눅스의 iptables 에서 5445번 포트를 445번 포트로 포트 포워딩

    5.결론적으로 10.0.0.3:455 포트가 입력됨에 따라 445번 포트를 사용하는 smb에서 확인하여 응답을 내보냄.

    6.172.16.77.88:445(리눅스의 아이피)가 전송신호를 보내고 이를 ssh 터널링에서 127.0.0.1:445으로 전송됨

    f.127.0.0.1 은 로컬호스트. 즉 윈도우 클라이언트 자기 자신을 뜻하므로 결론적으로 192.168.0.1:445로 전송된것과 같고

    445포트의 신호를 기다리던 네트워크 드라이브 연결측으로 신호가 잡힘에 따라 smb 연결에 성공함.

     

    ---------------------------------------------------------------------------------------------------

     

    Bonus!: 작성자는 실패한 루트 (하지만 다른 환경이라면 될 가능성 높음)

     

    위의 논리대로라면 SSH 없이도 smb 연결이 가능하며

    재부팅시마다 smb를 설정할 필요가 없을 수도 있습니다.

     

    aws 는 의 리전에 따라서 이 방법은 불가능 할수도 있습니다.

     

    AWS EC2의 경우엔 router 가 특정 ISP 사측을 경유해서 갑니다.

    일반적인 통신이라면 ISP 측이 리눅스 서버와 윈도우 클라이언트측 사이에서 통신을 중재합니다.

    그래서 리눅스 측과 윈도우 측의 설정이 틀리지 않을지라도 중간에서 신호를 차단하기 때문에

    AWS 같은 경우엔 내부 인스턴스 끼리는 신호를 주고받을순 있어도 외부 데이터와는 안됩니다.

    리눅스에 sudo sysctl -w net.ipv4.icmp_echo_ignore_all=0 를 입력해서 핑을 허용한뒤

     

    윈도우 서버에서 핑을 보내 보세요.

     

    요청 시간이 만료되었습니다.
    요청 시간이 만료되었습니다.
    요청 시간이 만료되었습니다.
                  의 응답: 대상 네트워크에 연결할 수 없습니다.

     

    경유지에서 막히는군요.

     

    Q: ssh 연결은 잘되는 데요?

     

    A: 특정 신호 설정들은 ISP 측에서 열어 둬서 연결이 됩니다.

    위의 설정은 윈도우 > ssh 터널링 > linux 로 ISP측을 돌아서 연결되기 때문에 가능하다고 생각합니다.

     

    만일 사설 Linux서버를 사용하신다면 시도해 보세요.

     

    작성자의 가설은 이렇습니다.

     

    0.확인버튼을 클릭

    1.192.168.0.1:????(자신의 아이피:연결에 사용되는 포트)가 10.0.0.3:445 포트로 접속

    2.netsh 설정에 의해서 10.0.0.3:455 는 172.16.77.88:5445 리눅스 주소로 리다이렉트됨

    3.리눅스의 iptables 에서 5445번 포트를 445번 포트로 포트 포워딩

    4.결론적으로 10.0.0.3:455 포트가 입력됨에 따라 445번 포트를 사용하는 smb에서 확인하여 응답을 내보냄.

    5.iptables에서 172.16.77.88:455 신호를 192.168.0.1:445 윈도우 주소로 리다이렉트함

    f.445포트의 신호를 기다리던 네트워크 드라이브 연결측으로 신호가 잡힘에 따라 smb 연결에 성공함.

     

    iptable에서 특정 포트를 특정 ip로 리다이렉트로 명령어는 다음과 같습니다.

    >sudo iptables -A OUTPUT -t nat -p tcp --dport 445 -j DNAT --to-destination 192.168.0.1:445

     

     

    결론: 집에서는 445 를 못나가게하고.. 5445로 변장해서 가는 길목엔 파수꾼이 있으니 ssh 길목으로 뺑돌아서 갈수밖에..

     

    Q:어? 폴더 쓰기가 안돼요!

    A:selinux 보안에 막힌겁니다. 앞서 셀리눅스를 끄는 것이 찝찝했다면 삼바 폴더에 예외를 둘수도 있습니다.

    getenforce 

    chcon -t samba_share_t 디렉토리경로 

    semanage fcontext -a -t samba_share_t 디렉토리경로 

     

    복구

    restorecon -R -v 디렉토리 경로 

    setsebool -P samba_export_all_rw on

    댓글

개발에 관심을 가지는 블로그