【问题标题】:Is it possible to intercept outgoing tcp requests of a java jar?是否可以拦截 java jar 的传出 tcp 请求?
【发布时间】:2020-07-31 17:58:33
【问题描述】:

我要解决的问题是找出“Etl”java jar 的所有外部依赖项。 jar 可以调用任意数量的外部 Web 服务,但无法真正了解它们调用的内容。

我们从另一个 java 应用程序启动这些 jars(例如“java -jar jarname.jar”),这就是为什么我认为我们可以做一些事情来使用 java 代理或其他东西来拦截来自启动 jar 的所有 http 请求像这样。

总而言之,在启动 java jar 时是否可以拦截所有传出的 tcp 请求?我说 tcp 是因为我们正在寻找所有传出连接数据库、rabbitmq、http。

【问题讨论】:

  • 最好的办法是设置代理服务器
  • 你控制主机吗?那里容易得多
  • “拦截”是指仅记录每个连接,还是可能更改正在传递的数据?
  • @Joni 只记录它们,我们不想对请求进行任何更改。
  • @ControlAltDel 我考虑过代理服务器。您对可以实现这一目标的现成产品有什么建议吗?

标签: java http javaagents


【解决方案1】:

通常的策略是使用wireshark 之类的工具,这些工具可以配置为在漂亮的用户界面中告诉您所有详细信息(包括数据本身),并且您可以简单地过滤“仅由此引起的所有流量”具体流程”。

可以也可以通过代理执行此操作,但是您要为自己注册大量代码工作以获得最终结果,而最终结果将大大不如wireshark之​​类的工具所能提供的你。

如果您想走代理路线,请找到每个可能建立 TCP 连接的入口点调用。希望这只是 Socket,但实际上我敢打赌还有更多,而且我认为那里没有列表。使用 ASM 或 bytebuddy 或其他一些字节码重写工具来“加载”每个“传输中”定义的类,检查它,并重写任何调用,例如Socket 构造函数到你自己的记录这个的实用方法,或者包装这个,以便你可以跟踪它。这将是一个相当大的项目。

不过,您实际上并不需要代理;如果您想知道连接何时发生,只需在您的主要设置一个SecurityManager - 允许一切,但在相关方法中进行一些登录。例如:

class MyNetworkInspectingManager extends SecurityManager {
    @Override public void checkAccept(String host, int port) {
        log.warn("accepting connection on " + host + ":" + port);
    }

    @Override public void checkConnect(String host, int port, Object context) {
        log.warn("opening connection to " + host + ":" + port);
    }

    @Override public void checkConnect(String host, int port) {
        log.warn("opening connection to " + host + ":" + port);
    }
}

还可能覆盖checkListencheckMulticast

然后,在你的主要:

public static void main(String[] args) throws Exception {
    System.setSecurityManager(new MyNetworkInspectingManager());
}

仍然远不如wireshark有用,但设置它需要一个小时左右,而要使代理解决方案发挥作用则需要数周以上。

【讨论】:

  • 感谢您的回答。我认为安全经理可能会工作。我可以使用像 wireshark 这样的工具,但我想要一个更程序化的解决方案,比如你提到的 SecurityManager。我想我会尝试一下,然后用我的发现报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2011-08-26
  • 2020-04-21
相关资源
最近更新 更多