IPsec-从客户端转发互联网流量

IPsec-从客户端转发互联网流量

我在 Debian 9 VPS 实例上建立并运行了一个 IPsec 隧道(纯 IPsec,没有使用 strongswan 5.5.1 的 L2TP/GRE)。

当前它仅限于 IPv4,因此在 sysctl 中net.ipv4.ip_forward设置。1

客户端可以使用服务器的公共 IP 通过互联网成功连接到远程实例。

远程对等地址设置A.B.C.1为,客户端从上面的子网(从 开始)/etc/network获取地址,该子网设置为。我能够使用此子网中的 IP 从客户端 ping 服务器。A.B.C.0/24A.B.C.2ipsec.conf

事情是这样的互联网流量无法使用隧道进行路由(通过8.8.8.8ipsec 隧道发送 ICMP 进行检查)。我非常担心我的 iptables-fu,但我确实花了很多时间来找出问题所在,但还是没有成功。

以下是我的filteriptables 链中的相关规则:

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p esp -j ACCEPT
-A INPUT -p ah -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A FORWARD -s A.B.C.0/24 -m policy --dir in --pol ipsec -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT

链条如下nat

:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s A.B.C.0/24 -o <public interface> -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s A.B.C.0/24 -o <public interface> -j MASQUERADE
COMMIT

当我尝试传递一些请求时,tcpdump给出了以下连续的几行:

18:32:21.884250 IP my.local.ip > server.public.ip: ESP(spi=...,seq=...), length 104
18:32:21.884250 IP A.B.C.2 > 8.8.8.8: ICMP echo request, id 34822, seq 1024, length 30
18:32:21.884282 IP server.public.ip > 8.8.8.8: ICMP echo request, id 34822, seq 1024, length 30

显然,iptables 会丢弃请求,8.8.8.8或者其响应会被丢弃在某处,因为无法路由回 IPsec 客户端。

我怎样才能正确路由流量或至少排除问题的根源?

谢谢。

答案1

当然不行。根据你的初步信息,你使用的是基于策略的IPSec模式,也称为遗产IPSec。在这种情况下,只有与安全策略- SP - 被转发到远程安全网关。更令人伤心和更重要的是 - 它不是路由,它会被从操作系统的常规数据包流中移除并通过隧道转发。因此,在这种情况下,您需要在策略中描述要通过隧道的所有流量 - 并且 - 剧透警告 - 通常这在技术上是不可能的。

这就是原因为什么这个设置称为遗产- 在大多数情况下,您需要 IPSec 路由模式,因此您要么在堆栈上使用 VTI 模式,要么使用带有中间封装的中间路由接口,如 GRE,- 因此在您的策略中您只需描述匹配流量作为隧道本地和远程端(两侧)之间的 GRE 流量,您仅使用路由。

另一方面,VTI 不使用中间封装,纯粹是一个 IPSec 接口。

这两种方法都得到了 strongswan 支持。

不幸的是,设置这些方法的过程超出了该答案的范围,但是我提供了足够的模式来进行谷歌搜索(似乎是一项简单的任务)。

相关内容