刚刚发现苹果在最新的 MacOS 中放弃了 pptp 支持,因此改为配置 ikev2 ipsec 访问。客户端很满意,一切都很简单,除了一件事 - ipsec 客户端无法访问连接到的同一主机上运行的任何服务。当然,可以使用直接 iptables 配置轻松完成,但我使用 firehol 多年,配置很大,没有时间将其重写回 iptables 规则。我不知道如何在接口上指定 ipsec 访问。
细节:
假设我有用于互联网访问的 eth1 wan 接口和用于局域网的内部 eth0 接口,我的 firehol 配置如下:
interface eth1 inet
protection strong
policy reject
server ESP accept
server AH accept
interface eth0 lan
policy accept
client all accept
server all accept
router inet2lan inface eth1 outface eth0
client all accept
router lan2inet inface eth0 outface eth1
route all accept
masquerade
到目前为止一切顺利,我可以通过 ipsec 连接到服务器,并且我的数据包可以很好地发送到局域网。但是,问题是,我无法连接到服务器上直接运行的任何服务。据我了解,发生这种情况是因为 ikev2 不是真正的 vpn,而只是与 eth1 接口的安全连接,因此 eth1 的所有策略都适用于任何 esp/ah 连接。我检查了它,禁用了所有 eth1 规则:
interface eth1 inet
policy accept
client all accept
server all accept
并且发现,在这种情况下,一切确实运行正常,并且所有本地服务和局域网都可以访问。
所以,我的问题是,如何分离配置并做出类似的事情:
interface eth1 inet server ESP AH
policy accept
client all accept
server all accept
interface eth1 inet server not ESP AH
protection strong
policy reject
server ESP accept
server AH accept
这只是一个示例,它实际上不起作用,但也许有办法配置这样的访问?在任何地方都找不到它,也许我找错了什么?据我了解,我只需要强制 firehol 执行类似以下操作:
iptables -I INPUT --match policy --pol ipsec --dir in --proto esp -s 172.16.0.0/16 -j ACCEPT
iptables -I OUTPUT --match policy --pol ipsec --dir out --proto esp -d 172.16.0.0/16 -j ACCEPT
假设远程主机位于 172.16/16 中。但不知道如何操作。请帮忙。
谢谢
答案1
好的,我会尝试回答这个问题,因为我已经好几年没用过 firehol 了,但下面是我创建服务异常的方法:
# IP exception list (Madeup IP's of course, but you get the idea)
exceptIPs="10.4.1.12 172.16.0.12"
# Define request limit rate
inter_reqs="10/sec"
intr_reqs="20/sec"
# Define openvpn ports/service. Not defined by default.
server_openvpn_ports="udp/1194"
client_openvpn_ports="default"
# Define internet facing ports/services
intservices="openvpn ipsecnatt isakmp"
interface eth0 lan
policy reject
protection strong ${intr_reqs}
server all accept
server ident reject with tcp-reset
client all accept
interface eth1 internet
policy drop
protection strong ${inter_reqs}
server ${intservices} accept
server ssh accept src ${exceptIPs}
server ping accept src ${exceptIPs}
server ident reject with tcp-reset
client all accept
interface tun0 vpn
# allow all incoming connections on the VPN
server all accept
# allow all outgoing connections on the tunnel device.
client all accept
router internet2vpn inface eth1 outface tun0
# route freely to the VPN
route all accept
router vpn2internet inface tun0 outface eth1
# use NAT masquerading from the VPN
masquerade
route "${intservices}" accept
router vpn2lan inface tun0 outface eth0
# Add routes to allow traffic from tun0 to internal network.
route all accept
router lan2vpn inface eth0 outface tun0
# Add return route for VPN traffic
route all accept
解决传输模式问题:Michael 指的是主机到主机连接的特定形式,而不是通过安全网关进行隧道传输。老实说,我很难找到有关实际配置传输模式的大量信息,但 RFC 的引言段落明确指出 IPSEC 有两种模式:
https://datatracker.ietf.org/doc/html/rfc3884
Libreswan 手册页如下。查看 conn 部分中“type”参数的定义:
https://libreswan.org/man/ipsec.conf.5.html
目前,您的主机目前是路由器,也是外部世界和内部 LAN 之间的安全网关。因此,与传输配置相反,您可能已经在运行隧道 IPSEC 配置。至少,您很可能正在运行。您没有发布有关 IPSEC 配置的任何信息,所以我不知道。也就是说,在 libreswan 中,默认是隧道模式;您必须通过定义类型参数来明确启用传输模式。对于 Libreswan,我在配置示例中也找不到传输模式的提及。这至少对我来说意味着这不是一种特别流行的为 IPSEC 配置 Libreswan 的方法。
最后,Firehol 非常智能,它知道您有时可能希望将 iptables 规则直接集成到配置中。快速查看手册页应该可以澄清这一点:
https://firehol.org/firehol-manual.html#firehol-iptables5
您必须知道要将规则集转储到哪个 iptables 队列,根据我的经验,通过 firehol 执行此操作相当复杂。
我不确定这些是否会对您有帮助,但我想我会尝试给出一个答案。
我也同意其他评论者的观点,你应该停止使用 firehol。主要是因为速度问题,也就是说 firehol 通常会为流量构建一个包含几百条甚至几千条规则的规则集。虽然配置文件的语法非常合理,但它会导致速度明显变慢,如果你切换回正常的 iptables 规则,你就会注意到这一点。我以前几乎使用过这个规则集,并且经常听到有人抱怨速度太慢。这是通过 OpenVPN 进行的,它比 IPSEC 慢。我的防火墙现在大约有 20 条线路,连接速度至少是原来的两倍,甚至比 IPSEC 还要快。虽然你现在可能没有时间,但最终配置一个测试系统并进行一些速度对比测试对你来说会很有帮助。