【发布时间】:2018-06-19 12:04:24
【问题描述】:
我有以下问题。我需要将我的应用程序发送的 DNS 数据包与来自其他应用程序的标准 DNS 查询区分开来,以便 iptables 进一步过滤。这些请求的源 IP 等于公共接口的 IP,我的想法是将套接字绑定到环回,然后触发请求。不幸的是,我得到了OSError: [Errno 22] Invalid argument 异常。看看这些例子:
import socket
# THIS WORKS FINE - PUBLIC -> PUBLIC
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('192.168.200.15', 7777))
s.sendto('test'.encode(),('192.168.200.16', 10000))
# THIS WORKS FINE - LOOPBACK -> LOOPBACK
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 7777))
s.sendto('test'.encode(),('127.0.0.1', 10000))
# THIS WORKS FINE - PUBLIC -> LOOPBACK
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('192.168.200.15', 7777))
s.sendto('test'.encode(),('127.0.0.1', 10000))
# THIS THROWS ERROR - LOOPBACK -> PUBLIC
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 7777))
s.sendto('test'.encode(),('192.168.200.16', 10000))
# RESULT:
# Traceback (most recent call last):
# File "x.py", line 21, in <module>
# s.sendto('test'.encode(),('192.168.200.16', 10000))
#OSError: [Errno 22] Invalid argument
为什么会这样?我虽然只是启用 net.ipv4.ip_forward 的问题,但事实并非如此。任何帮助表示赞赏。
【问题讨论】:
-
来自@AndrewWinder(没有足够的代表发表评论):在我的接口上为我工作,你分配了正确的接口吗?在第 15 行,您绑定到本地 IP 192.168.200.15,然后在第 21 行发送到 192.168.200.16。
-
抱歉,我可能没有提供足够的信息。 192.168.200.15 - 是我在公共接口上的本地 IP。 192.168.200.16 是我网络中的另一台主机。发生错误的数字也是错误的(现已修复)