programing

Express.js req.ip에서 다음을 반환합니다.:fff:127.0.0.1

oldcodes 2023. 8. 2. 09:22
반응형

Express.js req.ip에서 다음을 반환합니다.:fff:127.0.0.1

현재 요청한 사용자의 IP를 얻으려고 합니다.문제는 IP가 반환된다는 것입니다.::ffff:127.0.0.1대신에127.0.0.1사용해 보았습니다.trusted proxy옵션(프록시를 사용하지 않더라도) 및req.ips비어 있습니다.4.x Express.js 사용.

router.get('/', function(req, res, next) {
    console.log('ip', req.ip)
    res.send({})
});

::ffff:는 IPv6(128비트) 공간 내에 배치된 IPv4(32비트) 주소의 서브넷 접두사입니다.IPv6은 서브넷 접두사와 인터페이스 접미사의 두 부분으로 나뉩니다.각 문자는 64비트 길이이거나 4개의 16진수 문자로 구성된 4개의 그룹입니다.

IPv6에서는 선행 0을 제거한 다음 연속 0을 제거할 수 있습니다. 즉,::ffff:실제로는 에 해당합니다.0000:0000:ffff:0000이 주소는 IPv4-IPv6 서브넷 접두사로 지정되었으므로 모든 IPv6 프로세서는 IPv4 주소로 작동하는 것을 이해하고 그에 따라 처리합니다.

가까운 미래에 IP 주소는 모두 IPv6이 될 것입니다. 이는 IPv4 주소 공간에서 숫자가 거의 부족하기 때문입니다(42억 개, 잘못된 목적을 위한 일부 공간 제외).

IPv6는 훨씬 더 큰 공간을 허용합니다."340억 달러는 누구에게나 충분해야 합니다." - 빌 게이츠, IPv6에서 연설.

IPv6 네임스페이스를 사용하여 IP 주소의 주소 지정을 시작하는 것이 중요합니다. 따라서::ffff:미래에 그 콜론들 사이에 실제 16진수 데이터가 있을 것이기 때문에 당신의 코드에서.미적인 이유로 제거할 경우 IPv6 네트워크로 전환하거나 IPv6 주소에 직면할 때 코드가 손상됩니다.

일부 네트워크는 현재 IPv6을 실행하고 있으며 곧 IPv6 IP 주소에 직면하게 될 것입니다. 지금 바로 실행하거나 나중에 코드가 손상될 위험이 있습니다.

문제의 TL;DR(짧은) 버전은 다음과 같습니다. 모든 것이 잘 작동하고 있습니다.변경하지 마십시오. IPv6 버전의 IPv4 주소입니다.

IPv4 IPv6

코드가 IPv6와 호환되도록 하려면 다음을 확인하기만 하면 됩니다.::ffff:접두사...존재하는 경우 제거하고 나머지를 IPv4로 처리합니다...::ffff:존재하지 않습니다. IPv6 주소이므로 이렇게 처리해야 합니다.문자열에 마침표가 있는지, 있으면 IPv4인지 확인하여 다시 확인할 수 있습니다.

IP 주소를 조정해야 하는 것을 제외하고는 모든 것을 기억하십시오. IP를 기록하는 것뿐입니다. 그렇죠?파서 및 로그 애그리게이트에서 예상하는 것이 중요합니다.::ffff:127.0.0.1앞으로 등등.IP를 변경할 필요가 없는 한, 수신한 IP를 그대로 유지합니다.

이것은 ipv6의 특이점인 것 같습니다. ipv4 주소의 경우 ipv6 표기법과 ipv4 표기법이 혼합된 것 같습니다.

ipv4 및 ipv6 주소를 모두 단순하고 혼합되지 않은 표기법으로 가져오기 위해 다음을 사용합니다.

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
if (ip.substr(0, 7) == "::ffff:") {
  ip = ip.substr(7)
}

IPv4만 필요한 경우 노드 서버가 IPv4를 사용하여 수신하도록 강제할 수 있습니다.

앱의 에는 편집:/bin/www:

바꾸다

server.listen(port);

로.

server.listen(port, '0.0.0.0');

이것은 적어도 저에게는 효과가 있었습니다.

https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback

Windows 7(윈도우 7)에서는 IPv6가 기본적으로 사용되도록 설정되어 있습니다. 7은 "IPv4 파일"을 .::ffff:IPv6로의 전환의 일부로 IPv4에 대한 접두사

::ffff:0:0:0/96SIIT(상태 비저장 IP/ICMP 변환) 프로토콜에서 사용하는 IPv4 변환 주소에 사용되는 접두사입니다.

IPv4에서 전환

ipv4 매핑된 주소를 비교하는 데 문제가 있었고 ipaddr.js 라이브러리가 도움이 된다는 것을 알게 되었습니다 :-)

예를 들어

_.isEqual(ipaddr.process('::ffff:127.0.0.1'), ipaddr.process('127.0.0.1')) === true

서브넷을 제거하여 정확한 IP 주소를 가져오십시오.

    let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    ip = ip.toString().replace('::ffff:', '');

소켓을 사용하여 지정된 패밀리 또는 단독으로 IP 주소를 가져올 수 있습니다.

     var app = require('express')();

 app.get("/ip", (req, res) => {
        console.log(req.ip) 
       let ip = req.ip.split(':');
        let ip_details = req.socket.address();
          console.log(ip_details);                     
   // { address: '::ffff:127.0.0.1', family: 'IPv6', port: 3001 

           console.log(ip[3]);//127.0.0.1
                            res.json(ip[3]);  
      }
var ip = req.ip.split(':').pop();

언급URL : https://stackoverflow.com/questions/29411551/express-js-req-ip-is-returning-ffff127-0-0-1

반응형