• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글

docker network를 host로 변경하려면 어떻게 해야 할까요?

th20ry 990

0

15

요약 :

nginx proxy manager를 우분투 도커에서 호스트로 쓰거나 타겟포트를 호스트로 퍼블리싱 하려면 어떻게 해야 할까요?

 

전문:

잊을만 하면 오는 행사 같은 느낌으로 

헤놀에 nginx proxyy manager 내부 ip가 차단되어버리더라구요. 

iptime으로 해외접속을 차단하기 전에는 한 두 달에 한 번 정도 있었던 것같은데

(공유기 바꾼지 한달 정도인데 해외접속 156만건 차단되었습니다 ;; ip가 맛집 ip인가?.. ㅇㅅㅇ;)

gmail에 nas에서 메시지 올때마다 심장이 두근두근 합니다...

"5분 이내에 로그인 시도를 10회 실패하여 192.168.0.33이 차단되었습니다." 

 

원인은 외부 ip 무엇으로 접근하든 npm이 설치된 192.168.0.33으로 접속되므로 그냥 10번 접속 실패하면 차단되어버리는 문제입니다.

여튼 문제를 해결하고자 없는 실력으로 찾아보니 

클리앙에서 해결방법을 찾게 되었습니다.

https://www.clien.net/service/board/cm_nas/14897342 by 이치로님 댓글

 

호스트 모드로 써보세요.
꽤나 오래된 문제죠... 전 오래전부터 겪어왔는데 이제 하나둘씩 경험하시니 반갑기도하고...
https://github.com/moby/moby/issues/15086
https://www.reddit.com/r/docker/comments/c1wrep/traefik_reverse_proxy_question_docker_overlay/
호스트로 쓰거나 타겟포트를 호스트로 퍼블리싱 해주면 되는 걸로 기억합니다. 근데 시놀에서는 80/443 충돌해서 도커 못올리죠? 그래서 이런 글이 ... https://www.clien.net/service/board/cm_nas/13753034 

 

헌데 portainer에서 npm_default를 host로 강제로 바꾸더라도 npm-app과 npm-db 사이에 통신 오류가 떠서 정상적으로 연결이 안되더라구요. 

iptables에 딱히 포트 막힌건 없고, 내부에 따로 뭐 방화벽이나 이런게 있는것도 없어서 문제를 모르겠습니다. 

그래서 아예 network_mode: host로 도커를 올려도 같은 오류가 떠서 접속이 불가하네요. 

 

설치환경은 

esxi로 photon os, xpenology 등등이 설치되어있고

photon os(esxi docker용 vm)에 nginx proxy manager 도커로 설치되어있으며 

npm 이미지는 jc21/nginx-proxy-manager 기본 이미지입니다.

혹여 아시는분 계시면 도움 부탁드립니다.

 

services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'

      MYSQL_PASSWORD: 'npm'

신고공유스크랩
15
th20ry 글쓴이 2022.07.02. 22:30
블랙앤해적

댓글 감사합니다. 덕분에 호스트모드 성공했습니다.

2등
th20ry 글쓴이 2022.07.02. 22:11

포트 3개만 열어서 쓰는걸로 일단은 결론 내렸습니다.

iptables -A INPUT -p tcp -m multiport --dports 80,81,443 -j ACCEPT

큰 문제 없기를 ㅜ.ㅜ;;

3등
dadami 2022.07.02. 22:33

3306 을 오픈하면 매우 골때리는 일이 발생합니다.

가장 좋은 방법을 알려드리자면,

지금 하신 모든걸 원복하시고,

시놀 설정 -> 보안 -> 일반 -> 신뢰할 수 있는 프록시 에 가셔서 도커 아이피를 적어보십쇼

 

th20ry 글쓴이 2022.07.02. 22:35
dadami

댓글 감사합니다.

dadami님 조언대로 닫았습니다.!

공유기 아래라 그냥 오픈했었는데, 아무리 생각해도 이거 디지털 자살행위가 맞는것같은데 확신을 주셔서 감사합니다.

조언하신대로 해보겠습니다. 감사합니다.

dadami 2022.07.03. 16:42
Lamanus

기본적으로 주는걸로 알고 있네요. 그래서 시놀설정 신뢰할 수 있는 프록시에 적어두면 원본아이피 대신 그 헤더 아이피(x-forwarded-for) 아이피로 동작합니다

데브파이 2022.07.04. 19:43

저도 얼마전 비슷한 경험으로 3일정도 고생했는데 지금은 해결했습니다.

제가 문제가 되었던건 real ip가 도커 브릿지 네트워크 IP로 인식되는 문제였는데요 다음과 같이 해결했어요

 

<환경>

1. 시놀로지 도커에 NPM(jc21이미지)이 설치된 상태임

2. 시놀로지 방화벽 활성화 상태임

 

<설정>

1. DMS > 제어판 > 보안 > 방화벽 > 방화벽 규칙 편집

2. 방화벽 규칙 생성 > 포트 모두 > 소스 IP (특정IP) > 서브넷 > 도커 IP대역 (172.16.0.0 / 255.255.0.0) > 작업/허용 > 확인 > 적용 <== 도커 IP대역은 도커 > 네트워크 > 네트워크 어뎁터 상세정보 열면 IP 대역 나옵니다.

2-Optional-1) SSH 접속후 iptables 추가

ssh> sudo iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

ssh> sudo iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL ! --dst 127.0.0.0/8 -j DOCKER

2-Optional-2) 신뢰할 수 있는 프록시 등록

제어판 > 보안 > 신뢰할 수 있는 프록시 등록 > 도커 IP (ex: 172.16.0.0/16 or 172.16.0.1)

3. SSH에서 npm 도커 접속 필요

ssh> sudo docker exec -it "도커 이름 or 도커ID" bash

4. npm 도커내 IP 확인

docker> apt update && apt install net-tools && ifconfig

5. npm nginx.conf 수정

docker> vi /etc/nginx/nginx.conf

5-1) 로그 포멧에 x_forwarded_for 구문 추가

log_format proxy 부분 수정 >> 마지막에 "$http_x_forwarded_for" 추가

log_format standard 부분 수정 >> 마지막에 "$http_x_forwarded_for" 추가

ex) ... "$http_user_agent" "$http_referer" "$http_x_forwarded_for"';

5-2) #Real IP Determination 설정 변경

#Local subnets 에 도커 IP대역 추가 <== 이부분도 2번 방화벽 규칙에 넣을때 찾은 IP대역을 넣으면 됩니다.

ex) 172.16.0.0./16 # Includes Docker subnet

5-3) real_ip_header 추가

#real_ip header X-Real-IP < == 주석처리

real_ip header X-Forwarded-For # 추가

esc > :wq

6. 도커 재시작

ssh> docker restart "도커 이름 or 도커 ID"

 

7. 헤더 확인 방법

 

7-1) Webstation 설치후 테스트 용 php 파일 웹서버로 등록

 

index.php

 

foreach (getallheaders() as $name => $value) {

echo "$name: $value
";

}

 

 

7-2) npm에서 도메인 등록후 접속 결과 확인

 

잘 되셨으면 좋겠어요~

th20ry 글쓴이 2022.07.05. 01:06
th20ry

음... 알려주신대로 순서대로 다 수행했는데

원래는 photon os ip 가 나오던 것에서 이제는 192.168.0.1 (공유기 gateway ip)로 나오는걸로 변경되었네요.

특별히 차이날만한건 2-1) -> 헤놀, photon os 둘 다 처리함 / 3,4,5,6을 portainer console로 접근해서 수정 및 도커 재부팅한건데 제가 알기로는 이 두 개가 결과가 다를거라고 생각되지는 않는데요 ㅇㅅㅇ;;

여튼 내공을 더 쌓고, 다음에 시간날 때 같은 방식으로 다시 시도해봐야겠습니다. 감사합니다!

데브파이 2022.07.05. 09:27
th20ry

공유기 IP (게이트 웨이) 가 나오는건 아마도 내부망에서(wifi 또는 cable) 접속하셔서 그런거 같아요

내부망에서는 loopback 때문에 게이트 웨이 IP가 나오는게 정상입니다.

혹시 셀룰러로 접속하시거나 외부 인터넷에서 접속하셔서 보시면 아마도 외부 IP가 표기 될꺼 같아요.

th20ry 글쓴이 2022.07.05. 14:15
데브파이

제목 없음.jpg

오 VPN 써서 접속해보니까 정상 작동하네요! 

말씀하신대로 공유기 내부에서 접속해서 그랬었나 봅니다. 

감사합니다!

profile image
당근이지 2022.07.07. 09:51

이거 DSM에서 리버스프록시로 잡을수도 있지 않나요.

저의 경우 두개의 도메인을 쓰는데 DSM에서 이건 이쪽 저건 저쪽 하고..설정해 두니 정상적으로 되더군요.

th20ry 글쓴이 2022.07.07. 12:43
당근이지

댓글 감사합니다.

시놀 외에 다른 서비스들(거의 없지만)이 독립적으로 작동시키고 싶어서 npm 사용하고 있습니다.

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story

등록된 글이 없습니다.