路由配置情况如图,我希望 PC1 也能够正常访问:
有没有懂的,指点指点,不知道如何下手。
![]() |
1
UnknownSky 13 天前 via Android
你這 openvpn server 直接掛在 Openwrt 上不得了
|
![]() |
2
UnknownSky 13 天前 via Android
主路由什麼系統,建 server 也要 iptables NAT 規則。
|
![]() |
3
ztechstack 13 天前
openvpn 服务端需要虚拟出一个网络,需要 iptables 指定 source 为改网络的转发到物理网卡上。
iptables -t nat -A POSTROUTING -s x.x.x.x/x -o eth0 -j MASQURADE |
4
Jirajine 13 天前 via Android
你这配的乱七八糟,旁路由上开 masquerade 是要搞什么?
盲猜 hairpin nat 的问题, 把 masquerade 去掉。 |
7
huangya 13 天前
openvpn client 虚拟网卡拿到的 IP 也是 192.168.2.0/24 网段吗?
|
8
huangya 13 天前
另外,在 openvpn client 虚拟网卡上抓下 ssh 或者 web 服务至少有没有三次握手的包。
|
10
huangya 13 天前
@nozer
在 PC1 上添加一条到 10.8.0.0/24 的静态路由.linux 下的命令: sudo route add -net 10.8.0.0/24 gw 192.168.2.1 Windows 用管理员权限打开 cmd: route add mask 255.255.255.0 192.168.2.1 |
![]() |
13
jasonyang9 13 天前
瞎猜的,
PC1 的默认网关是 192.168.2.2 旁路由,所以对 10.8.0.0/24 发来的数据包它不知道如何返回就走默认网关; 旁路由收到后也不知道如何到 10.8.0.0/24,也走它的默认网关,192.168.2.1,且被 iptables 匹配到,做了 MASQ,也就是 SNAT,那么数据包的源地址就被替换为旁路由自己的 192.168.2.2 ; 而请求数据包的目标地址是 192.168.2.10 ( PC1 ),响应却是从 192.168.2.2 收到,就被丢掉了。。。 |
14
nozer 13 天前
|
15
huangya 13 天前
@jasonyang9 yes, I think so. 楼主可以用 wireshark 检查下 icmp 包和 tcp 包的源地址。所以我提供的方案是 vpn 网段直接走 192.168.2.1
|
18
huangya 13 天前
|
19
Lemeng 13 天前
抓包了解走向,走到哪步,哪步出了问题
|
20
huangya 13 天前
|
21
Jirajine 13 天前 via Android
能 ping 通是因为 icmp 自带 redirect,不受 hairpin nat 的影响。
去掉 masquerade 不能上网说明你配的有问题,检查防火墙和内核 ip 转发开了没。 旁路由这种方式本来就是 ipv4 下的一种 trick,踩坑是很正常的,配成两级主干串起来才是正统方式。 |
23
huangya 12 天前 ![]() @nozer
想了下,OpenWRT 上的这条命令还是有问题,当时脑抽了,改成以下估计就可以了。 iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT |
24
nozer 12 天前
@huangya 真的可以了,问题解决。原因应该是跟前面的猜测一致,但是我想请教下,现在的规则是这样的:
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -I POSTROUTING -j MASQUERADE iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT 就是说,发送到 10.8.0.0/24 的包采用的动作是 ACCEPT,但是这里并没有 return,为何就可以产生效果呢? iptables 规则的匹配不是从前到后依次匹配,除非无法匹配,或者 return 才会终止匹配后面的规则。 这个地方,ACCEPT 后,并没有 return,那不是最后还是会匹配到 MASQUERADE 上去,导致数据包源地址发生改变? |
25
huangya 12 天前
不会,ACCEPT 后这个包就在 chain POSTROURING 不会继续跑了,不会到下一条 rule MASQUERADE 中.
ACCEPT 与 RETURN 的区别可以看: https://ipset.netfilter.org/iptables.man.html#:~:text=ACCEPT%20means%20to%20let%20the,the%20previous%20(calling)%20chain. >ACCEPT means to let the packet through. DROP means to drop the packet on the floor. RETURN means stop traversing this chain and resume at the next rule in the previous (calling) chain. If the end of a built-in chain is reached or a rule in a built-in chain with target RETURN is matched, the target specified by the chain policy determines the fate of the packet. 关键点有两个: 1.RETRUN 是返回到 calling chain.然后继续匹配下一条 rule. 2.ACCEPT 是直接接受了(在 build-in chain 或者子 chain ),那 build-in chain 和 build-in chain call 的子 chain 中的 rule 都不会匹配了。 另,调试 iptables 可以用-j LOG 看包是如何跑的。 |