Linux IP#u透明SYN未获取SYN+;本地主机上的ACK响应

Linux IP#u透明SYN未获取SYN+;本地主机上的ACK响应,linux,tcp,transparentproxy,Linux,Tcp,Transparentproxy,我正在编写以下程序(尽管我不认为这是问题所在): 如果我注释掉了绑定,那么一切都按预期进行。似乎没有相关的防火墙端口,rp\u filter在环回上设置为0 为什么不接受连接?这是我的代码中的错误,还是与此配置有关?您正在尝试创建从某个外部地址(93.184.216.34)到127.0.0.1的TCP连接。因此,必须使用源127.0.0.1和外部地址作为目标来创建SYN+ACK。只是,没有使用环回接口(127.0.0.1)到此外部地址的路由,因此无法发送SYN+ACK。您正在尝试创建从某个外部地

我正在编写以下程序(尽管我不认为这是问题所在):

如果我注释掉了
绑定
,那么一切都按预期进行。似乎没有相关的防火墙端口,
rp\u filter
在环回上设置为0


为什么不接受连接?这是我的代码中的错误,还是与此配置有关?

您正在尝试创建从某个外部地址(93.184.216.34)到127.0.0.1的TCP连接。因此,必须使用源127.0.0.1和外部地址作为目标来创建SYN+ACK。只是,没有使用环回接口(127.0.0.1)到此外部地址的路由,因此无法发送SYN+ACK。

您正在尝试创建从某个外部地址(93.184.216.34)到127.0.0.1的TCP连接。因此,必须使用源127.0.0.1和外部地址作为目标来创建SYN+ACK。只是,没有使用环回接口(127.0.0.1)到该外部地址的路由,因此无法发送SYN+ACK。

缺少的SYN+ACK应具有以下信息:

127.0.0.1:7007 -> 93.184.216.34:31337
在遍历路由表时,目标IP将与默认路由匹配,并将被安排在
eth0
上退出(如预期)

但是,
eth0
已启用保护(与系统中的所有其他接口一样)。由于源地址是
127.0.0.1
,因此数据包永远不会出去,也永远不会被
tcpdump
报告

一种解决方案是关闭
eth0的火星数据包保护:

# echo 0 > /proc/sys/net/ipv4/conf/eth0/route_localnet
但是,这会禁用非常有用的保护。一个更好的解决方案是将此通信量引导到环回接口,从使用源路由开始:

# ip rule add from 127.0.0.1 lookup 100
# ip route add local default dev lo table 100

这样,透明代理和本地服务之间就可以使用外部IP地址和端口建立实际连接。

缺少的SYN+ACK应该包含以下信息:

127.0.0.1:7007 -> 93.184.216.34:31337
在遍历路由表时,目标IP将与默认路由匹配,并将被安排在
eth0
上退出(如预期)

但是,
eth0
已启用保护(与系统中的所有其他接口一样)。由于源地址是
127.0.0.1
,因此数据包永远不会出去,也永远不会被
tcpdump
报告

一种解决方案是关闭
eth0的火星数据包保护:

# echo 0 > /proc/sys/net/ipv4/conf/eth0/route_localnet
但是,这会禁用非常有用的保护。一个更好的解决方案是将此通信量引导到环回接口,从使用源路由开始:

# ip rule add from 127.0.0.1 lookup 100
# ip route add local default dev lo table 100

这样,透明代理和本地服务之间的实际连接就可以使用外部IP地址和端口建立起来。

为什么源地址对这种情况很重要?计算机上没有定义源路由?@ShacharShemesh:SYN+ACK的源IP必须与SYN的目标匹配。源IP 127.0.0.1绑定到环回,因此SYN+ACK必须离开环回接口。但是没有涉及环回接口的外部地址路由。将地址更改为127.0.0.1以外的其他地址确实会导致发出SYN+ACK,因此您至少部分正确。我不明白的是为什么。我被教导(许多年前)源地址不会影响路由决策。什么命令会将丢失的路由添加到环回?@ShacharShemesh:我不确定您的设置首先要实现什么。我实际上已经找到了解决我特定问题的方法。我不明白的是为什么这个解决方案是必要的。同样地,给我一个没有ip规则的命令行,它可以为来自127.0.0.1的数据包添加任何路由(lo、eth0等等)。当我浏览
ip规则
手册页时,它清楚地说“互联网上使用的经典路由算法仅根据数据包的目的地址做出路由决定”。似乎在这里这不是真的,尽管没有任何ip规则。我不明白为什么。为什么来源地址对那个案子很重要?计算机上没有定义源路由?@ShacharShemesh:SYN+ACK的源IP必须与SYN的目标匹配。源IP 127.0.0.1绑定到环回,因此SYN+ACK必须离开环回接口。但是没有涉及环回接口的外部地址路由。将地址更改为127.0.0.1以外的其他地址确实会导致发出SYN+ACK,因此您至少部分正确。我不明白的是为什么。我被教导(许多年前)源地址不会影响路由决策。什么命令会将丢失的路由添加到环回?@ShacharShemesh:我不确定您的设置首先要实现什么。我实际上已经找到了解决我特定问题的方法。我不明白的是为什么这个解决方案是必要的。同样地,给我一个没有ip规则的命令行,它可以为来自127.0.0.1的数据包添加任何路由(lo、eth0等等)。当我浏览
ip规则
手册页时,它清楚地说“互联网上使用的经典路由算法仅根据数据包的目的地址做出路由决定”。似乎在这里这不是真的,尽管没有任何ip规则。我不明白为什么。