我只是在想,这个想法出现在我的脑海中。
假设我的局域网中有主机 A 和 B。我有一个路由器和一个互联网上的主机 C。我知道在启动连接时,源端口是随机选择的,但是如果两个主机在启动到同一主机时选择相同的端口会发生什么?
A:10123 -> C:80
B:10123 -> C:80
Run Code Online (Sandbox Code Playgroud)
路由器如何知道每个数据包属于哪个数据包?
干杯。
我读过这个问题,但对称 NAT 的解释不够详细。
请有人帮助我理解以下段落吗?
我阅读了有关对称 NAT 的内容:
从相同的内部 IP 地址和端口到特定目标 IP 地址和端口的每个请求都映射到唯一的外部源 IP 地址和端口,如果同一内部主机发送数据包即使具有相同的源地址和端口但发送到不同目的地,使用不同的映射。只有从内部主机接收数据包的外部主机才能发回数据包。
http://en.wikipedia.org/wiki/Network_address_translation#Types_of_NAT
这是关于UDP 打孔的:
UDP 打孔不适用于大型企业网络中的对称 NAT 设备(也称为双向 NAT)。在对称 NAT 中,与众所周知的 STUN 服务器的连接相关联的 NAT 映射仅限于从知名服务器接收数据,因此,知名服务器看到的 NAT 映射对端点来说不是有用的信息。
http://en.wikipedia.org/wiki/UDP_hole_punching
但我并没有真正吸收它。我觉得它告诉我(在客户端发起通信的客户端 - 服务器应用程序中)除非 NAT 设备明确允许,否则服务器无法以其他方式进行通信。我不明白为什么会这么说。如果可能的话,你能帮我稍微简化一下这个描述吗?
我们的环境存在一个问题,即知名的远程支持工具无法由同样知名的软件供应商使用来为我们提供支持。客户端是代理感知的,但出于某种原因,它认为不使用它并通过端口 1153 上的 UDP 做一些完全不同的事情可能是个好主意。
我正在尝试设置一个 OpenVPN tun 来连接两个局域网
打开的 vpn 连接已启动并正常工作,但我的路由或 nat 或其他问题存在问题。
我需要的是一个工作的、路由的 openvpn 设置在服务器端和客户端应该是什么样子的例子。主要是路由表、NAT翻译、防火墙等。
我的 OpenVPN 客户端可以访问服务器端的网络,但我的服务器甚至无法 ping 我的 OpenVpn 客户端 eth0
我的服务器路由:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.3.0 10.8.0.2 255.255.255.0 UG 0 0 …
将单个端口 DNATing 到内部网络上的不同端口的标准方法是这样的:
ip(6)tables -t nat -A PREROUTING -i wan0 -p tcp --dport 80 --to-destination 10.0.0.1:8080
如果您需要一个端口范围,您可以像这样-m multiport一起使用--dports:
ip(6)tables -t nat -A PREROUTING -i wan0 -p tcp -m multiport --dports 1000:2000 --to-destination 10.0.0.1
现在我想知道您是否可以结合这两种技术将端口范围(例如 1000-2000)映射到相同大小的不同端口范围(例如 12000-13000)。使用不迟于 Linux 4.1 的内核的 Iptables 是否可能?
据我了解,公共子网是可以通过 Internet 网关将流量路由到 Internet 的子网,而私有子网则不能(无法访问 Internet,也无法从 Internet 访问)。为了访问 Internet,私有子网需要通过 NAT 网关路由流量。
我可以确认这一点,因为我实际上成功地使用了这个设置。
但是......亚马逊文档另有说法(我的重点是粗体):

公有子网中的实例可以直接从 Internet 接收入站流量,而私有子网中的实例则不能。公有子网中的实例可以直接将出站流量发送到 Internet,而私有子网中的实例则不能。相反,私有子网中的实例可以使用您在公共子网中启动的网络地址转换 (NAT) 实例来访问 Internet 。
NAT 网关所在的位置是否重要?如果是这样,将它放在私有/公共子网中的用例是什么?
我在 pfsense 上有一个一对一的 NAT,它将公共 IP 分配给内部 IP(运行 Web 服务器)。
当我从内部机器打开公共 IP 时,它不会解析为内部 IP,而是打开路由器网页。
当我从 LAN 外部打开公共 IP 时,它将通过运行 Web 服务器的内部 IP。
为什么我内部打不开公网IP?
我有 FreeBSD 路由器:
#uname
9.1-STABLE FreeBSD 9.1-STABLE #0: Fri Jan 18 16:20:47 YEKT 2013
Run Code Online (Sandbox Code Playgroud)
这是一台拥有大量内存的强大计算机
#top -S
last pid: 45076; load averages: 1.54, 1.46, 1.29 up 0+21:13:28 19:23:46
84 processes: 2 running, 81 sleeping, 1 waiting
CPU: 3.1% user, 0.0% nice, 32.1% system, 5.3% interrupt, 59.5% idle
Mem: 390M Active, 1441M Inact, 785M Wired, 799M Buf, 5008M Free
Swap: 8192M Total, 8192M Free
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
11 root 4 155 ki31 …Run Code Online (Sandbox Code Playgroud) 我有一个“服务器 A”,它附加了多个 IP,如下所示:
eth0:0 1.1.1.1
eth0:1 1.1.1.2
eth0:2 1.1.1.3
Run Code Online (Sandbox Code Playgroud)
我有另一个“服务器 B”,它也附加了多个 IP,如下所示:
eth0:0 2.2.2.1
eth0:1 2.2.2.2
eth0:2 2.2.2.3
Run Code Online (Sandbox Code Playgroud)
现在,我想在“服务器 A”上设置 iptables,以将“eth0:2”上的所有传入流量转发/NAT 到“服务器 B”上的 IP 2.2.2.3。
我已经验证“服务器 A”能够在 IP 2.2.2.3 上与“服务器 B”“对话”。Ping 和 telnet 打开端口工作得很好,我打开了转发标志(net.ipv4.ip_forward=1)
我尝试了多种不同的方式,DNAT、SNAT、MASQUERADE 等,但我无法获得任何工作。
如果我尝试在同一服务器上的 IP 之间转发流量,这条线可以正常工作:
iptables -t nat -A PREROUTING -d 1.1.1.3 -j DNAT --to-destination 1.1.1.2
Run Code Online (Sandbox Code Playgroud)
但是如果我把“1.1.1.2”换成“2.2.2.3”,它就不起作用了。
我假设我需要第二个 iptable 规则来解决它。我尝试了以下 POSTROUTING 规则但没有任何运气(不是同时):
iptables -t nat -A POSTROUTING -d 2.2.2.3 -j MASQUERADE
iptables -t nat -A POSTROUTING -d 2.2.2.3 -j SNAT --to 1.1.1.3
iptables -t nat -A …Run Code Online (Sandbox Code Playgroud) 我在 VPC 中的 Amazon EC2 中有一组服务器。在这个 VPC 中,我有一个私有子网和一个公共子网。在公共子网中,我在 t2.micro 实例上设置了一台 NAT 机器,它基本上在启动时运行这个 NAT 脚本,将规则注入 iptables。从私有子网内的机器从互联网下载文件工作正常。
但是,我将外部高带宽 FTP 服务器上直接从我的 NAT 机器上的文件下载速度与从我的私有子网内的机器(通过同一台 NAT 机器)的下载速度进行了比较。有一个非常显着的差异:从 NAT 机器下载大约 10MB/s,而从私有子网内的机器下载时大约为 1MB/s。
NAT 机器上没有 CPU 使用率,因此这不是瓶颈。在使用更大的机器(具有“中等网络性能”的 m3.medium 和具有“高网络性能”的 m3.xlarge)尝试相同的测试时,我也无法获得大于 2.5MB/s 的下载速度。
这是可以(并且应该)调整的一般 NAT 问题吗?性能下降从何而来?
更新
通过一些测试,我可以缩小这个问题的范围。当我从 2013 年开始使用 Ubuntu 12.04 或 Amazon Linux NAT 机器时,一切运行顺利,我获得了完整的下载速度,即使在最小的 t2.micro 实例上也是如此。无论我使用 PV 还是 HVM 机器都没有关系。问题似乎与内核有关。这些旧机器的内核版本为 3.4.x,而较新的 Amazon Linux NAT 机器或 Ubunut 14.XX 的内核版本为 3.14.XX。有没有办法调整较新的机器?
我在 Amazon Web Services 中有一个 VPC,子网为 172.31.0.0/16。我在这个子网中创建了一个 EC2 实例,并为其提供了一个公共弹性 IP。此 VPC 上有一个 Internet 网关。所以,我的路由表如下所示:
172.31.0.0/16 local
0.0.0.0/0 igw-b4ac67d0
Run Code Online (Sandbox Code Playgroud)
为了解决我无法控制的外部服务上的一些 IP 访问问题,我向该 VPC 添加了一个 NAT 网关,以便到单个外部地址 ABCD 的所有流量都将通过 NAT 网关路由。也就是说,我希望路由表看起来像这样:
# GOAL
172.31.0.0/16 local
A.B.C.D/32 nat-451b3be9
0.0.0.0/0 igw-b4ac67d0
Run Code Online (Sandbox Code Playgroud)
但是,尽我所能,当我单击“保存”时,AWS 界面会切换顺序,因此我总是以
# What AWS gives me
172.31.0.0/16 local
0.0.0.0/0 igw-b4ac67d0
A.B.C.D/32 nat-451b3be9
Run Code Online (Sandbox Code Playgroud)
这个路由表看起来很傻:NAT 网关永远不会被使用,我的流量A.B.C.D似乎仍然来自 EC2 实例的弹性 IP。
如何获取路由表 GOAL?
注:外部服务将允许我补充一个单一的IP地址,这将允许访问。如果我只有一个 EC2 实例,我可以简单地向他们提供 EC2 实例的弹性 IP 地址。但是,我想添加多个以相同方式设置的 EC2 实例。因此,NAT 网关。此外,我不能简单地放弃 Internet 网关而只使用 NAT 网关,因为我需要 EC2 实例上的服务可供外部世界访问。
nat ×10
networking ×4
amazon-vpc ×3
firewall ×3
linux ×2
amazon-ec2 ×1
dmz ×1
freebsd ×1
iptables ×1
openvpn ×1
pfsense ×1
router ×1
routing ×1
subnet ×1
udp ×1