KKuTu
KKuTu copied to clipboard
WAF 서비스 관련 설정 추가
PR 설명
최근 끄투 프리서버를 대상으로 하는 DDoS 공격이 다시 등장하고 있습니다. 따라서 끄투 프리서버 운영자분들이 지금보다 좀 더 편하게 클라우드플레어 등의 WAF 서비스를 사용하실 수 있도록 관련 설정을 추가하는 것이 좋을 것 같습니다.
기본값은 WAF 사용 안 함입니다.
변경 사항
- WAF 서비스 관련 설정 추가
global.json
- ROOM_PORTS: 방 웹 소켓이 사용할 포트 번호
- WAF: WAF를 사용할 것인지 여부
개선 예정
- ~~인증서가 필요한 문제 해결 예정~~ (불가능한 것으로 확인)
적용 시 주의 사항 및 피드백 요청 사항
- https 모듈의 요구로 인해 인증서가 필요합니다. 실제로 접속 시 사용되는 인증서가 아니므로 만료된 인증서여도 무관합니다. IS_SECURED, isCA, isPFX 값은 false로, WAF 값을 true로 바꿔주신 후 SSL_OPTIONS의 PRIVKEY와 CERT 값에 각각 비밀 키 경로와 인증서 경로를 적어주시면 됩니다.
- 적용 후 grunt를 한번 돌려주세요.
- 클라우드플레어 사용 시 서버와 유저가 통신하는 모든 포트는 클라우드플레어가 지원하는 포트 중 하나로 설정하셔야 합니다.
- 클라우드플레어에 맞춰 개발되었으나 기타 WAF 서비스 이용 시에도 적용할 수 있습니다. (일부 수정 필요할 수 있음)
이러한 오류가 발생합니다.
적용 시 주의 사항을 확인해주세요. SSL 인증서가 필요합니다.
이렇게 해두었습니다
테스트 감사합니다. 문제가 확인되어 수정했습니다.
서버 접속시 #1006 오류와 함께 서버에 연결되지 않습니다.
@Jippang 제가 말씀드리자면, CloudFlare 설정을 잘못 하신걸수도 있습니다. SSL 모드는, 반드시 가변(Flexible)이 아닌 전체(Full)로 해주세요, 가변(Flexible)으로 할시, 서버 접속이 안될수가 있습니다. (그 외에 다른 오류가 있을수 있음)
b33b55c2cfa8f1c4e6bf59c6eee915c00c25adab
적용 후 정상 작동합니다. 감사합니다.
게임서버랑 포탈이 연결이 되지 않습니다(링크를 자신이 입력해야된다는 불편한점)
마찬가지로 서버를 키면 로그에 "Game server #(번호) Connected" 가 아예 안뜹니다.
저는 잘 되는걸로 봐서 PR 문제는 아닌 것 같습니다.
#251 과 사용하였을떄 Game server #1 has an error: Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: IP: 127.0.0.2 is not in the cert's list: 오류가 발생합니다.
override
값과 상관없이 rejectUnauthorized
값이 false가 되도록 수정해보세요.
웹서버만 적용을 시킬시 이런 오류가 납니다. 코드 다 바꾸고 grunt default pack을 하고나서, CloudFlare가 지원하는 포트로 바꾼뒤에 실행을 시켰더니 이 오류가 뜹니다. 해결 방법이 없나요?
global.json의 WAF.GAME 값이 true로 되어있나요?
아뇨 false로 되어 있습니다. WAF.WEB은 true로 되어있고요.
적용 시 주의사항 정독해주세요.
어찌저찌 해서 게임서버는 잘 들어왔는데, 방 접속이 안됩니다.
전 포트를 하나도 빠짐없이 다 열었습니다.
웹서버만 적용을 시킬시 이런 오류가 납니다. 코드 다 바꾸고 grunt default pack을 하고나서, CloudFlare가 지원하는 포트로 바꾼뒤에 실행을 시켰더니 이 오류가 뜹니다. 해결 방법이 없나요?
저 분처럼 저도 같은 상황입니다 근데 제가 조금 초보라서ㅠㅠ { "ADMIN": [ "보안" ], "ROOM_PORTS": 8880, "MAIN_PORTS": [ 8080 ], "GAME_SERVER_HOST": "127.0.0.2", "KKUTUHOT_PATH": "/kkutu/data/kkutuhot.json", "PASS":"보안", "PG_HOST": "localhost", "PG_USER": "postgres", "PG_PASSWORD": "보안", "PG_PORT": 5432, "PG_DATABASE": "main", "GOOGLE_RECAPTCHA_TO_GUEST": false, "GOOGLE_RECAPTCHA_TO_USER": false, "GOOGLE_RECAPTCHA_SITE_KEY": "Your Google Recaptcha site key Here", "GOOGLE_RECAPTCHA_SECRET_KEY": "Your Google Recaptcha secret key Here", "WAF": true, "WAF.GAME": true, "WAF.WEB": true, "CF_OPTIONS": { "WEB": true, "GAME": true, "PORT_GAP": 29 }, "IS_SECURED": false, "SSL_OPTIONS": { "PRIVKEY": "/home/ubuntu/KKuTu/Server/key/private.key", "CERT": "/home/ubuntu/KKuTu/Server/key/private.crt", "CA": "Your SSL CA-Bundle Here", "PFX": "Your PFX Bundle Here", "isPFX": false, "isCA": false }, "USER_BLOCK_OPTIONS": { "USE_MODULE": false, "USE_X_FORWARDED_FOR": false, "BLOCK_IP_ONLY_FOR_GUEST": true, "DEFAULT_BLOCKED_TEXT": "관리자에 의해 서비스 이용이 제한되었습니다.", "BLOCKED_FOREVER": "영구 이용제한" } }
이렇게 global 파일을 해놨고 클라우드플레어에서 ssl을 가변에서 전체로 바꿔보니 또 521 오류가 뜨고요 그 상태에서 DNS 전용으로 하면 ERR_QUIC_PROTOCOL_ERROR 오류가 나고요 ssl 가변 상태에서 DNS 전용으로 하든 프록싱됨으로 놔두든 게임 시작 누른후 로딩화면에서 숫자가 줄어들잖아요 거기서 1에서 먹통되요 콘솔에는
Failed to load resource: the server responded with a status of 404 () in_game_kkutu.min.js:21 Mixed Content: The page at 'https://kkutu.1325ok.com/?server=0' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://kkutu.1325ok.com:8080/YyqSx6VGdoMLkjOvnx-W-Pq8aDZdLGxy'. This request has been blocked; this endpoint must be available over WSS. h @ in_game_kkutu.min.js:21 in_game_kkutu.min.js:21 Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS. at h (https://kkutu.1325ok.com/js/in_game_kkutu.min.js:21:30832) at Object.success (https://kkutu.1325ok.com/js/in_game_kkutu.min.js:21:16220) at f (https://kkutu.1325ok.com/js/jquery.js:1:18297) at Object.fireWith [as resolveWith] (https://kkutu.1325ok.com/js/jquery.js:1:19083) at r (https://kkutu.1325ok.com/js/jquery.js:1:80196) at XMLHttpRequest.r (https://kkutu.1325ok.com/js/jquery.js:1:85818)
이렇게 되어있고요 도와주세요 ㅠㅠ
@1325ok
문제 상황
- GLOBAL.ROOM_PORTS 값으로는 배열이 권장됩니다.
- 가장 최근 커밋된 트리 사용 시 "WAF": true만 필요합니다. WAF.GAME, WAF.WEB, CF_OPTIONS는 더이상 필요하지 않습니다.
- 클라우드플레어는 8880, 8080 포트를 지원하지 않습니다. 참고
권장 해결 방법
- ROOM_PORTS 값을 [ 2053 ] 과 같이 변경하세요.
- CF_OPTIONS 등 더이상 사용하지 않는 키를 삭제하세요.
- 웹서버 포트와 채널 포트를 클라우드플레어가 지원하는 포트로 변경하세요.
- 적용 시 주의 사항을 꼼꼼히 읽어주세요.
추신. IP를 이곳 저곳에 노출하고 다니시면 클라우드플레어를 이용하는 의미가 반감됩니다. 이미 디스코드 웹후크로 기록이 남아버린 상황이니 IP를 변경하세요.
@1325ok
일
- GLOBAL.ROOM_PORTS 값 배열이 장식됩니다.
- 가장 최근에 요청한 내용은 "WAF"입니다. WAF.GAME, WAF.WEB, CF_OPTIONS는 더 추가됩니다.
- 클라우드 8880, 8080 포트를 지원하지 않습니다. 참고
추천 방법
- ROOM_PORTS 값을 [ 2053 ] 으로 변경하세요.
- CF_OPTIONS 등 추가 사용하지 않는 키를 삭제하세요.
- 인터넷 포트포트와 클라우드 플레어가 지원되는 포트번호 입니다.
- 적용 시 주의하시기 바랍니다.
추신. IP를 지원하고 있기 때문에 요금이 청구됩니다. 이미 디스코드 웹후크로 남아 있으며, IP를 변경하세요.
아 그건 서버 ip주소가 오라클 클라우드 서버 꺼고 Ssh도 .key 파일 있어야 로그인되게 해 놓고 해서요...
IP를 지원하고 있기 때문에 요금이 청구됩니다 라는 의미는 무엇인지 모르겠네요... ip는 또 어떻게 변경하는지도요...
그리고 노출된 ip주소는 모두 제 컴퓨터 ip주소 그런게 아니고 오라클 클라우드 리눅스 서버 ip주소라서 꼭 바꿔야 하는지도 모르겠고 ssh접속도 보안키 파일( .key ) 있어야 접속되게 해놔서요
브라우저 번역 기능이 제 답변을 이상하게 번역해놓은 것 같습니다. IP 노출을 막으시려는 것이 아니라면 클라우드플레어 프록시를 사용하시려는 다른 이유가 있으신가요?
브라우저 번역 기능이 제 답변을 이상하게 번역해놓은 것 같습니다. IP 노출을 막으시려는 것이 아니라면 클라우드플레어 프록시를 사용하시려는 다른 이유가 있으신가요?
SSL과 보안 때문에요 ... 아 그리고 추신이 번역이 잘못되었다면 추신만 번역을 고쳐서 보내주실수 있나요?
IP를 이미 전부 노출하셔서 클라우드플레어 프록시 유무와 무관하게 서비스 거부 공격에 대해서는 취약해지셨습니다.
호스팅 이용 여부와 상관없이 서버 IP는 공개된 곳에는 적지 않으시는걸 권장합니다.
File Changed 내용 대로 파일들을 잘 수정하셨다면 위에서 답변드린 대로 조치하시면 문제 없이 클라우드플레어 프록시를 사용하실 수 있습니다.
위에서 답변드렸던 내용은 아래와 같습니다.
네 감사합니다
IP를 이미 전부 노출하셔서 클라우드플레어 프록시 유무와 무관하게 서비스 거부 공격에 대해서는 취약해지셨습니다. 호스팅 이용 여부와 상관없이 서버 IP는 공개된 곳에는 적지 않으시는걸 권장합니다. File Changed 내용 대로 파일들을 잘 수정하셨다면 위에서 답변드린 대로 조치하시면 문제 없이 클라우드플레어 프록시를 사용하실 수 있습니다. 위에서 답변드렸던 내용은 아래와 같습니다.
어... 하라는 데로 해도 그대로네요 ...ㅠㅠ
"ROOM_PORTS": [ 2053 ], "MAIN_PORTS": [ 8080 ], "WAF": true, 다 해놨는데도요 ㅠㅠ
아래 파일들을 전부 File Changed에 따라 수정하신 후 grunt를 사용해 minify 작업까지 마치신 게 맞나요?
Server/lib/Game/cluster.js
Server/lib/Web/lib/kkutu/ready.js
Server/lib/Web/main.js
Server/lib/Game/master.js
Server/lib/Game/slave.js
Server/lib/Web/lib/kkutu/body.js
Server/lib/Web/views/kkutu.pug
Server/lib/const.js
....? 저 많은 파일들을 다 수정하는 거였군요 ㅠㅠ
아래 파일들을 전부 File Changed에 따라 수정하신 후 grunt를 사용해 minify 작업까지 마치신 게 맞나요?
Server/lib/Game/cluster.js
Server/lib/Web/lib/kkutu/ready.js
Server/lib/Web/main.js
Server/lib/Game/master.js
Server/lib/Game/slave.js
Server/lib/Web/lib/kkutu/body.js
Server/lib/Web/views/kkutu.pug
Server/lib/const.js
수정은 다 했는데 grunt로 minify 작업을 어떻게 하나요?
grunt default pack
다 하고 나서 서버 실행하니 오류가 뜹니다
:8080 [4/20/2022, 6:27:29 AM] ERROR: Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Object.createSecureContext (_tls_common.js:156:17)
at Server (_tls_wrap.js:873:27)
at new Server (https.js:62:14)
at Object.createServer (https.js:85:10)
at Object.MainDB.ready (/home/ubuntu/KKuTu/Server/lib/Game/master.js:341:25)
at /home/ubuntu/KKuTu/Server/lib/Web/db.js:91:30
at BoundPool.
_tls_common.js:156 c.context.setKey(key, passphrase); ^
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Object.createSecureContext (_tls_common.js:156:17)
at Server (_tls_wrap.js:873:27)
at new Server (https.js:62:14)
at Object.createServer (https.js:85:10)
at Object.
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Object.createSecureContext (_tls_common.js:156:17)
at Server (_tls_wrap.js:873:27)
at new Server (https.js:62:14)
at Object.createServer (https.js:85:10)
at Object.
인증서나 Node.js 버전에 관련된 문제입니다. 명확한 해결 방법은 없고 인증서 재발급이나 Node.js 다운그레이드로 해결되기도 합니다.
인증서나 Node.js 버전에 관련된 문제입니다. 명확한 해결 방법은 없고 인증서 재발급이나 Node.js 다운그레이드로 해결되기도 합니다.
NodeJS 버전은 v10.19.0 이고 인증서 문제라면 global.json 이었나...? 그 파일에 적어둔 인증서 말하는 건가요? 그게 문제라면 인증서를 어떻게 만들죠?
https 모듈의 요구로 인증서(CERT)와 개인 키(PRIV_KEY)가 필요합니다. 유효한(기간이 만료되지 않은) 인증서일 필요는 없으며 인증서가 어떤 도메인을 대상으로 하고 있는지도 상관 없습니다. 그러나 개인 키로 인증서를 복호화할 수 있어야 합니다. 인증서와 개인 키는 OpenSSL로 직접 발급 하시거나 무료 SSL 발급 서비스들을 통해 발급 받으시면 됩니다. 인증서와 개인 키를 발급 받으신 후 global.json의 SSL_OPTIONS 항목에 인증서, 개인 키, CA 기관 인증서의 경로를 모두 입력하시고 isCA 값을 true로 변경하고 다시 시도해보세요. (발급 받은 인증서가 CA 인증서라는 가정 하에) 그래도 동일한 문제가 발생한다면 Node.js 버전을 v12.22.12로 변경하신 후 다시 시도하세요.
https 모듈의 요구로 인증서(CERT)와 개인 키(PRIV_KEY)가 필요합니다. 유효한(기간이 만료되지 않은) 인증서일 필요는 없으며 인증서가 어떤 도메인을 대상으로 하고 있는지도 상관 없습니다. 그러나 개인 키로 인증서를 복호화할 수 있어야 합니다. 인증서와 개인 키는 OpenSSL로 직접 발급 하시거나 무료 SSL 발급 서비스들을 통해 발급 받으시면 됩니다. 인증서와 개인 키를 발급 받으신 후 global.json의 SSL_OPTIONS 항목에 인증서, 개인 키, CA 기관 인증서의 경로를 모두 입력하시고 isCA 값을 true로 변경하고 다시 시도해보세요. (발급 받은 인증서가 CA 인증서라는 가정 하에) 그래도 동일한 문제가 발생한다면 Node.js 버전을 v12.22.12로 변경하신 후 다시 시도하세요.
음 OpenSSL로 발급해서 넣어는 놨는데 CA 인증서가 필수인가요? 인증서는 https://namjackson.tistory.com/24 이거보고 만들었는데...
(인증서에 비밀번호도 해놨습니다)
아 ca인증서는 rootca.key 파일로 하면 되나요???
ca인증서는 rootca.key 파일로 했더니 그래도 같은 오류네요 ㅠㅠ;;