docker network를 host로 변경하려면 어떻게 해야 할까요?
요약 :
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'
network_mode: "host"
이렇게 하면 될겁니다
댓글 감사합니다. 덕분에 호스트모드 성공했습니다.
포트 3개만 열어서 쓰는걸로 일단은 결론 내렸습니다.
iptables -A INPUT -p tcp -m multiport --dports 80,81,443 -j ACCEPT
큰 문제 없기를 ㅜ.ㅜ;;
3306 을 오픈하면 매우 골때리는 일이 발생합니다.
가장 좋은 방법을 알려드리자면,
지금 하신 모든걸 원복하시고,
시놀 설정 -> 보안 -> 일반 -> 신뢰할 수 있는 프록시 에 가셔서 도커 아이피를 적어보십쇼
댓글 감사합니다.
dadami님 조언대로 닫았습니다.!
공유기 아래라 그냥 오픈했었는데, 아무리 생각해도 이거 디지털 자살행위가 맞는것같은데 확신을 주셔서 감사합니다.
조언하신대로 해보겠습니다. 감사합니다.
npm에서 ip헤더를 전달하면 되지 않을까요?
아쉽게도 초보라 할 줄 몰라서요ㅜㅜ
기본적으로 주는걸로 알고 있네요. 그래서 시놀설정 신뢰할 수 있는 프록시에 적어두면 원본아이피 대신 그 헤더 아이피(x-forwarded-for) 아이피로 동작합니다
저도 얼마전 비슷한 경험으로 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에서 도메인 등록후 접속 결과 확인
잘 되셨으면 좋겠어요~
감사합니다. 알려주신대로 해보겠습니다"
음... 알려주신대로 순서대로 다 수행했는데
원래는 photon os ip 가 나오던 것에서 이제는 192.168.0.1 (공유기 gateway ip)로 나오는걸로 변경되었네요.
특별히 차이날만한건 2-1) -> 헤놀, photon os 둘 다 처리함 / 3,4,5,6을 portainer console로 접근해서 수정 및 도커 재부팅한건데 제가 알기로는 이 두 개가 결과가 다를거라고 생각되지는 않는데요 ㅇㅅㅇ;;
여튼 내공을 더 쌓고, 다음에 시간날 때 같은 방식으로 다시 시도해봐야겠습니다. 감사합니다!
공유기 IP (게이트 웨이) 가 나오는건 아마도 내부망에서(wifi 또는 cable) 접속하셔서 그런거 같아요
내부망에서는 loopback 때문에 게이트 웨이 IP가 나오는게 정상입니다.
혹시 셀룰러로 접속하시거나 외부 인터넷에서 접속하셔서 보시면 아마도 외부 IP가 표기 될꺼 같아요.
오 VPN 써서 접속해보니까 정상 작동하네요!
말씀하신대로 공유기 내부에서 접속해서 그랬었나 봅니다.
감사합니다!
이거 DSM에서 리버스프록시로 잡을수도 있지 않나요.
저의 경우 두개의 도메인을 쓰는데 DSM에서 이건 이쪽 저건 저쪽 하고..설정해 두니 정상적으로 되더군요.
댓글 감사합니다.
시놀 외에 다른 서비스들(거의 없지만)이 독립적으로 작동시키고 싶어서 npm 사용하고 있습니다.
cmt alert