ローカル VPN サーバーをホストする VpnService を介して行われた HTTPS 接続のパス (および可能であればヘッダー) を確認できる必要があります。これは可能ですか?
たとえば、https://google.com/somedir/somejsfile.jsにアクセスするときは、SNI (google.コム)。エンドユーザーにとって安全でありながら、これは何らかの方法で可能ですか?
HTTP 要求を正常に処理し、HTTP 要求を正常に表示することができましたが、最近ではほとんどのトラフィックが HTTPS 経由であるため、HTTPS 経由で要求ヘッダーも表示する方法が必要です。
次のコードは、VpnService を確立し、着信/発信パケットをそれぞれ読み取り/書き込みする方法を示しています。
private void runVPN() throws Exception {
this.mVPNInterface = establishVPN();
this.mVPNOutputStream = new FileOutputStream(mVPNInterface.getFileDescriptor());
FileInputStream in = new FileInputStream(mVPNInterface.getFileDescriptor());
int size = 0;
while (size != -1 && IsRunning) {
while ((size = in.read(mPacket)) > 0 && IsRunning) {
if (mDnsProxy.Stopped || mTcpProxyServer.Stopped) {
in.close();
throw new Exception("LocalServer stopped.");
}
onIPPacketReceived(mIPHeader, size);
}
Thread.sleep(100);
}
in.close();
disconnectVPN();
}
void onIPPacketReceived(IPHeader ipHeader, int size) throws IOException {
switch (ipHeader.getProtocol()) {
case IPHeader.TCP:
TCPHeader tcpHeader = mTCPHeader;
tcpHeader.mOffset = ipHeader.getHeaderLength();
if (tcpHeader.getSourcePort() == mTcpProxyServer.Port) {
NatSession session = NatSessionManager.getSession(tcpHeader.getDestinationPort());
if (session != null) {
ipHeader.setSourceIP(ipHeader.getDestinationIP());
tcpHeader.setSourcePort(session.RemotePort);
ipHeader.setDestinationIP(LOCAL_IP);
Utility.ComputeTCPChecksum(ipHeader, tcpHeader);
mVPNOutputStream.write(ipHeader.mData, ipHeader.mOffset, size);
mReceivedBytes += size;
/*
mVPNOutputStream.write(ipHeader.mData, ipHeader.mOffset, size);
mReceivedBytes += size;*/
} else {
Log.d(TAG, "NoSession: " + ipHeader.toString() + " " + tcpHeader.toString());
}
} else {
int portKey = tcpHeader.getSourcePort();
NatSession session = NatSessionManager.getSession(portKey);
if (session == null || session.RemoteIP != ipHeader.getDestinationIP() || session.RemotePort
!= tcpHeader.getDestinationPort()) {
session = NatSessionManager.createSession(portKey, ipHeader.getDestinationIP(), tcpHeader
.getDestinationPort());
}
session.LastNanoTime = System.nanoTime();
session.PacketSent++;
int tcpDataSize = ipHeader.getDataLength() - tcpHeader.getHeaderLength();
if (session.PacketSent == 2 && tcpDataSize == 0) {
return;
}
if (session.BytesSent == 0 && tcpDataSize > 10) {
int dataOffset = tcpHeader.mOffset + tcpHeader.getHeaderLength();
HttpRequestHeaderParser.parseHttpRequestHeader(session, tcpHeader.mData, dataOffset,
tcpDataSize);
// Log.d(TAG, "NatSession: " + session);
// Log.d(TAG, "Host: " + session.RemoteHost);
// Log.d(TAG, "Request: " + session.Method + " " + session.RequestUrl);
}
ipHeader.setSourceIP(ipHeader.getDestinationIP());
ipHeader.setDestinationIP(LOCAL_IP);
tcpHeader.setDestinationPort(mTcpProxyServer.Port);
Utility.ComputeTCPChecksum(ipHeader, tcpHeader);
mVPNOutputStream.write(ipHeader.mData, ipHeader.mOffset, size);
session.BytesSent += tcpDataSize;
mSentBytes += size;
}
break;
case IPHeader.UDP:
UDPHeader udpHeader = mUDPHeader;
udpHeader.mOffset = ipHeader.getHeaderLength();
if (ipHeader.getSourceIP() == LOCAL_IP && udpHeader.getDestinationPort() == 53) {
mDNSBuffer.clear();
mDNSBuffer.limit(udpHeader.getTotalLength() - 8);
DnsPacket dnsPacket = DnsPacket.fromBytes(mDNSBuffer);
if (dnsPacket != null && dnsPacket.Header.QuestionCount > 0) {
mDnsProxy.onDnsRequestReceived(ipHeader, udpHeader, dnsPacket);
}
}
break;
}
}
この質問に関するヘルプや指示は大歓迎です。
前もって感謝します。