L4 등을 이용할 때 IP 가 바뀌는 문제

634 views
Skip to first unread message

김종화

unread,
Jul 25, 2016, 11:49:02 PM7/25/16
to Netty Korean User Group
L4 나 VIP 등을 이용할 때 IP 을 변조해서 들어오는데, 이 부분 때문에 netty 에서 응답을 할 때 잘못된 IP 을 통해 응답을 하게 되는 것 같습니다.

이 부분에 대한 설정을 바꿀 수 있는 부분이 있을까요?

김종화

unread,
Jul 26, 2016, 12:06:04 AM7/26/16
to Netty Korean User Group
내용이 부실해서 좀 첨언을 하자면,

리눅스 서버에 eth0 에 사설IP 가 있고, lo:0 에 VIP 가 설정되어 있습니다.
쉽게 생각해서, L4 에서 A 라는 IP 가 존재하고, 사용자가 이 A 로 접속을 하면
두 대의 서버가 각각 VIP 는 A 라고 lo:0 에 설정이 되어 있고, 한 대는 eth0 에 B, 다른 한 대는 eth0 에 C 라는 IP 가 설정되어 있습니다.

그런데, 클라이언트가 A 라는 IP 에 메세지를 보내면 첫번째 서버(B 와 A 라는 IP 을 가지는)에 해당 내용이 전달이 되고, netty 에서 이를 처리하고 ChannelHandlerContext 을 통해 .write() 를 하면 A 를 통해 값이 외부로 나가는게 아니라 B 를 통해 외부로 전달되려고 해서 사용자에게 데이터가 전송이 안되는 문제가 발생한다고 합니다.

이걸 설정 등을 통해 강제로 A 로 보내게 한다거나, L4 와 같은 상황에서 요청이 온 쪽으로 정확히 돌려보내게 할 수 있을까요?

조언 부탁드립니다.





2016년 7월 26일 화요일 오후 12시 49분 2초 UTC+9, 김종화 님의 말:

김종화

unread,
Jul 26, 2016, 7:00:41 AM7/26/16
to Netty Korean User Group
약간의 자답과 또다른 의문이 있어서 답글을 답니다.

먼저, 거의 동시간에 올린 게시물로 이 문제는 해결했습니다. Bootstrap 의 bind() 에 port 뿐만 아니라 hostname 을 매개변수로 받을 수 있는데, 이 hostname 에 명시된 interface 로만 통신하도록 binding 할 수 있었고, 이 옵션으로 원하는 대로 A IP 로 outbount 가 되도록 하였습니다.

그러나 여전히 남는 문제는, 분명 L4 에서 A 라는 IP 로 요청을 보냈음에도 B 라는 IP 로 값을 되돌려준다는 것입니다. A 라는 IP 가 B 라는 IP 가 설정된 eth0 위에 가상으로 생성된 lo:0 에서 나온 것이기 때문에 결국 외부->A->B->Netty 로 들어갔다는 것은 맞는데, Netty->B->외부 처럼 리턴에서 A 가 빠져버림으로써 문제가 야기되었습니다. B 는 외부로 데이터를 내보낼 수 없는 회선이기 때문입니다.
그리고, 이후에 문제가 발생했는데...L4 에서 장비의 live 확인을 B 을 통해서 한다고 합니다. 그것도 lo:0 가 올라간 상태에서만 가능하기 때문에 bind() 로 A IP 로만 열어둔 상태에선 B 로 해당 포트로 접속이 안되서 L4 에서 서버가 down 된 것으로 판단해서 dead 처리를 해버린다고 하네요.

다른 언어에서나 기본 Java 에서는 어떻게 처리되는지는 모르겠으나, Netty 의 이런 방식에 문제가 있는건지, 아니면 A 로 들어오면 A 로, B 로 들어오면 B 로 응답을 하는 방법이 따로 있는지 궁금합니다. 시스템 엔지니어는 저희 쪽의 문제라고 주장하고 있거든요.


조언 부탁드립니다.





2016년 7월 26일 화요일 오후 1시 6분 4초 UTC+9, 김종화 님의 말:

unread,
Jul 26, 2016, 8:20:16 PM7/26/16
to Netty Korean User Group
음 제가 알고 있는 부분이 도움이 될 지도 모르겠네요..

비슷한 문제가 Gateway 가 복수인 경우 별다른 설정이 되어 있지 않으면 Default Gateway 로 모든 응답을
처리해서 특정한 Interface 로 부터 온 패킷이 원하는 쪽으로 응답을 주려면 별도의 설정이 필요해 보입니다.

즉 외부 --> A --> B --> Netty 이면 B 의 Default Gateway 가 A 가 아닌 경우
라우팅 정보에  A 에서 B로 전송된 패킷은 A 를 통해 갈 수 있도록 해주시면 될듯 합니다.
Windows 경우에는 route print 명령어를 써서 확인 후 추가해 주시면 될듯 합니다. 

김종화

unread,
Jul 26, 2016, 8:24:50 PM7/26/16
to Netty Korean User Group
조언 고맙습니다. 말씀하신대로 A 는 B 위에서 돌아가는 가상 장치이고 L4 의 ip 을 가진 것입니다. 당연히 시스템의 기본 게이트웨이는 B 라서 강제로 A을 타고 가게 해줘야 하는데, 시스템이 리눅스입니다. 기본 게이트웨이를 바꾸면 B 을 통해 통신하는 다른 서비스는 먹통이 되지 않을지 걱정이 되고, 혹시 리눅스에서는 어떤 식의 세팅이 되야 하는지 참조할만한 자료 없을까요?

김종화

unread,
Jul 26, 2016, 9:01:54 PM7/26/16
to Netty Korean User Group
route print 라는 것에 눈치를 챘어야 했는데...source ip 기반이고, interface 기반으로 route add 을 해줄 수 있는 건 아니라서 시스템 쪽에서 이건 안되겠다고 하네요. T.T



2016년 7월 27일 수요일 오전 9시 20분 16초 UTC+9, 별 님의 말:
Reply all
Reply to author
Forward
0 new messages