IP 表拦截异常

IP 表拦截异常

我有一组如下所示的 iptable 规则:

-A PREROUTING  --jump intercept-nat
-A intercept-nat --jump DNAT -s 10.10.1.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 80 --to-destination 10.10.1.1:3126 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -s 10.10.1.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 443 --to-destination 10.10.1.1:3127 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -s 10.1.2.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 80 --to-destination 10.10.1.1:3126 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -s 10.1.2.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 443 --to-destination 10.10.1.1:3127 -m comment --comment "intercept-nat"

它旨在将 80 和 443 流量发送到 Squid(一种 http 缓存代理)。我想在 iptables 规则中添加几行,这些行不会将 443 流量定向到特定 IP 地址 10.10.1.1:3127 (squid)

使用案例:我有一个 websocket 服务器,代理后面的客户端需要连接到该服务器,但 squid 不支持 websocket。因此,我希望该流量绕过 squid

答案1

我会做以下事情:

-A PREROUTING -s 10.10.1.0/24 ! -d 10.10.1.1/32 --jump intercept-nat
-A PREROUTING -s 10.1.2.0/24 ! -d 10.10.1.1/32 --jump intercept-nat
-A intercept-nat -d target-ip -p tcp -m tcp --dport 443 -j RETURN
-A intercept-nat --jump DNAT -p tcp -m tcp --dport 80 --to-destination 10.10.1.1:3126 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -p tcp -m tcp --dport 443 --to-destination 10.10.1.1:3127 -m comment --comment "intercept-nat"

每次数据包目的地匹配时,target-ip它都会跳过其余的拦截 nat 规则。我还对您的规则做了一些修改,使其更易读且更易于更改 ;-)。

答案2

绕过 NAT 的最简单方法是 ACCEPT 数据包,这将结束表 (PREROUTING) 和链 (intercept-nat) 中的路径。RETURN 将离开链 (intercept-nat) 并继续通过表 (PREROUTING)。

iptables -t nat -A PREROUTING <some criterium> -j ACCEPT

或者

iptables -t nat -A intercept-nat <some criterium> -j ACCEPT

尽管我写了-A,但你必须将此行放在 NAT 操作之前,或将其插入到第一个位置。

答案3

假设您想要排除某些流量,使其不通过 NAT 传输到您的代理,那么应该在其他规则之前放置一条规则。我不会将其包含在您的用户定义链中,intercept-nat因为该链在逻辑上旨在执行 NAT,而不是不执行 NAT。

简单地:

iptables -t nat -A PREROUTING -d w.x.y.z -p tcp --dport 443 -j ACCEPT

其中 wxyz 是 websocket 服务器地址。

此外,我会修改您当前的规则(尽管我在这里猜测一些事情):

  • 我认为您不需要在匹配部分指定源 IP 地址,因为您可能只想重定向来自内部局域网的所有流量。我假设eth0是外部局域网和eth1内部eth2局域网。
  • 您可能也不需要指定目标 IP 地址,从而节省一些 CPU 周期。我假设 Web 流量不会定向到代理机器,除非您在其上运行 Web 服务器。
  • 如果代理与防火墙在同一台机器上运行,您也可以避免DNAT通过使用来指定目标中使用的目标 IP REDIRECT

消除 IP 地址规范可改善维护,允许重复使用并使事情变得更简单。总的来说就是:

-A PREROUTING -d w.x.y.z/32 -p tcp -m tcp --dport 443 -j ACCEPT
-A PREROUTING ! -i eth0 -j intercept-nat
-A intercept-nat -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3126 -m comment --comment "intercept-nat"
-A intercept-nat -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3127 -m comment --comment "intercept-nat"

相关内容