iptables 网络地址从 LAN 到 VPN 的转换

iptables 网络地址从 LAN 到 VPN 的转换

2018 年 6 月 13 日:我找到了一个解决方案,并编辑了这篇文章,以防它对某人有用。

首先,原帖:

我有一个门户网站,我想要将网络地址从其公共 IP 地址和特定的公共端口号转换为特定的 VPN IP 地址和特定的 VPN 端口号,对于 TCP 和 UDP 流量以及 RTSP-以及通过 HTTP 建立 RTP 隧道。问题是没有数据包通过。该门户除了运行 openvpn 之外,还有一个 apache2 服务器,其 proxypass 和 proxypassreverse 语句允许我在 LAN 和 VPN 之间路由流量,但仅限于 TCP 流量。由于 apache2 无法处理 UDP 流量,因此我尝试设置 iptables 来为我完成此操作。只有一个以太网接口。 VPN 上的设备位于 Internet 上,因此 eth0 和 tun0 流量均流经 eth0。

我已经在 iptables 中设置了规则并启用了 eth0 ( /proc/sys/net/ipv4/conf/eth0/forwarding = 1) 和 tun0 ( /proc/sys/net/ipv4/conf/tun0/forwarding = 1) 以及所有 ('/proc/sys/net/ipv4/ip_forward = 1') 的转发,但没有任何反应。

我已将以下规则添加到默认 iptables 规则中:

-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203

-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT

根据这些规则,我尝试从 Internet(本例中我使用 192.168.192.203)获取端口 10073 的 UDP 和 TCP 流量,并将其转发到 VPN IP 地址 10.221.0.73 和端口 80。

这是完整的规则集:

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*raw
:PREROUTING ACCEPT [1930:216976]
:OUTPUT ACCEPT [1477:229328]
-A PREROUTING -p udp -m udp --dport 8073 -j TRACE
-A OUTPUT -p udp -m udp --sport 8073 -j TRACE
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*nat
:PREROUTING ACCEPT [462:32832]
:INPUT ACCEPT [462:32832]
:OUTPUT ACCEPT [98:6069]
:POSTROUTING ACCEPT [98:6069]
-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*filter
:INPUT ACCEPT [1738:195868]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1333:210602]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

我怎样才能解决这个问题?先感谢您。

其次,这是我修复它的方法......

我在用作路由器的计算机上以及我将流量转发到的计算机上设置了 tcpdump。关键是要设置足够广泛的规则来选择要报告的相关数据包,因为其他流量正在流经两台计算机,并以足够详细的方式进行报告。而且,为了简化事情,我将路由器机器更改为同时也是 OpenVPN 主机的路由器,而不是 OpenVPN 客户端。

这是我在路由器机器上使用的命令,其 LAN IP 地址是 192.168.192.166,其 VPN IP 地址是 10.254.0.1:

tcpdump -n -vv -c 5000 "port 80 or port 10073 or host 10.254.0.1 or host 10.254.0.73 or (host 192.168.192.166 and port 80) or (host 192.168.192.166 and port 10073)" -i any

10.254.0.73 是我将数据包转发到的机器,使用其端口 80。我将数据包发送到路由器上的端口 10073。

这是我将数据包转发到的机器的命令:

tcpdump -vv -n -c 5000 "port 80 or port 10073 or host 192.168.192.166 or host 10.254.0.1" -i any

“-i any”会获取我的“公共”端口 eth0 和“私有”端口 tun0 上的流量。

以下是适合我的路由规则:

root@B16:~# iptables-save
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*mangle
:PREROUTING ACCEPT [73673:9416551]
:INPUT ACCEPT [71740:8067234]
:FORWARD ACCEPT [1933:1349317]
:OUTPUT ACCEPT [120157:14972014]
:POSTROUTING ACCEPT [122090:16321331]
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*nat
:PREROUTING ACCEPT [12313:867446]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [11426:951748]
-A PREROUTING -i eth0 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*filter
:INPUT ACCEPT [71741:8067274]
:FORWARD ACCEPT [1250:1319002]
:OUTPUT ACCEPT [120162:14973202]
:INBOUND - [0:0]
:LOG_FILTER - [0:0]
:LSI - [0:0]
:LSO - [0:0]
:OUTBOUND - [0:0]
-A FORWARD -d 10.254.0.73 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -d 10.254.0.73 -p udp -m udp --dport 80 -j ACCEPT
COMMIT
# Completed on Wed Jun 13 14:52:56 2018

我没有发现 iptables 中的 TRACE 有用,因为获得正确的规则太难了。使用 tcpdump 挽救了局面,一旦我获得了正确的规则和详细信息,因为我可以看到转发何时开始工作,但数据包没有返回到路由器;他们被返回到试图通过路由器转发消息的笔记本电脑。我还可以看到发生了校验和错误——这是完全出乎意料的。

我读了很多相互矛盾的帖子,每个帖子都说“这对我有用”,但它们对我不起作用。一个问题是 iptables 规则显然是依赖于操作系统的;我正在使用 Debian,这改变了它们,谁知道为什么。我从来没有找到关于如何构建 iptables 规则的完整解释,只有几个例子。

干杯。

相关内容