我有一组如下所示的 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
通过使用来指定目标中使用的目标 IPREDIRECT
。
消除 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"