Articles of NAT

服务器在几次正常连接之后停止发送SYN ACK

我有一个NAT后面的几千台设备与两台服务器通话。 每个设备都在本地路由器(思考调制解调器/路由器)的后面,在这个路由器上,这些路由器将NAT转换到拥有数千个这些设备的专用networking,并且在这个专用networking的网关上,来自这些设备的TCP会话获得NAT过载/dynamic地PAT到单个全局IP地址上的端口。 这意味着,设备1将与服务器通话,连接将来自global_ip_of_the_router:port_number_1。 一旦设备1完成通话,并且NAT关联被移除,则当设备2想要与同一服务器交谈时,远程路由器可以向设备2分配相同的全局端口,即服务器可以看到来自global_ip_of_the_router:port_number_1的新的TCP连接 这些设备本身启动一个TCP连接,做一个小文件的HTTP POST,断开TCP连接,为下一个文件build立一个新的连接等。这适用于〜20个文件,之后在SYN上,设备从服务器取回没有SYN的ACK。 ACK具有与SYN上的序列号完全不同的ACK号。 设备立即发送一个RST,在1秒后退出并从同一个源端口尝试一个SYN,仍然只是ACK,所以在放弃之前它会保持退后3,6,12,24,48秒。 在设备的RST上,似乎是使用ACK中的SEQ,试图closures旧的连接(从服务器的angular度来看) 远程主机是AWS ELB。 以下是我们所做的假设和我们所尝试的: 远程路由器必须处理TCP会话死亡,并且超时NAT,并且比目标服务器(ELB)更快地重新使用全局端口。 这可能会导致ELB处于TCP_TIME_WAIT状态,这就是为什么它使用ACK来响应SYN。 由于ELB的TCP TIME WAIT不是已知的,假设它是Linux内核默认的标准60秒,它将匹配远程路由器上的FIN / RST后NAT超时。 不过,我们在路由器上将其更改为70秒,以避免任何竞争条件。 这并没有使问题消失。 我们认为,如果远程路由器更快地杀死了NAT,则会在设备进行退避时为SYN重试分配新的NAT。 如果dest服务器上的问题与远程路由器上使用的全局端口号绑定,那么看到新的SYN来自路由器IP上的新的全局端口应该会导致它离开奇怪的状态。 现在,虽然我们可以看到这个工作,但是看起来新分配的NAT端口在服务器上也遇到了同样的问题,它返回了一个假ACK,但是又有一个不同的ACK号。 另一种假设是,这只是在SYN上的SEQ比在远程路由器上使用相同的全局端口的最后一次连接上的序列号低时发生的。 即伪ACK上的ACK编号将总是高于SYN上的SEQ。 (我们将Wireshark切换到绝对序列号来查看)。 然而事实certificate,我们看到SYN SEQ比假ACK上的ACK号更多的情况。 所以这个理论走到了一边。 我们现在对这里可能发生的事情感到不知所措。 我们的怀疑是在新连接获得与旧连接相同的全局端口,但是,如果是这样的话,(a)通过使路由器保持更长的NAT,应该阻止它,并且(b)通过使路由器先closuresNAT,然后为同一连接尝试分配一个不同的NAT,这应该避开这个问题。 在这里理解行为的任何帮助将非常非常感激。 Wireshark跟踪: http : //www.filedropper.com/traffictrace-anonymizedandpacketswithpayloadremoved 请注意,跟踪已被匿名(IP和MAC被replace),所有带有有效载荷的TCP数据包已被删除。 问题的第一个实例始于分组129,第二实例分组382,然后是463,699,816,1120,1278,1323等 查看跟踪中最后一个实例,这是我们缩短了路由器上NAT后FIN / RST超时的地方。 你可以看到,前四次,ACK的AKC号码是2899295595.但是在第5号,ACK是3102149417.在第6号,它是4158039292.这是因为在这里,路由器被设置为超时的NAT所以这些尝试来自路由器上不同的全局端口。 如果问题与全局端口和以前使用全局端口的连接有关,则应该停止它。 但问题依然存在,这导致我们认为这不是源端口相关的,而是由TCP SYN本身产生的。 昨天,我们尝试将NAT后FIN / RST定时器设置为300秒,这些断开的连接就消失了。 我的猜测是我们把端口重用延迟到了ELB丢弃了以前连接的某个点。 我们想知道,如果ELB上的空闲超时设置为295秒,那么TCP_TIME_WAIT的值也是相同的,即使在FIN之后,连接也是有效的。 虽然如果是这样的话,我们应该看到更多的连接失败,因为路由器上的端口复用非常猖獗。 很高兴知道到底发生了什么。

Linux VPN路由器

我有一台Linux机器被设置为自动将VPN隧道连接到公司networking。 将本机设置为从本地networking到目的地为194.1.0.0/16**和10.0.0.0/8的NATstream量,通过隧道连接到具有公司networking的机器。 本地networking上的客户端设置为将此服务器的IP作为其默认网关,如通过dhcp发布的。 这一切都工作得很好,除了发往互联网的stream量也通过这个主机路由。 即客户端A(192.168.1.144)想要与Google的DNS服务器(8.8.8.8)交谈。 目前发生的事情是,它将数据包发送给VPN主机(192.168.1.108),然后将其发送到ADSL路由器(192.168.1.254),该路由器通过互联网将其转发出去。 然后,响应(大概)在到达A之前通过VPN主机返回。 我希望VPN服务器在接收到一个不指定给VPN末端networking的数据包时,用ICMPredirect来响应,指示A通过192.168.1.254发送。 这应该将负载从VPN服务器上移走。 我已经尝试在DHCP服务器(Ubuntu 16.04.1 LTS ISC DHCPD)设置静态路由,以便所有的默认网关是192.168.1.254和VPN主机可以通过192.168.1.108访问,但我或者configuration错误或各种客户端无法拿起选项。 客户端是一系列Windows机器(7和10),Linux机器(主要是Ubuntu)和Android设备。 VPN服务器运行Ubuntu 16.04.1 LTS。 以下脚本设置了NAT: echo 1 > /proc/sys/net/ipv4/ip_forward iptables-restore <<EOF *nat -A POSTROUTING -j MASQUERADE COMMIT EOF 机器上的路线是: Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 ens2 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 […]

在GRE隧道(或NAT)下使用IP进行虚拟化

那么这就是我所经历的情况: 我有一个来自OVH的专用服务器,还有一个来自另一个公司的专用服务器,因为OVH服务器的最大RAM(GAME类别)是64Gb的RAM,而且我还需要更多,我想build立一个GRE隧道或者一个NAT隧道?我猜?我不知道我在另一个站点上看到过)为了使用实际上分配给另一台专用服务器上的OVH服务器的IP,以便我可以使用这些IP虚拟化它,明确: 我有受DDoS保护的服务器1,以及根本不受保护的服务器2。 其任务是:在服务器2上制作受DDoS保护的VPS。 为了做到这一点,我需要使用分配给服务器1的IP,为了做到这一点,我应该使用哪种types的隧道,以及如何(因为即使你告诉我隧道的types,我会全新的我想,所以如果你可以请链接指南)? 提前致谢! 问候。

无法在Ubuntu 16.04中使用netstat-nat查看IP连接

我已经在Ubuntu服务器(16.04)上设置了NAT,并使用TCP dump来validationNAT是否正常工作。 我现在试图使用netstat-nat来查看连接,所以我可以快速演示它的工作,而不诉诸数据包捕获。 但是,Ubuntu似乎在停止netstat-nat的工作。 跟踪输出给出: strace -f netstat-nat . . . open("/proc/net/nf_conntrack", O_RDONLY) = -1 ENOENT (No such file or directory) open("/proc/net/ip_conntrack", O_RDONLY) = -1 ENOENT (No such file or directory) fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), …}) = 0 write(1, "Could not read info about connec"…, 111Could not read info about connections from the kernel, make […]

为redhat永久添加默认路由

我有一个由几台RedHat_7电脑组成的集群。 主节点连接到两个networking(内部和Internet)。 我曾经利用NAT为所有电脑提供互联网服务。 出于某种原因,这种方法现在不起作用。 NAT cmds显示如下。 sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o em4 -j MASQUERADE sudo sysctl -w net.ipv4.ip_forward=1 通常,我必须添加一个默认路由, sudo route add default gw 'my_gateway' em4 那么,我可以上网了。 但是,它只能运行几分钟,所以我必须定期执行这些命令。 路线-n得到下面: Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.10 0.0.0.0 UG 100 0 0 em1 0.0.0.0 XXX1 […]

同一networking,两个接口卡,不同networking的主机

有人能帮忙吗? 我有一个具有固定IP地址10.0.0.2的小工具,我无法更改。 它需要与我的笔记本电脑交谈,而笔记本电脑又需要与互联网交谈。 我的主网卡从DHCP服务器获取IP。 我有一个IP地址为10.0.0.5的二级网卡,我曾经通过这个接口与设备交谈。 我必须移动到另一个网段,恰好有它的IP范围为10.0.0.0/24。 大。 我也不能影响这个。 现在我陷入了一个问题。 10.0.0.2正在使用中,所以我不能只做简单的事情,把固定IP的小工具插到这个networking上,过后快乐地生活。 这意味着我现在需要修改我的Ubuntu主机,以便它可以通过eth0与10.0.0.254(默认网关)通信,通过eth1与10.0.0.2通信。 我到底怎么做到这一点? 我的eth0得到一个随机的10.0.0.x IP,我的eth1被固定为10.0.0.5。 我试过的是如下: 添加一个静态条目到arp表来告诉10.0.0.2在xx:xx:xx:xx:xx:xx通过interface eth1 在与10.0.0.2交谈时试图将我的出站连接绑定到10.0.0.5 将eth1改为完全不同的东西(10.42.0.1),并使用iptables使得当一个数据包传输到10.42.0.2时,它实际上会转到10.0.0.2。 这些都没有工作。 当我tcpdump的eth1,所有stream量仍然尝试通过eth0退出情况1和2.情况3,我可以使redirect到10.0.0.2发生,但stream量然后只是select错误的接口,并从eth0退出,因为eth1没有那里有一个地址。 我应该怎么做? 我知道这是一个愚蠢的问题,没有必要告诉我。 应该有方法来改变这些networking之一,但目前这不是一种select。 最终会是,但如果我能find一个临时的解决scheme,我将节省几个星期的时间。 我想我可以解决的唯一方法是把另一台计算机,连接到eth1,使用10.42.0.0/24networking,然后设置此计算机中继stream量到10.0.0.2。 现在,它应该可以工作,因为它在该networking中没有多个接口。 这个问题是获得另一台计算机或路由器。 H

Ubuntu / KVM的 – Iptables的NAT规则转发端口从主机到访客不工作的权利,(影响http)

为了说明这一点,我安装了Ubuntu 17.04并安装了KVM,然后成功configuration了Windows Server 2016标准虚拟机。 networking/互联网接入明智的一切工作完全正常,直到今天上午我注意到,在浏览器中导航时,我无法访问某些网站。 我发现了问题的根源,但是我对iptables的了解很less,经过无数个小时的研究,我仍然没有想到。 这是问题的影响。 HTTP S网站工作。 HTTP网站不工作(ERR_CONNECTION_TIMED_OUT) 我在IIS上的IIS网站工作,并可以从任何地方访问 我正在使用主机和来宾之间的NAT连接。 我使用它们提供的/ etc / libvirt / hooks / qemu脚本来转发端口,我发现问题的根源(下面的编号1和2) 编辑:我把这些在这里看得更好: 1- sbin / iptables -t nat -D PREROUTING -p tcp –dport 80 -j DNAT – to $ GUEST_IP:80 2- sbin / iptables -t nat -I PREROUTING -p tcp –dport 80 -j DNAT – 到目的地$ […]

把一些VPC的实例放在NAT网关的后面,把剩下的部分放在外面

我有几个ec2实例的VPC。 每个人都有一个公共的ip +能够通过本地10.0.0.0networking互相通信+通过互联网网关上网。 我只需要在NAT网关的后面放置几个这样的实例,为其分配弹性IP,所以当它们连接到某个外部服务时,它们具有相同的公共IP。 问题是,我无法find一种方法来将VPC的某些成员放在此NAT网关的后面。 一般来说,我可以编辑VPC的路由表,就是这样。 我无法find创build另一个VPC的方法,只包含第一个VPC的某些成员。 那么最好的办法是什么? PS它是一个NAT网关,而不是一个NAT实例。 因此,我为VPC创build了一个新的子网,创build了一个新的networking接口并将其连接到其中一个实例:实例从此子网获得了新的IP,新路由自动创build: # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default ip-10-0-1-1.ec2 0.0.0.0 UG 0 0 0 eth0 default ip-10-0-200-1.e 0.0.0.0 UG 10001 0 0 eth1 10.0.1.0 * 255.255.255.0 U 0 0 0 eth0 10.0.200.0 * 255.255.255.0 U 0 0 0 […]

通过不同于默认网关的网关进行NAT吗?

我的Synology NAS有一些棘手的设置: 有一个VPN隧道启动并运行,也作为默认网关(tun0,GW:10.129.15.229)。 这是有意的,应该保持这样的状态,以便在NAS上启动的所有内容都通过VPN。 我现在想在本地networking上使用NAT(由私有networking192.168.2.0/24中的其他计算机启动,使用本地网关192.168.2.1)。 只需使用这样的iptables规则来切换NAT modprobe iptable_nat iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT –to-source 192.168.2.20 似乎干涉默认的名为1(没有发生/不工作)的GW。 任何想法如何设置这个? 我可以用iptables标记软件包,然后为这些标记的软件包明确设置192.168.2.1路由吗? 非常感谢!

设置路由器,有些设备无法到达

我正在做一个fedora路由器和DNS。 我从来没有做过更难的networking,但现在我需要这样做,但是我find的路由器指南似乎都不适合我。 我删除了所有内容,并以最简单的configuration启动了几次,至今没有成功。 这是我的简化networking: fedora router and dns ||192.168.122.1 — virbr0 ————— virbr0-guest 192.168.122.x ||10.0.0.53 —– enp4s0f2 — tplink —- tplink-guest 10.0.0.x || 10.0.0.1 ||192.168.8.53 —- wlp3s0 —- wifi —- internet 192.168.8.1 我试过用这些结果在所有设备上ping: Fedora可以ping任何东西,DNS在所有设备上工作 virbr0上的 KVM可以访问互联网,并能ping通所有的东西 tplink-guest可以ping的fedora和wifi ,也可以ping互联网主机,但不能通过浏览器访问它们 这里是firewalld和路由器的configuration: [root@fedora ~]# firewall-cmd –list-all –zone externalexternal (active) target: default icmp-block-inversion: no interfaces: enp4s0f2 sources: services: ssh […]