Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WAF 서비스 관련 설정 추가 #871

Open
wants to merge 15 commits into
base: master
Choose a base branch
from

Conversation

lshqqytiger
Copy link
Contributor

@lshqqytiger lshqqytiger commented May 14, 2021

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 서비스 이용 시에도 적용할 수 있습니다. (일부 수정 필요할 수 있음)

@lshqqytiger
Copy link
Contributor Author

적용 시 주의 사항을 확인해주세요. SSL 인증서가 필요합니다.

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented May 14, 2021

테스트 감사합니다. 문제가 확인되어 수정했습니다.

@ghost
Copy link

ghost commented May 14, 2021

@Jippang 제가 말씀드리자면, CloudFlare 설정을 잘못 하신걸수도 있습니다.
SSL 모드는, 반드시 가변(Flexible)이 아닌 전체(Full)로 해주세요, 가변(Flexible)으로 할시, 서버 접속이 안될수가 있습니다.
(그 외에 다른 오류가 있을수 있음)

@J1ilk
Copy link

J1ilk commented May 17, 2021

image
게임서버랑 포탈이 연결이 되지 않습니다(링크를 자신이 입력해야된다는 불편한점)
마찬가지로 서버를 키면 로그에 "Game server #(번호) Connected" 가 아예 안뜹니다.

@lshqqytiger
Copy link
Contributor Author

2
저는 잘 되는걸로 봐서 PR 문제는 아닌 것 같습니다.

@norhu1130
Copy link

#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: 오류가 발생합니다.

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented May 29, 2021

override 값과 상관없이 rejectUnauthorized 값이 false가 되도록 수정해보세요.

@lshqqytiger lshqqytiger mentioned this pull request Sep 1, 2021
@ghost
Copy link

ghost commented Oct 25, 2021

image
웹서버만 적용을 시킬시 이런 오류가 납니다. 코드 다 바꾸고 grunt default pack을 하고나서, CloudFlare가 지원하는 포트로 바꾼뒤에 실행을 시켰더니 이 오류가 뜹니다. 해결 방법이 없나요?

@lshqqytiger
Copy link
Contributor Author

global.json의 WAF.GAME 값이 true로 되어있나요?

@ghost
Copy link

ghost commented Oct 25, 2021

아뇨 false로 되어 있습니다. WAF.WEB은 true로 되어있고요.

@lshqqytiger
Copy link
Contributor Author

적용 시 주의사항 정독해주세요.

@ghost
Copy link

ghost commented Oct 25, 2021

image
어찌저찌 해서 게임서버는 잘 들어왔는데, 방 접속이 안됩니다.
전 포트를 하나도 빠짐없이 다 열었습니다.
image

@1325ok
Copy link

1325ok commented Apr 19, 2022

image 웹서버만 적용을 시킬시 이런 오류가 납니다. 코드 다 바꾸고 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)

이렇게 되어있고요
도와주세요 ㅠㅠ

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented Apr 19, 2022

@1325ok

문제 상황

  1. GLOBAL.ROOM_PORTS 값으로는 배열이 권장됩니다.
  2. 가장 최근 커밋된 트리 사용 시 "WAF": true만 필요합니다. WAF.GAME, WAF.WEB, CF_OPTIONS는 더이상 필요하지 않습니다.
  3. 클라우드플레어는 8880, 8080 포트를 지원하지 않습니다. 참고

권장 해결 방법

  1. ROOM_PORTS 값을 [ 2053 ] 과 같이 변경하세요.
  2. CF_OPTIONS 등 더이상 사용하지 않는 키를 삭제하세요.
  3. 웹서버 포트와 채널 포트를 클라우드플레어가 지원하는 포트로 변경하세요.
  4. 적용 시 주의 사항을 꼼꼼히 읽어주세요.

추신. IP를 이곳 저곳에 노출하고 다니시면 클라우드플레어를 이용하는 의미가 반감됩니다. 이미 디스코드 웹후크로 기록이 남아버린 상황이니 IP를 변경하세요.

@1325ok
Copy link

1325ok commented Apr 19, 2022

@1325ok

  1. GLOBAL.ROOM_PORTS 값 배열이 장식됩니다.
  2. 가장 최근에 요청한 내용은 "WAF"입니다. WAF.GAME, WAF.WEB, CF_OPTIONS는 더 추가됩니다.
  3. 클라우드 8880, 8080 포트를 지원하지 않습니다. 참고

추천 방법

  1. ROOM_PORTS 값을 [ 2053 ] 으로 변경하세요.
  2. CF_OPTIONS 등 추가 사용하지 않는 키를 삭제하세요.
  3. 인터넷 포트포트와 클라우드 플레어가 지원되는 포트번호 입니다.
  4. 적용 시 주의하시기 바랍니다.

추신. IP를 지원하고 있기 때문에 요금이 청구됩니다. 이미 디스코드 웹후크로 남아 있으며, IP를 변경하세요.

아 그건 서버 ip주소가 오라클 클라우드 서버 꺼고
Ssh도 .key 파일 있어야 로그인되게 해 놓고
해서요...

IP를 지원하고 있기 때문에 요금이 청구됩니다 라는 의미는 무엇인지 모르겠네요...
ip는 또 어떻게 변경하는지도요...

그리고 노출된 ip주소는 모두 제 컴퓨터 ip주소 그런게 아니고
오라클 클라우드 리눅스 서버 ip주소라서 꼭 바꿔야 하는지도 모르겠고 ssh접속도 보안키 파일( .key ) 있어야 접속되게 해놔서요

@1325ok
Copy link

1325ok commented Apr 20, 2022

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 파일로 하면 되나요???

@1325ok
Copy link

1325ok commented Apr 20, 2022

ca인증서는 rootca.key 파일로 했더니 그래도 같은 오류네요 ㅠㅠ;;

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented Apr 20, 2022

저는 SSLForFree로 발급 받아 작업 했었습니다.
(원래 3개월마다 갱신해야 하지만 WAF 사용 시 만료 여부 상관 없으므로 갱신/재발급 필요 없음)

@1325ok
Copy link

1325ok commented Apr 20, 2022

저는 SSLForFree로 발급 받아 작업 했었습니다. (원래 3개월마다 갱신해야 하지만 WAF 사용 시 만료 여부 상관 없으므로 갱신/재발급 필요 없음)

이제 되기는 되는데 메인화면에서 게임 시작 누르면
Error: /home/ubuntu/KKuTu/Server/lib/Web/views/kkutu.pug:54:1 52| // span#PORT= locals.PORT 53| span#URL= ${locals.PROTOCOL}://${locals.HOST}:${locals.PORT}/${locals._id} > 54| span#ROOM_PORT= locals.ROOM_PORT --------^ 55| span#MOREMI_PART= locals.MOREMI_PART.join(',') 56| span#AVAIL_EQUIP= locals.AVAIL_EQUIP.join(',') 57| span#RULE= JSON.stringify(locals.RULE) Invalid indentation, you can use tabs or spaces but not both 오류가 나요

@lshqqytiger
Copy link
Contributor Author

#799

@1325ok
Copy link

1325ok commented Apr 20, 2022

#799

이거 해결하니 이번에는 리눅스 콘솔에는 << KKuTu Server:null >> 로 서버 포트를 못잡고있고
게임 시작 누르니 서버와의 연결이 종료되었습니다. (#1006) 라는 오류를 내뿜으며 서버와 연결이 안됩니다

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented Apr 20, 2022

앞서 "웹 서버 포트"라고 명명한 MAIN_PORTS 배열 속 요소들 또한 클라우드플레어가 지원하는 포트 중 하나로 설정하셔야 합니다.

로그에 << KKuTu Server:null >>와 같이 포트가 표시되지 않는 문제는 https 사용 시에 발생하는 별개의 로그 오류입니다. 서버 실행 및 작동과는 무관합니다.

@1325ok
Copy link

1325ok commented Apr 20, 2022

앞서 "웹 서버 포트"라고 명명한 MAIN_PORTS 배열 속 요소들 또한 클라우드플레어가 지원하는 포트 중 하나로 설정하셔야 합니다.

포트번호 추천좀요 ㅠㅠ

@lshqqytiger
Copy link
Contributor Author

"ROOM_PORTS": [ 2082 ],
"MAIN_PORTS": [ 2052 ],

로 하시면 잘 될겁니다.

@1325ok
Copy link

1325ok commented Apr 20, 2022

"ROOM_PORTS": [ 2082 ],
"MAIN_PORTS": [ 2052 ],

로 하시면 잘 될겁니다.

했는데도 안되요 ㅠㅠ

F12 콘솔 로그:
/?server=0:7 GET https://kkutu.1325ok.com/js/in_kkutu.min.js net::ERR_ABORTED 404
in_game_kkutu.min.js:21 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
(익명) @ in_game_kkutu.min.js:21
(익명) @ in_game_kkutu.min.js:23
in_game_kkutu.min.js:21 WebSocket connection to 'wss://kkutu.1325ok.com:2052/gUC8i8tuTMUgCJdh4mYiy-5vUSZA75it' failed:
h @ in_game_kkutu.min.js:21
(익명) @ in_game_kkutu.min.js:21
f @ jquery.js:1
fireWith @ jquery.js:1
r @ jquery.js:1
r @ jquery.js:1
in_game_kkutu.min.js:21 연결 중 문제가 발생했습니다! Event {isTrusted: true, type: 'error', target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}

@ghost
Copy link

ghost commented Apr 20, 2022

HTTPS를 사용중이신경우. 포트를 2083, 2053으로 변경해주세요.

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented Apr 20, 2022

2052, 2082 포트도 사용할 수 있습니다.

main.js에서

gameServers[i] = new GameClient(KEY, `${protocol}://${GLOBAL.GAME_SERVER_HOST}:${v}/${KEY}`);

부분의 protocol 값이 "ws"가 되도록 수정해보세요.
(바로 윗줄에 protocol = "ws"; 추가)

@1325ok
Copy link

1325ok commented Apr 20, 2022

근데 일단은 귀찮으니까(...) 그냥 포트를 2083,2053으로 할게요

@1325ok
Copy link

1325ok commented Apr 20, 2022

이번에는 방 연결이 안되고 생성도 안되요 ㅠㅠ

@1325ok
Copy link

1325ok commented Apr 20, 2022

계속 방과 연결하는중이 떠요 ㅠㅠ

@lshqqytiger
Copy link
Contributor Author

kkutu.pug를 수정하지 않으셨습니다.
Screenshot_20220420-172407_GitHub.jpg

@1325ok
Copy link

1325ok commented Apr 21, 2022

kkutu.pug를 수정하지 않으셨습니다. Screenshot_20220420-172407_GitHub.jpg

이제 다 되는데
이런거를 여기서 물어봐서 죄송하지만 혹시 봇 hit 수는 1000은 너무 약한거 같아서 어느정도가 적당할까요???

const ROBOT_START_DELAY = [ 1200, 800, 400, 200, 0 ];
const ROBOT_TYPE_COEF = [ 1250, 750, 500, 250, 0 ];
const ROBOT_THINK_COEF = [ 4, 2, 1, 0, 0 ];
const ROBOT_HIT_LIMIT = [ 1000 ]; /700, 500, 100, 50/
const ROBOT_LENGTH_LIMIT = [ 3, 4, 9, 99, 99 ];

이렇게 해놨는데 값좀 추천해주세요

@lshqqytiger
Copy link
Contributor Author

본 PR의 내용과 무관한 글은 이곳에 작성하지 말아주세요.

@1325ok
Copy link

1325ok commented Apr 21, 2022

본 PR의 내용과 무관한 글은 이곳에 작성하지 말아주세요.

@yeokyoomin
Copy link

image
게임 서버에 연결이 되지 않습니다.

@lshqqytiger
Copy link
Contributor Author

본문을 다시 확인해주세요.

클라우드플레어 사용 시 서버와 유저가 통신하는 모든 포트는 클라우드플레어가 지원하는 포트 중 하나로 설정하셔야 합니다.

@yeokyoomin
Copy link

image
image
지원 포트 중 하나로 다시 시도해 봐도 여전히 접속되지 않습니다.

@lshqqytiger
Copy link
Contributor Author

lshqqytiger commented Jun 25, 2024

2052번 포트는 non-secure 연결 전용입니다.
본문 링크 업데이트하였으니 확인해주세요.

@yeokyoomin
Copy link

yeokyoomin commented Jun 25, 2024

image image 지원 포트 중 하나로 다시 시도해 봐도 여전히 접속되지 않습니다.

늦은시간에 죄송합니다.
두번째 사진은 2053, 2083 포트를 사용한 사진인데 어떻게 해결할 수 있을까요?

@lshqqytiger
Copy link
Contributor Author

두 번째 사진에서는 웹소켓 연결 실패 메시지가 보이지 않아서 연결 중에 찍으신 것 같고 저는 연결이 잘 됩니다.
image

@yeokyoomin
Copy link

8443 포트로 시도해 보니 정상적으로 작동되네요. 늦은 시간에 도와주셔서 감사합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants