你能帮我解决这个问题吗?我需要将所有流量从 tun0 接口(OpenVPN 隧道)重定向到 eth1 接口。 eth1 是该系统后面的内部网络,用作特殊防火墙...如果我使用此规则(现在仅用于测试目的 - 目标端口 80):
iptables -t nat -A PREROUTING -i tun0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.199.115.146
来自 VPN 的流量正确通过。我在 iptables 统计信息(iptables -L -v)中看到它,但反向流量没有通过。 iptables 显示此错误:
99689.703349 x_tables: ip_tables: tcp match: only valid for protocol 6
我需要仅通过 tun0 接口重定向来自防火墙后面的计算机的所有流量。我也使用这个规则:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
我已启用ip_forward
.如果我仅使用规则-p tcp
而不使用规则,-m tcp
我会在规则中的 iptables 统计活动中看到iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
接口
VPN 服务器(A):
eth0 Link encap:Ethernet HWaddr 00:...
inet addr:MY_PUBLIC_IP Bcast:MY_PUBLIC_IP.255 Mask:255.255.255.0
inet6 addr: .../64 Scope:Global
inet6 addr: .../64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:41909528 errors:0 dropped:0 overruns:0 frame:0
TX packets:373639 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2150448064 (2.1 GB) TX bytes:185713075 (185.7 MB)
Interrupt:10
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.1.1.1 P-t-P:10.1.1.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:82014 errors:0 dropped:0 overruns:0 frame:0
TX packets:164251 errors:0 dropped:24 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:5945388 (5.9 MB) TX bytes:147587733 (147.5 MB)
在防火墙机器上:
eth0 Link encap:Ethernet HWaddr 08:...
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:189399 errors:0 dropped:0 overruns:0 frame:0
TX packets:103528 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:180399131 (180.3 MB) TX bytes:14844868 (14.8 MB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.1.1.2 P-t-P:10.1.1.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:153314 errors:0 dropped:0 overruns:0 frame:0
TX packets:80986 errors:0 dropped:8 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:145341797 (145.3 MB) TX bytes:5818996 (5.8 MB)
eth1 Link encap:Ethernet HWaddr 08:...
inet addr:10.199.115.1 Bcast:10.199.115.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6890 errors:0 dropped:0 overruns:0 frame:0
TX packets:23022 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:710721 (710.7 KB) TX bytes:43966879 (43.9 MB)
机器B:
eth0 Link encap:Ethernet HWaddr 08:...
inet addr:10.199.115.146 Bcast:10.199.155.255 Mask:255.255.255.0
inet6 addr: .../64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24185 errors:0 dropped:0 overruns:0 frame:0
TX packets:8044 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29645960 (28.2 MiB) TX bytes:842414 (822.6 KiB)
架构:
VPN server (A) /eth0 - public IP, tun0 VPN/ <-> Firewall (F) /tun0 VPN, eth1 - internal network/ <-> Server (B) (eth0 - internal network)
从防火墙后面的机器初始化的通信工作正常。非常感谢您的帮助。
路由表:
VPN 服务器 A: - 是 VPS 服务器
10.1.1.2 dev tun0 proto kernel scope link src 10.1.1.1
MY_PUBLIC_IP.0/24 dev eth0 proto kernel scope link src MY_PUBLIC_IP
10.199.115.0/24 via 10.1.1.2 dev tun0
default via MY_PUBLIC_IP.1 dev eth0 metric 100
///一台物理服务器
防火墙 F:是虚拟机 VirtualBox Ubuntu - eth0 是 VirtualBox NAT,但我需要使用 tun0,eth1 是 B 的本地网络
0.0.0.0/1 via 10.1.1.1 dev tun0
default via 10.0.2.2 dev eth0 metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.1.1.1 dev tun0 proto kernel scope link src 10.1.1.2
10.199.115.0/24 dev eth1 proto kernel scope link src 10.199.115.1
MY_PUBLIC_IP via 10.0.2.2 dev eth0
128.0.0.0/1 via 10.1.1.1 dev tun0
eth1 端的 B 机(无 eth0)是虚拟机 Debian 7
default via 10.199.115.1 dev eth0 proto static
10.199.115.0/24 dev eth0 proto kernel scope link src 10.199.115.146
数据包的路由应该尽可能透明甚至不可见......
iptables规则:
在 VPN 服务器 (A) 上:
仅表 NAT:
-P PREROUTING ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-A PREROUTING -i eth0 -p tcp -m tcp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p tcp -m tcp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
过滤表
is empty
曼格表
is empty
在防火墙 (F) 上:
目前在上次修改后
NAT表:
none
过滤表
contains many specific rules for mitigation etc...
曼格表
is empty
在机器B上
without iptables rules
答案1
服务器 A 缺少建议通过 VPN 连接到网络的路由10.199.115.0/24
,因此使用其默认路由(即尝试通过您的公共 IP 到达 B)。
尝试看看是否运行
ip route add 10.199.115.0/24 via 10.1.1.2
服务器 A 上将允许从 A 到 B 的连接(防火墙 F 上没有任何 NAT 规则)
如果这有效,您可以设置 openvpn 在您从 A 启动连接时自动为您创建路由
对您的配置中发生的情况的解释。
这是三种情况下路由/NAT 的发生方式
情况 1:B ping PUBLIC_IP
- 该数据包使用该路由离开 B
default
,因为它是唯一匹配 的数据包PUBLIC_IP
。它被发送到 IP 地址进行路由10.199.115.1
,并带有最终目的地PUBLIC_IP
和源地址10.199.115.146
。 - 数据包由 F 路由。许多路由适用:最具体的一个是发送要在上的
PUBLIC_IP/32
机器上路由的数据包,我猜它是机器 A(openvpn 底层的连接)。10.0.2.2
eth0
- 机器A收到数据包,并回复源地址
10.199.115.146
。如果没有我向您展示的规则,这将被解释为互联网地址,因此回复将通过互联网发送。 - 使用我建议的路由,数据包通过
tun0
机器 F 返回。机器 F 将其路由回eth1
机器 B 接收回复数据包的地方。然而,它的来源被标记为10.1.1.1
,因此它不会被识别为对原始数据包的回复。 Ping 失败。
情况 2:B ping 10.1.1.1
- 与之前相同,数据包离开 B 由 F 路由
- 这次目的地址匹配了规则10.1.1.1/32,所以数据包通过
tun0
- 当数据包通过 发出时
tun0
,MASQUERADE
规则生效,将数据包的源更改为10.1.1.2
。 (如果使用我建议的路线规则,则不需要这样做,请参见下文)。 - 机器A收到数据包,并回复
10.1.1.2
(机器F)。没有MASQUERADE
这个就会被送回10.199.115.146
。对于我建议的路由表条目,这不会有太大变化,因为包裹10.1.1.2
仍然会被发送到路由,但是如果您没有,目的地10.199.115.146
将通过互联网路由。 - 回复数据包由机器 F 接收。如果执行了伪装,则该数据包将被识别为回复,并且其目标地址将更改回
10.199.115.146
。数据包被路由eth1
到其最终目的地。 - 机器 B 将此识别为回复数据包。平成功。
案例3:A ping 10.199.115.146
- 如果没有我提议的规则,原始数据包将被发送到互联网并丢失。否则,它将被发送到
10.1.1.2
路由,源地址 =10.1.1.1
。 - 机器 F 接收数据包并将其路由通过
eth1
。 - B 收到该数据包并将回复发送至
10.1.1.1
。 - 回复通过 进行路由
tun0
。该MASQUERADE
规则将源地址更改为10.1.1.2
。 - 机器 A 收到来自 的回复
10.1.1.2
(该回复不是原始目的地),并将其视为不相关而丢弃。 Ping 失败
如您所见,有两种方法可以将机器从内部网络连接到 VPN:
- 公共路由:两个网络都知道彼此的 IP 地址,并且它们具有特定的路由表条目来查找它们(如我向您展示的那样)。
- SNAT/MASQUERADE:只有一个网络知道如何到达另一个网络,防火墙将从该网络发出的传出数据包的源 IP 地址更改为防火墙自己的 IP(另一个网络已知)。
两者都不要使用。如果使用 SNAT/MASQUERADE,则外部主机上的路由表不适用,因为来自专用网络的数据包永远不会使用原始地址作为源。
PUBLIC_IP
您可以使用或选择机器 A 是否可以从 B 访问10.1.1.1
。也许可以配置防火墙以使两者都可以工作,但这可能不值得付出努力。