我在 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/24
A.B.C.2
ipsec.conf
事情是这样的互联网流量无法使用隧道进行路由(通过8.8.8.8
ipsec 隧道发送 ICMP 进行检查)。我非常担心我的 iptables-fu,但我确实花了很多时间来找出问题所在,但还是没有成功。
以下是我的filter
iptables 链中的相关规则:
: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 支持。
不幸的是,设置这些方法的过程超出了该答案的范围,但是我提供了足够的模式来进行谷歌搜索(似乎是一项简单的任务)。