我家使用的是 DSL-5300 VDSL 调制解调器/路由器,已设置 NAT,运行良好。其 Web 界面尚未编写为支持混合 NAT 和非 NAT 流量。
我被分配了 8 个公共 IP 地址。我在其中一个 IP 上设置了一个 Linux 机器,并将其 (eth0) 连接到我的调制解调器。
以 root 身份登录调制解调器并使用 TCPDUMP - 我可以看到通过接口“br0”进入我的 IP 的流量。我还可以看到通过“eth0”使用其 IP 的内部主机的流量。
我试图告诉路由器简单地将发往我的 /29(8 个 IP)之一的所有外部流量中继到我的 Linux 主机,并将来自我的 8 个 IP 中的任意一个 /29 源的所有内部流量返回到互联网。
有人能解释一下如何做到这一点,或者这是否是正确的方法吗?
我从这个开始,但失败了:iptables v1.4.21:找不到目标“NOTRACK”:
iptables -t raw -A PREROUTING -s 203.139.179.48/29 -j NOTRACK
(并且,作为参考,-t raw 也是空的)
我猜我需要以某种方式在顶部(NAT 之前)使用 -t 过滤表,尽管我并不完全确定。
有人能建议使用规则吗?我是否应该添加“路由”?我是否需要说明调制解调器的接口,或者我应该给我的 Linux 机器一个 LAN IP,并告诉我的调制解调器将所有流量发送到“该 IP”,但实际上不破坏任何东西(例如,将数据包中的目标 IP 保留为 203.139.179.49,只使用 192.168.1.x IP 作为某种手段来了解它需要通过哪个接口(eth0)?)
更新:- 我有一个 IP 可以使用 NAT,但我不想在我的公共 IP 上使用 NAT - 我想要直接使用这些 IP。这就是 NAT 运行的原因:
iptables -t nat -A DMZ_PREROUTING -d 203.139.179.49/32 -j DNAT --to-destination 192.168.1.250
(我将 Linux 机器设置为 192.168.1.250 - 但正如我所说,我想将其改回 203.139.179.49/29(所有 8 个公共 IP))。以下是上述表格之前的样例:
# Generated by iptables-save v1.4.21 on Thu Feb 25 21:25:24 2021
*raw
:PREROUTING ACCEPT [757713:146949682]
:OUTPUT ACCEPT [487359:155842609]
COMMIT
# Completed on Thu Feb 25 21:25:24 2021
# Generated by iptables-save v1.4.21 on Thu Feb 25 21:25:24 2021
*nat
:PREROUTING ACCEPT [3356:465245]
:INPUT ACCEPT [685:68545]
:OUTPUT ACCEPT [683:72201]
:POSTROUTING ACCEPT [861:82958]
:DMZ_POSTROUTING - [0:0]
:DMZ_PREROUTING - [0:0]
:MINIUPNPD - [0:0]
:POSTROUTING_MASQUERADE - [0:0]
:PRE_WAN_INFILTER - [0:0]
:REMOTEMANGE_PREROUTING - [0:0]
-A PREROUTING -j REMOTEMANGE_PREROUTING
-A PREROUTING -j DMZ_PREROUTING
-A PREROUTING -i eth0.1 -j MINIUPNPD
-A PREROUTING -i eth0.1 -j PRE_WAN_INFILTER
-A POSTROUTING -j DMZ_POSTROUTING
-A POSTROUTING -j POSTROUTING_MASQUERADE
-A DMZ_POSTROUTING -s 192.168.1.1/32 -d 192.168.1.250/32 -j ACCEPT
-A DMZ_POSTROUTING -s 192.168.1.0/24 -d 192.168.1.250/32 -j SNAT --to-source 110.243.62.22
-A DMZ_POSTROUTING -s 192.168.7.1/32 -d 192.168.1.250/32 -j ACCEPT
-A DMZ_POSTROUTING -s 192.168.7.0/24 -d 192.168.1.250/32 -j SNAT --to-source 110.243.62.22
-A DMZ_PREROUTING -i eth0.1 -p udp -m udp --sport 67:68 -j ACCEPT
-A DMZ_PREROUTING -i eth0.1 -p 47 -j ACCEPT
-A DMZ_PREROUTING -i eth0.1 -p udp -m udp --sport 1701 -j ACCEPT
-A DMZ_PREROUTING -i eth0.1 -p tcp -m tcp --sport 1723 -j ACCEPT
-A DMZ_PREROUTING -d 110.243.62.22/32 -j DNAT --to-destination 192.168.1.250
-A POSTROUTING_MASQUERADE -s 192.168.1.0/24 -o eth0.1 -j MASQUERADE
-A POSTROUTING_MASQUERADE -s 192.168.7.0/24 -o eth0.1 -j MASQUERADE
-A POSTROUTING_MASQUERADE -s 10.8.0.0/24 -o eth0.1 -j MASQUERADE
-A PRE_WAN_INFILTER -p tcp -m tcp --dport 8091 -j ACCEPT
-A PRE_WAN_INFILTER -p tcp -m tcp --dport 8090 -j ACCEPT
-A PRE_WAN_INFILTER -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PRE_WAN_INFILTER -j DROP
COMMIT
# Completed on Thu Feb 25 21:25:24 2021
# Generated by iptables-save v1.4.21 on Thu Feb 25 21:25:24 2021
*mangle
:PREROUTING ACCEPT [42331:8881456]
:INPUT ACCEPT [29716:7485804]
:FORWARD ACCEPT [10415:1252489]
:OUTPUT ACCEPT [28687:7955617]
:POSTROUTING ACCEPT [39144:9224902]
COMMIT
# Completed on Thu Feb 25 21:25:24 2021
# Generated by iptables-save v1.4.21 on Thu Feb 25 21:25:24 2021
*filter
:INPUT ACCEPT [29588:7478145]
:FORWARD ACCEPT [10231:1241814]
:OUTPUT ACCEPT [28644:7927631]
:ALG_FORWARD - [0:0]
:DMZ_FORWARD - [0:0]
:GRC_INPUT - [0:0]
:MACFILTER_FORWARD - [0:0]
:MINIUPNPD - [0:0]
:REMOTEMANGE_INPUT - [0:0]
:WLAN_GUEST_LOGIN_INPUT - [0:0]
-A INPUT -j GRC_INPUT
-A INPUT -j REMOTEMANGE_INPUT
-A INPUT -j WLAN_GUEST_LOGIN_INPUT
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -j MACFILTER_FORWARD
-A FORWARD -j DMZ_FORWARD
-A FORWARD -i eth0.1 ! -o eth0.1 -j MINIUPNPD
-A FORWARD -j ALG_FORWARD
-A DMZ_FORWARD -d 192.168.1.250/32 -i eth0.1 -j ACCEPT
-A GRC_INPUT -m state --state INVALID -j DROP
-A GRC_INPUT -p tcp -m tcp --dport 0 -j DROP
-A GRC_INPUT -p tcp -m tcp --dport 1 -j DROP
-A GRC_INPUT -p tcp -m tcp --dport 8081 -j DROP
-A REMOTEMANGE_INPUT -d 110.243.62.22/32 -p tcp -m tcp --dport 443 -j DROP
-A REMOTEMANGE_INPUT -d 110.243.62.22/32 -p tcp -m tcp --dport 80 -j DROP
-A REMOTEMANGE_INPUT -i br+ -p tcp -m tcp --dport 443 -j DROP
-A WLAN_GUEST_LOGIN_INPUT -d 192.168.1.1/32 -i br1 -p tcp -m tcp --dport 80 -j DROP
-A WLAN_GUEST_LOGIN_INPUT -d 192.168.1.1/32 -i br1 -p tcp -m tcp --dport 443 -j DROP
-A WLAN_GUEST_LOGIN_INPUT -d 192.168.7.1/32 -i br+ -p tcp -m tcp --dport 80 -j DROP
-A WLAN_GUEST_LOGIN_INPUT -d 192.168.7.1/32 -i br+ -p tcp -m tcp --dport 443 -j DROP
COMMIT
# Completed on Thu Feb 25 21:25:24 2021
如何将流量指向内部“公共” IP?是否有“-j NONAT”或类似技巧可以理解“--to-destination”概念,没有重写数据包头中的 IP?(仅供参考 - 我的 Linux 和路由器之间没有其他交换机)。
答案1
路由解释
您的路由器有一些面向 WAN 的 IP,我们称之为router_wan_ip
。该链接“另一侧”的 IP 我们称之为isp_gw_ip
。
如果是任何类型的 PPP,您的路由器很可能在会话设置期间通过 IPCP 协议获取其 IP 地址router_wan_ip
和远程 IP 地址isp_gw_ip
,并且默认路由由 pppd 设置。如果是以太网,您通常需要输入 IP 和子网掩码(通常为 /30 (255.255.255.252))并手动设置默认路由。无论哪种方式,您的路由器都通过该路由具有默认路由isp_gw_ip
。
您有 8 个地址块,我们称之为routed_subnet
。它的掩码为 /29 (255.255.255.248)。通常这意味着,具有地址 的 ISP 路由器isp_gw_ip
安装了类似 的路由routed_subnet via router_wan_ip
。因此,当互联网上的某个人向 内的任何地址发送数据包时routed_subnet
,它会到达 ISP 路由器,并最终将该数据包路由到您的路由器。
如何使用该块取决于你。
通常,您会将其用作 IP 子网,这意味着您要牺牲 2 个地址(全零和全一)。这些地址无法使用。然后,您可以选择剩余的 6 个地址中的任意一个作为路由器的 LAN 面地址。通常使用第一个可用的地址,它将有最后三个位001
,但您可以选择任何位,协议保留的除外。将这些位与子网地址组合起来000
,得到一个完整的路由器 LAN 地址,我们称之为。注意子网掩码将是 /29。111
routed_subnet
router_lan_ip
子网的剩余 5 个地址分配给网络中的计算机。如果您选择路由器,这些地址001
将是010
、011
、100
和。将它们组合起来并获得完整地址,子网掩码再次为 /29。让我们为剩下的讨论选择一个并将其称为。101
110
routed_subnet
computer_public_ip
在计算机上配置时,您还会设置默认网关。哪一个?没错,您的路由器router_lan_ip
必须设置为网关。还记得我们考虑过从互联网到您的某个 IP 的数据包吗?现在,分配了该 IP 的计算机有一条返回互联网的路由,可以进行回复。
必须启用路由器上的数据包转发功能,即sysctl net.ipv4.ip_forward=1
必须以某种方式运行。这就是所有配置。
Arouter_wan_ip
和isp_gw_ip
是“链接”地址,在正常的互联网流量中不会出现。它们不需要公开。通常它们是公开的,因为诸如 ICMP dest unreach 或类似的错误消息仍然使用这些地址,所以最好将它们公开。但有时 ISP 可能会选择牺牲这一点,不浪费额外的宝贵公共 IP 地址。
和router_wan_ip
也router_lan_ip
可能是具有不同网络掩码的相同地址(其中一个将是 /29,另一个将是 /32)。这是 ISP 在那里拥有公共 IP 的方式,但仍然不会浪费来自公共空间的额外 IP。如果是这种情况,即如果 ISP 为您分配属于您子网的链接地址(例如通过 IPCP),您最好在 LAN 端使用完全相同的地址,否则您将使用路由器上 6 个可用地址中的 2 个,只剩下 4 个用于计算机。
一些回顾请参阅此详细而详细的解释。此处的所有地址均包括其各自的网络掩码。计算机和路由器 LAN 地址取自分配给您的地址块。这些命令不一定完全得到执行;例如,ISP 可能使用 Linux 以外的其他命令,或者 pppd 使用略有不同的命令。我仅用 Linux iproute2 命令来表达所有内容,以使本节看起来一致。
在路由器上:
ip addr add router_lan_ip dev lan_iface
ip addr add router_wan_ip dev wan_iface
# ip route add isp_gw_ip dev wan_iface # if PPP
ip route add default via isp_gw_ip
ISP 在其设备上为您执行的操作:
ip addr add isp_gw_ip dev facing_to_you_iface
# ip route add router_wan_ip dev facing_to_you_iface # if PPP
ip route add routed_subnet via router_wan_ip
一台电脑
ip addr add computer_public_ip dev iface
ip route add default via router_lan_ip
防火墙配置
注意,没有什么我还是讲了iptables
,因为它不是路由的东西,而是一个数据包过滤器/转换器,它不直接与路由有关。默认情况下,Netfilter 只允许任何流量。当然,它仍然非常适用于过滤一些流量,现在对你来说唯一的区别是你不再使用 NAT,至少对于这 5 个具有公共 IP 的地址来说不会再使用 NAT。
我不知道如何在路由器中实现此配置。所有专业路由器都需要在需要时明确启用 NAT;相反,SOHO 路由器通常假设您需要它,并且默认情况下启用它。在某些 SOHO 路由器中,您仍然可以根据需要禁用它;但是,我看到了无法禁用 NAT 的框。如果您在界面的某个地方看到“NAT”或“伪装”或“互联网访问共享”选项,那可能就是它。例如,在 OpenWRT 固件中,您可以通过在常规防火墙设置中取消选中(或不选中)面向 WAN 的网络上“伪装”复选框来禁用 NAT。
您还可以翻译一些客户端,而其他一些(五个地址)则不翻译。为此,您需要以下基本配置:
iptables -t nat -A POSTROUTING -s routed_subnet -o wan_iface -j ACCEPT -m comment --comment "Packets from this subnet won't be NATed"
iptables -t nat -A POSTROUTING -o wan_iface -j SNAT --to-source router_lan_ip -m comment --comment "Other packets are source-NATed to the IP of the router itself"
第一条规则只是捕获来自公共 IP 的满意所有者的数据包并尽早接受它们,而不让它们到达第二条规则并进行翻译。
如果路由器有公共地址router_wan_ip
,第二条规则可能会使用该地址进行 SNAT,无论是通过显式-j SNAT --to-source router_wan_ip
还是隐式-j MASQUERADE
。我之所以使用,router_lan_ip
是因为我们确信它是公共的,因为它是从路由到您的公共子网中获取的。如果router_wan_ip
是私有的,您可能需要设置额外的 NAT 规则,例如路由器本身可以访问 Internet:
iptables -t nat -A OUTPUT -o wan_iface -j SNAT --to-source router_lan_ip -m comment --comment "Internetl access for the router itself"
哪些地址可以获取网络中其他(NAT 的)机器,它们连接到哪里?这又取决于您了。例如,最简单的情况是在路由器中为 LAN 设置第三个 IP 接口,该接口具有私有地址。或者您lan_iface
可以有两个地址(一个是公共地址,另一个是私有地址),并且两个网络可以共享同一个以太网段。
所有的过滤(哪些数据包可以转发)都必须在表中完成filter
,要么INPUT
是OUTPUT
往返于路由器本身的数据包的链,要么FORWARD
是网络其余部分的链;这包括两个 LAN 之间的数据包,即使它们共享相同的接口。
再说一遍,我不知道如何在你的硬件上做到这一点。在 Linux 机器上做起来相当容易;在 OpenWRT 上也可以做到,也可以在任何专业路由器上设置。