Как получить IP-адрес из объекта вызова

Я использую Ktor для серверной службы и хочу регистрировать входящие запросы. У меня установлена ​​функция, и все в порядке, но как я могу получить удаленный IP-адрес?

call.request.origin.remoteHost

Я использую эту строку, но получаю имя хоста, а не IP. Я использую стандартный метод getByName из класса InetAddress для получения IP. Есть ли способ лучше?


person Marek    schedule 22.10.2020    source источник


Ответы (2)


Вы не можете сделать это с помощью Ktor, поскольку в Ktor не входит разрешение IP-адресов из доменов.

Однако вы можете использовать InetAddress Java:

val url = "http://google.com"; 
val ip =  Inet4Address.getByName(url);
person Adam Arold    schedule 23.10.2020

Зависит от того, насколько точной должна быть эта информация.

Если вы прочитаете код Ktor, вы увидите, что remoteHost фактически устанавливается из заголовка HTTP X-Forwarded-Host.

Из документации API:

* NEVER use it for user authentication as it can be easily falsified (user  can simply set some HTTP headers
* such as X-Forwarded-Host so you should NEVER rely on it in any security checks.
* If you are going to use it to create a back-connection please do it with care as an offender can easily
* use it to force you to connect to some host that is not intended to be connected to so that may cause
* serious consequences.

Лучшим способом может быть получение IP от самого движка приложения. К сожалению, сам ApplicationCall является частным, поэтому вам придется прибегнуть к отражению, что не оптимально:

class RoutingApplicationCall(private val call: ApplicationCall,

Тем не менее, это возможно:


// Getting the private field through reflection
val f = context::class.memberProperties.find { it.name == "call" }

f?.let {
    // Making it accessible
    it.isAccessible = true
    val w = it.getter.call(context) as NettyApplicationCall

    // Getting the remote address 
    val ip: SocketAddress? = w.request.context.pipeline().channel().remoteAddress()
    println("IP: $ip")
}
person Alexey Soshin    schedule 26.10.2020