๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ ์ถํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์๋ ํ ํ๋ฆฟ์ ์์ฑํ์ง ์์ผ๋ฉด ์ด ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
ttn ๋จธ์ ์์ ์ํ์น๊ฐ ์ค์น๋๊ณ ํ์ฑํ๋ ๋(80/443 ์์ ) ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
TTN ์ฝ์์ 80/443 ํฌํธ์์ ์ฐจ๋จ๋๊ณ 1885,8885 ํฌํธ์์ ์๋ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ์ธ์ฆ์๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ TTN ์คํ๊ณผ ์ผ๋ถ DB/์น ์ฑ์ ๋์ผํ ์ฅ์น์ ๋ฐฐ์นํ๋ ค๋ ๊ฒฝ์ฐ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ํฉ์
๋๋ค.
https://github.com/TheThingsNetwork/lorawan-stack/issues/1731
TTN์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค: ๋๋ฝ๋ ์ธ์ฆ์/๋๋ ํธ์คํธ๊ฐ ํ์ดํธ๋ฆฌ์คํธ์ ์์ต๋๋ค.
1) Apache๊ฐ ํ์ฑ ์ํ์ผ ๋(80, 443์์ ์์ ) ํฌํธ ๊ตฌ์ฑ - ttn ์คํ์ 80, 443 ํฌํธ๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค(80,443์ # docker-compose.yml์์ #์ด์ด์ผ ํจ - ํฌํธ 1885, 8885๊ฐ ์ฌ์ฉ๋จ) . ์ด๊ฒ์์ (docker-compose๋ letsencrypt ์ธ์ฆ์๋ฅผ ์ป์ง ๋ชปํฉ๋๋ค).
docker-compose.yml
ํ์ผ:
ports:
(hashed) - '80:1885'
(hashed) - '443:8885'
- '1882:1882'
- '8882:8882'
- '1883:1883'
- '8883:8883'
- '1884:1884'
- '8884:8884'
- '1885:1885'
- '8885:8885'
- '8886:8886'
- '1887:1887'
- '8887:8887'
- '1700:1700/udp'
env_file: '.env'
.env
ํ์ผ์ด ํฌํธ๋ฅผ 443 ๋์ 8885๋ก ์ด๋ํ์ต๋๋ค.
TTN_LW_IS_EMAIL_NETWORK_CONSOLE_URL=https://subdomain.example.com:8885/console
TTN_LW_IS_EMAIL_NETWORK_IDENTITY_SERVER_URL=https://subdomain.example.com:8885/oauth
TTN_LW_IS_OAUTH_UI_CANONICAL_URL=https://subdomain.example.com:8885/oauth
TTN_LW_IS_OAUTH_UI_IS_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_OAUTH_AUTHORIZE_URL=https://subdomain.example.com:8885/oauth/authorize
TTN_LW_CONSOLE_OAUTH_TOKEN_URL=https://subdomain.example.com:8885/oauth/token
TTN_LW_CONSOLE_UI_CANONICAL_URL=https://subdomain.example.com:8885/console
TTN_LW_CONSOLE_UI_AS_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_UI_GS_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_UI_IS_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_UI_JS_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_UI_NS_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_UI_EDTC_BASE_URL=https://subdomain.example.com:8885/api/v3
TTN_LW_CONSOLE_UI_QRG_BASE_URL=https://subdomain.example.com:8885/api/v3
2) ์ฐ๋ฆฌ๊ฐ:
์ํ์น ์ค์ง (์๋น์ค apache2 ์ค์ง)
ํ์ฑํํ๋๋ก ttn-stack์ ์ฌ๊ตฌ์ฑํฉ๋๋ค(80, 443 ํฌํธ - ์ ๊ฑฐ(ํด์))
์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ํ์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํ๋ฉด ์ธ์ฆ์๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค(80/443 ํฌํธ์์).
docker-compose.yml
ํ์ผ:
ports:
- '80:1885'
- '443:8885'
- '1882:1882'
- '8882:8882'
- '1883:1883'
- '8883:8883'
- '1884:1884'
- '8884:8884'
(hashed) - '1885:1885'
(hashed) - '8885:8885'
- '8886:8886'
- '1887:1887'
- '8887:8887'
- '1700:1700/udp'
env_file: '.env'
.env
ํ์ผ ํ์ค ํฌํธ 443 ์ฌ์ฉ - ์ด ๊ฒฝ์ฐ ttn์ letsencrypt ์ธ์ฆ์๋ฅผ ์ป์ต๋๋ค.
TTN_LW_IS_EMAIL_NETWORK_CONSOLE_URL=https://subdomain.example.com/console
TTN_LW_IS_EMAIL_NETWORK_IDENTITY_SERVER_URL=https://subdomain.example.com/oauth
TTN_LW_IS_OAUTH_UI_CANONICAL_URL=https://subdomain.example.com/oauth
TTN_LW_IS_OAUTH_UI_IS_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_OAUTH_AUTHORIZE_URL=https://subdomain.example.com/oauth/authorize
TTN_LW_CONSOLE_OAUTH_TOKEN_URL=https://subdomain.example.com/oauth/token
TTN_LW_CONSOLE_UI_CANONICAL_URL=https://subdomain.example.com/console
TTN_LW_CONSOLE_UI_AS_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_UI_GS_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_UI_IS_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_UI_JS_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_UI_NS_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_UI_EDTC_BASE_URL=https://subdomain.example.com/api/v3
TTN_LW_CONSOLE_UI_QRG_BASE_URL=https://subdomain.example.com/api/v3
3) ์ด์ ์ธ์ฆ์๋ฅผ ์ ๋ฐ์ดํธํ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ๊ตฌ์ฑ(์ํ์น์์ ์ฌ์ฉํ๋ ํฌํธ 80/443, ์ฝ์์ 1885/8885 ์ฌ์ฉ)์ผ๋ก ๋ค์ ์ ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ https://subdomain.domain.com ์์ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฆฐ ์ฝ์:8885 /.
...
...
...
๋์ผํ ์์คํ ์์ ttn๊ณผ apache๋ฅผ ๋ชจ๋ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?๋๋ ๊ฐ์ ๋ก ์ํธํํ์ฌ ๋ค๋ฅธ ํฌํธ์์ ์ธ์ฆ์ ๋ฐ๋๋ก ํ์๊ฒ ์ต๋๊น?
...
์ญ๋ฐฉํฅ ํ๋ก์ ๋ค์์ The Things Stack์ ์คํํ ๋ ๊ตฌ์ฑ์์ TLS๋ฅผ ์์ ํ ๋นํ์ฑํํ๊ณ ํ๋ก์๊ฐ ๋ชจ๋ TLS ์ฐ๊ฒฐ(HTTP๋ฟ๋ง ์๋๋ผ gRPC, MQTT ๋ฑ)์ ์ข ๋ฃํ๋๋ก ํด์ผ ํฉ๋๋ค. Things Stack์ ๋ชจ๋ TLS ์์ ๊ธฐ๋ฅผ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ญ ํ๋ก์์์ ๋งคํํด์ผ ํ๋ ํฌํธ๋ฅผ ๋ฌธ์ํํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ํ ์ฌ๋๋ค์ด ๊ทธ๋ค์ ํ๋ก์๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ด๋ฏธ ์๊ณ ์๋ค๊ณ ๊ธฐ๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ apache/nginx/haproxy/envoy/etc๋ก ์ด๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌธ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์๋ ํ์ธ์ @htdvisser๋ , ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค.
๊ณต์ฉ/๊ณ ์ IP ์ฃผ์(LTE ๊ธฐ๋ฐ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ์ปดํจํฐ์์ ํ
์คํธํ์ต๋๋ค. ๋คํธ์ํฌ ๊ตฌ์กฐ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ ์ธํฐ๋ท ์ธก์์ ์ง์ VPS(ovh.eu)๋ฅผ ํ
์คํธํ์ต๋๋ค. ๊ณต๊ธ์์ ๋ฐ๋ฅด๋ฉด ํ๋ก์์ ๋ฐฉํ๋ฒฝ์ด ์์ต๋๋ค(์ผ๋ถ DoS๋ง).
๋ ๋ณํ ๋ชจ๋ ๋์ผํด์ผ ํฉ๋๋ค(๊ฐ ํด๋ผ์ด์ธํธ/IP ์คํ
์ด์
์ ๋ํ ํ์ค 80/443 ํฌํธ์์ ์ธ์ฆ์ ์ด๊ธฐํ).
๋์ค์ ์ฝ์์ ๋ค๋ฅธ ํฌํธ(1885/8885)๋ก ์ ํํ ์ ์์ต๋๋ค.
๋คํธ์ํฌ ๊ตฌ์กฐ์ ๊ด๊ณ์์ด VPS ๋๋ ๋ชจ๋ ๊ณต์ฉ/๊ณ ์ IP ์ฅ์น์ ๊ด๋ จํ์ฌ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ ์ "์ฝ์ ๋ก๊ทธ ํ๋ฉด"์ ๋ณด๋ TTN ์คํ์์ ๋ณด๊ณ ๋ "ํด์ปค ํ๋ ์๋"๊ฐ ๋ง์ด ์์ต๋๋ค(ํ๋ฉด์๋ ํ์ค http/htts ํฌํธ์ ๋ํ ์น ๊ณต๊ฒฉ๋ง ํ์๋จ). ๋๋ฉ์ธ/ํ์ ๋๋ฉ์ธ์๋ dns ๋ ์ฝ๋๋ง ์๊ณ ๋ก๋ด/๊ฒ์ ์์ง์ด ๊ฒ์ํ ์ ์๋ ์นํ์ด์ง์ ์ฌ์ฉ๋์ง ์์์ต๋๋ค. ๋๋ ํด์ปค ๋ก๋ด์ด ์๋ต ์ฅ์น์ ๋ํ ๋ชจ๋ ๊ณ ์ IP4 ์ฃผ์๋ฅผ ๊ฒ์ํ๊ณ ์กฐ๋ง๊ฐ ์ฅ์น๋ฅผ ์ฐพ์ ํด์ปค ๊ธฐ๊ณ์ ์ํด ๊ณต๊ฒฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ฐ๋ผ์ 100% ์์ ํ๋๋ผ๋ ์๋ ค์ง http/https ํฌํธ์ ๋ํ ๋๊ท๋ชจ ๊ณต๊ฒฉ์ผ๋ก ์๋ฒ๋ฅผ ๋ฐ์๊ฒ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค.
์ฝ์/์น ์ธํฐํ์ด์ค์ 80/443 ํฌํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ๋งค์ฐ ํฉ๋ฆฌ์ ์ด๋ฉฐ TTN ์คํ ์ฝ์์ ๋ํด ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ด๋ฆฌ ๋ชฉ์ (๊ณต๊ฐ ์๋)์ด๋ฉฐ ๊ด๋ฆฌ์๋ ์ด ์ค์ ์ ์๊ณ ์์ต๋๋ค.
์ ์ผํ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ณํ A) ๋ค๋ฅธ ํฌํธ์์ acme/letsencrypt ์ธ์ฆ์๋ฅผ ์๋์ผ๋ก ์์ฑ/์๋ก๊ณ ์นจํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
๊ณํ B) ๊ด๋ฆฌ๋ฅผ ์ํด ์ต์ํ ๋ช ๊ฐ์ง ์๋ ค์ง ํธ์คํธ(์: ๊ณ ์ IP)์ ๋ํด ์ฌ๊ธฐ์ ์ค๋ช
๋ ์์ ์๋ ์ ์ฐจ๋ฅผ ์๋ํํ ์ ์์ต๋๊น?
ACME์ HTTP-01 ๋ฐ TLS-ALPN-01 ์ฑ๋ฆฐ์ง ์ฌ์์์๋ ํฌํธ 80/443์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์ฑ๋ฆฐ์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์๋ฅผ ์ป๊ฑฐ๋ ๊ฐฑ์ ํ ์ ์์ต๋๋ค.
certbot(์ด๋ ์ค๋ช ์ ๋ฒ์ ๋ฐ) ๋๋ ์ ๋ฃ ์ธ์ฆ ๊ธฐ๊ด(๋ํ ์ค๋ช ์ ๋ฒ์ ๋ฐ)๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ DNS-01 ์ฑ๋ฆฐ์ง๋ฅผ ์ฌ์ฉํ์ฌ ACME ์ธ์ฆ์๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ธ์ฆ์๊ฐ ์๋ ๊ฒฝ์ฐ "์ฌ์ฉ์ ์ง์ ์ธ์ฆ์" ์ง์นจ์ ๋ฐ๋ผ ์ฌ๋ฌผ ์คํ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. https://thethingsstack.io/v3.3.2/guides/getting-started/certificates/#custom -certificates ๋ฐ ๋ค์ ํ๊ฒฝ์์ :
TTN_LW_TLS_SOURCE=file
TTN_LW_TLS_CERTIFICATE=/path/to/cert-chain.pem
TTN_LW_TLS_CERTIFICATE=/path/to/key.pem
TLS ์ข ๋ฃ ํ๋ก์ ๋ค์์ ์คํํ๊ธฐ ์ํด Things Stack์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ํํ๊ธฐ ์ํด https://github.com/TheThingsNetwork/lorawan-stack/issues/1760 ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
Things Stack์์ ์ธ๋ถ์์ ์์ฒญํ ์ธ์ฆ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ํํ๊ธฐ ์ํด https://github.com/TheThingsNetwork/lorawan-stack/issues/1761 ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ฐ์ฌ ํด์
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ญ๋ฐฉํฅ ํ๋ก์ ๋ค์์ The Things Stack์ ์คํํ ๋ ๊ตฌ์ฑ์์ TLS๋ฅผ ์์ ํ ๋นํ์ฑํํ๊ณ ํ๋ก์๊ฐ ๋ชจ๋ TLS ์ฐ๊ฒฐ(HTTP๋ฟ๋ง ์๋๋ผ gRPC, MQTT ๋ฑ)์ ์ข ๋ฃํ๋๋ก ํด์ผ ํฉ๋๋ค. Things Stack์ ๋ชจ๋ TLS ์์ ๊ธฐ๋ฅผ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ญ ํ๋ก์์์ ๋งคํํด์ผ ํ๋ ํฌํธ๋ฅผ ๋ฌธ์ํํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ํ ์ฌ๋๋ค์ด ๊ทธ๋ค์ ํ๋ก์๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ด๋ฏธ ์๊ณ ์๋ค๊ณ ๊ธฐ๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ apache/nginx/haproxy/envoy/etc๋ก ์ด๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌธ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.