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 주소입니다.
코드가 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/96
SIIT(상태 비저장 IP/ICMP 변환) 프로토콜에서 사용하는 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
'programing' 카테고리의 다른 글
SQL Server에서 열 이름 바꾸기 (0) | 2023.08.02 |
---|---|
getaddrinfo를 사용하여 정적으로 연결된 이진을 생성하시겠습니까? (0) | 2023.08.02 |
부분 보기를 반환하는 Ajax 호출 컨트롤러 작업에서 모델 상태 오류를 처리하는 방법 (0) | 2023.07.28 |
설치 후 mysql에서 연합 엔진을 활성화하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
nltk 또는 python을 사용하여 중지 단어를 제거하는 방법 (0) | 2023.07.28 |