【问题标题】:How can I programatically forward TCP connections in Python?如何在 Python 中以编程方式转发 TCP 连接?
【发布时间】:2014-07-17 23:02:02
【问题描述】:

我想以编程方式将本地机器上的传入 TCP 连接重定向到其他机器,并有条件地将它们更改为其他机器

例如,我想将端口 9001 上的传入连接转发到 www.google.com:80 然后一段时间后我想关闭本地计算机上的 9001,而是开始将 9400 上的传入连接转发到 www.yahoo.com:80 或可能同时运行两个转发规则。

我最初认为我可以使用 iptables 来做到这一点,但我不确定。我还查看了 TCP 套接字代理,但我对连接的内容不感兴趣,只是能够以编程方式重定向和关闭它们。

【问题讨论】:

  • 如果你在 linux 机器上,你可以使用 cronjob 和 iptables 来完成。
  • 我的意思是有条件的,而不是定期的。我如何使用 iptables 来做到这一点,因为它们不允许主机名只有 IP?
  • 如果你想要有条件地而不是定期地,创建一个监听条件变化并更新 iptables 的守护进程。 IP 地址在根据条件更改更新 iptables 之前从主机名解析。
  • 查看firewalld 项目。

标签: python iptables portforwarding


【解决方案1】:

您可以使用sockets 库来创建到您要与之通信的 TCP 端口的连接,并不断从套接字读取,直到您拥有尽可能多的数据/已读取任意时间,类似到

conn_in  = socket.create_connection((from_host, from_port))
conn_out = socket.create_connection((to_host, to_port)) 
...
while time() - start_time < desired_time:
    buffer = conn_in.recv(4096)
    conn_out.send(buffer)

并且您可以根据需要添加条件。这似乎有帮助吗?

【讨论】:

  • 如果通信需要双向(和全双工)会发生什么?
  • 因此由 create_connection 初始化程序创建的连接允许两个套接字都连接到sendrecv。因此,如果您愿意,您可以简单地从两者读取到它们自己的缓冲区、处理并发送回其中一个/两个。我很难理解为什么这种方法的双向性存在问题。
  • 我只是说你的代码只涵盖一个方向。
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 2011-10-27
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2011-11-13
  • 2016-09-23
相关资源
最近更新 更多