我的 iptables 规则有什么问题,导致它无法为 openvpn 路由?

我的 iptables 规则有什么问题,导致它无法为 openvpn 路由?

相比之下,firewalld只需设置即可完成路由masquerade。所以我确信其余设置都是正确的。以下是总体思路:

[应用程序 -> tun0(10.0.0.2) -> Openvpn 客户端] ----> [Openvpn 服务器(10.0.0.1) -> eth0->公共 IP]---->[www 上的某些 IP]

为了实现它,这里是客户端的 openvpn 配置(简要):

daemon
dev tun
remote 70.34.22.247
rport 1100
lport 1100
proto udp
ifconfig 10.0.0.2 10.0.0.1
writepid /run/tunpid
verb 4
route 209.51.188.116 255.255.255.255 vpn_gateway #gnu.org for debug test

显然,在 IP 209.51.188.116/32 上添加的路由规则确保它将自动要求 openvpn 服务器(位于 10.0.0.1)为其路由请求。curl 209.51.188.116将测试 openvpn 是否正常工作。我已经确认,在打开此 openvpn 隧道的情况下,它会卡住,但没有隧道,它就可以工作。我还在 openvpn 服务器站点上找到了日志记录,因此隧道内的流量确实发生了。虽然“tcpdump”没有显示流量,但conntrack -E确实显示了流量。以下是服务器的配置,它具有日志级别 7,因此隧道内的任何数据包都会被记录:

dev tun0
lport 1100
proto udp
ifconfig 10.0.0.1 10.0.0.2
verb 7

CentOS 7的路由功能明确开启了:

# cat /proc/sys/net/ipv4/ip_forward
1

至于 iptables,我使用的是 iptables 服务,也就是说它会自动使用 加载设置systemctl restart iptables,并且加载成功,否则会出现错误并systemctl status iptables显示不良状态。以下是 上的配置/etc/sysconfig/iptables

# Generated by iptables-save v1.4.21 on Thu Jun  9 14:12:50 2022
*nat
:PREROUTING ACCEPT [27:1704]  
:INPUT ACCEPT [12:648]
:OUTPUT ACCEPT [3:216]
:POSTROUTING ACCEPT [3:216]
#-A POSTROUTING -s 10.0.0.0/8 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/8 -j SNAT --to-source 70.34.22.247
COMMIT
# Completed on Thu Jun  9 14:12:50 2022
# Generated by iptables-save v1.4.21 on Thu Jun  9 14:12:50 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [160:19179]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp --dport 1100 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -s 10.0.0.0/8 -j ACCEPT 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

我怀疑 不起作用-j MASQUERADE,所以我将其更改为直接 SNAT 到 eth0 的地址。但它也不起作用。当然,相反,如果我禁用iptables,而改用firwalld,并设置 accept 1100/udpadd-masquerade一切正常。所以问题一定出在上述配置上。

你知道 iptables 配置有什么问题吗?

答案1

看起来一个方向允许转发,但另一个方向不允许。我建议使用接口名称而不是 IP 地址。

例子:

-A FORWARD -i eth0 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT

相关内容