http域名访问时,安全组获取真实ip逻辑调整

This commit is contained in:
aoshiguchen
2023-12-09 23:27:46 +08:00
parent 57339dc56c
commit 7530fd7d9f
3 changed files with 68 additions and 38 deletions
@@ -0,0 +1,60 @@
package org.dromara.neutrinoproxy.core.util;
import org.apache.commons.lang3.StringUtils;
/**
* @author: wen.y
* @date: 2023/12/9
*/
public class HttpUtil {
/**
* 获取请求头 Host 忽略端口号
* @param httpContent
* @return
*/
public static String getHostIgnorePort(String httpContent) {
String host = getHost(httpContent);
if (StringUtils.isEmpty(host) || !host.contains(":")) {
return host;
}
return host.replaceAll(":.*", "");
}
/**
* 获取请求头 Host
* @param httpContent
* @return
*/
public static String getHost(String httpContent) {
return getHeaderValue(httpContent, "Host");
}
/**
* 获取请求头
* @param httpContent
* @return
*/
public static String getHeaderValue(String httpContent, String header) {
String headerContent = httpContent.split("\r\n\r\n")[0];
String[] lines = headerContent.split("\r\n");
String firstLine = lines[0];
if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) {
return null;
}
for (int i = 1; i < lines.length; i++) {
String line = lines[i];
if (!line.startsWith(header + ":")) {
continue;
}
if (line.length() > header.length() + 1) {
return line.substring(header.length() + 1).trim();
} else {
return "";
}
}
return null;
}
}
@@ -2,6 +2,7 @@ package org.dromara.neutrinoproxy.core.util;
import cn.hutool.core.net.Ipv4Util;
import io.netty.channel.ChannelHandlerContext;
import org.apache.commons.lang3.StringUtils;
import java.net.InetSocketAddress;
@@ -22,27 +23,14 @@ public class IpUtil extends org.noear.solon.core.util.IpUtil {
* @return 返回找到的第一个公网地址
*/
public static String getRealRemoteIp(String httpContent) {
String headerContent = httpContent.split("\r\n\r\n")[0];
String[] lines = headerContent.split("\r\n");
String firstLine = lines[0];
if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) {
return null;
String ip = HttpUtil.getHeaderValue(httpContent, "X-Forwarded-For");
if (StringUtils.isEmpty(ip)) {
ip = HttpUtil.getHeaderValue(httpContent, "X-Real-IP");
}
for (int i = 1; i < lines.length; i++) {
String line = lines[i];
// 匹配有ipv4地址格式的header
if (!line.matches(".*(\\d+\\.){3}\\d+")) {
continue;
}
// 截取IP地址
String ip = line.substring(line.charAt(':'));
if (!Ipv4Util.isInnerIP(ip)) {
return ip;
}
if (StringUtils.isNotEmpty(ip) && !Ipv4Util.isInnerIP(ip)) {
return ip;
}
return null;
}
}
@@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.neutrinoproxy.core.Constants;
import org.dromara.neutrinoproxy.core.ProxyMessage;
import org.dromara.neutrinoproxy.core.util.HttpUtil;
import org.dromara.neutrinoproxy.core.util.IpUtil;
import org.dromara.neutrinoproxy.server.constant.NetworkProtocolEnum;
import org.dromara.neutrinoproxy.server.proxy.domain.ProxyAttachment;
@@ -78,7 +79,7 @@ public class HttpVisitorChannelHandler extends SimpleChannelInboundHandler<ByteB
ctx.channel().config().setOption(ChannelOption.AUTO_READ, false);
String httpContent = new String(bytes);
String host = getHost(httpContent);
String host = HttpUtil.getHostIgnorePort(httpContent);// getHost(httpContent);
log.debug("HttpProxy host: {}", host);
if (StringUtils.isBlank(host)) {
ctx.channel().close();
@@ -171,23 +172,4 @@ public class HttpVisitorChannelHandler extends SimpleChannelInboundHandler<ByteB
// 当出现异常就关闭连接
ctx.close();
}
private String getHost(String req) {
String[] lines = req.split("\r\n");
String firstLine = lines[0];
if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) {
return null;
}
for (int i = 1; i < lines.length; i++) {
String line = lines[i];
if (!line.startsWith("Host: ")) {
continue;
}
// 域名
String domain = line.substring(6);
// 去掉域名后面的端口号
return domain.replaceAll(":.*", "");
}
return null;
}
}