于Linux系统之中,网络管理之核心技能包含网络数据包的转发以及过滤,iptables乃其经典的防火墙以及NAT工具,虽说在新系统里渐渐被nftables所替代,但是理解其端口映射也就是DNAT的实现,对于管理现有的服务器、理解网络地址转换原理依旧是极为关键的,这直接关乎到怎模样安全且精确地把外部请求导向至内部服务 。
如何理解iptables端口映射的基本原理
把目的地址予以转换,于iptables的情境里更确切地讲称作端口映射,即DNAT,它于nat表的PREROUTING链当中展开相关工作,它的主要原理是去将数据包的目的端口以及目的IP予以更改,当有一个外部请求抵达服务器的特定端口以及公网IP时,在进入本地进程路由判定之前,iptables会把它的目标转变为内部网络里另一台机器的私有IP以及端口。
对请求发起者而言,此进程呈现出一副全然的透明状态。比如说,你将位于公网IP位置的那个8080端口,映射至内网中192.168.1.100所对应的80窗口处。当外部用户访问“公网IP:8080”这个地址时,其数据包抵达服务设备的网卡处后,目标会即刻被转换为“192.168.1.100:80”,随后,系统依据全新的目标IP执行路由选择,并将包传输导向内网设备。当时,于内网器材展开回应之际,凭借配置妥善的网关,以及别的连接追踪机制,源地址会自行变换,而后回归至原本的位置。
如何设置iptables实现简单的端口转发
当尚未开始着手来进行端口相关的转发操作的时候,务必要保证系统已然开启了IP转发这一功能哟。你能够借助执行sysctl net.ipv4.ip_forward=1这样一个命令去临时地开启这种功能,又或者是修改/etc/sysctl.conf文件之中的net.ipv4.ip_forward=1,随后执行sysctl -p使得它能够永久地生效呢。这那可是数据包能够在不同的网络接口之间去进行转发的一个前提方面的条件呀。

有一项这般相当基础的端口映射规则存在着linux iptables端口映射,即iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 ,这条规则所表达的意思是,在nat表的PREROUTING链当中去增添一条规则,基于TCP协议、目标端口是8080的数据包,执行DNAT操作,对其目标地址予以改变,使之成为192.168.1.100,将该数据包的目标端口转化为80 。在完成执行之后,发往本机8080号端口那里的TCP流量,将会被进行转发操作,转而被送到指定内网地址的80端口处 。
端口映射后如何确保数据包能正确返回
仅仅设置DNAT规则常常是不足够的,原因在于数据包的返回路径有可能存在问题嵌入式linux,这主要与两个关键要点相联系,其中一点是内网服务器的默认网关得指向运行iptables的那台转发服务器,如此回复包才可以被送达至转发服务器之上。

存在针对连接跟踪(conntrack)的辅助行径,iptables 的nat表达成 DNAT 之后,系统会对连接状态予以记录,在内网服务器回复包抵达转发服务器之际,连接跟踪机制会依据记录,把回复包源地址,也就是内网服务器私有 IP 变回最初请求目标地址linux iptables端口映射,也就是转发服务器公网 IP,此进程由像-j MASQUERADE或者-j SNAT这类规则来完成,通常于 POSTROUTING 链进行设置。
如何利用iptables实现多对一的端口映射
常常在实际存在的网关服务器那里,时常需要把各类不同的外部端口,匹配到内部同一台服务器的不同服务之上,这便是多对一映射,比如说,将公网IP的80端口,对应到内网Web服务器的80端口,把公网IP的2222端口,对应至同一台内网服务器的22(SSH)端口 。
有能够达成的法子颇为简便,详细来讲,便是去界定数量繁多的、相互之间彼此独立的DNAT规则,每一条如此的规则,皆是朝着不一样的--dport(目标端口)参数予以匹配的 。下面存在两个指令,其一为,iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80,还有其一为,iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.100:22 。以下这些规则,呈现为并列的状态,iptables会依照顺序去进行匹配工作,把访问不同端口的流量,引向内部机器的对应服务 。

如何限制通过端口映射访问的来源IP
考虑到安全这一因素,我们有可能会希望,仅仅准许处于特定IP范围当中的用户,去涉足会被映射的内部服务,而这能够通过往DNAT规则里增添 -s也就是source即源地址这个匹配的条件来达成,标点符号不能于句末用所以我把句号改成了逗号,。例如,发出指令“iptables -t nat -A PREROUTING -p tcp -s 203.0.113.0/24”,其命令为发出指令“--dport 8080 -j DNAT”,此指令的目的是指向发出指令“--to-destination 192.168.1.100:80”,这样的一条规则设定了一件事,这件事是意味着只有那些源自于那个叫做203.0.113.0/24这个网段范围的用户,这些用户对外访问那个被称作8080端口的请求动作,才必然是会按照所定下的要求执行进行具有特定指向性的转发操作的句号。
如此这般的限制存在着明显的有效性,它在网络层毅然决然地直接展开过滤行为,对于不符合既定条件的请求数据包,在PREROUTING链的位置就会遭遇被丢弃的情况,根本不会进入后续的转发进程,也不会到达内部服务器。这对内部服务的压力以及暴露风险起到了极大程度的减轻作用。你可以将多个-s参数进行结合运用,或者借助ipset去管理更为复杂的IP地址集合。
如何查看和管理现有的iptables端口映射规则

首先ubuntu linux,要清晰地列出PREROUTING链里的全部规则及其通过数字形式呈现的编号,这就需要运用两个参数,一个可防止阻碍IP以及端口反查进而使列表更快且更清晰的-n参数,还有对后续用于规则删除极为关键的编号显示的--line-numbers。接着,借助 iptables -t nat -L PREROUTING -n --line-numbers 这个命令来达成上述目的。最后,要知道管理工作是离不开查看与清理的。
要是你存有去除某一条特定映射规则的想法,那么你就需运用iptables -t nat -D PREROUTING [规则编号]了,像iptables -t nat -D PREROUTING 2会将PREROUTING链中编号为2的规则去除掉,这是一种情形, 。居于首位的是,极力倡导,当在事先针对任意规则着手进行更改之际,运用iptables -save > /path/to/backup.rules这个指令对当下全然完整的规则集合实施备份,这般行为是由于要避免一旦发生误操作进而致使网络出现中断状况,进而达成便于能够迅速予以复原, 。
当你着手开展iptables端口映射配置之际,碰到的最为让人头疼到仿佛极点的问题究竟是什么呢?它是连接跟踪所引发的那种奇特超时状况,还是多网卡环境之下所产生的路由方面的困惑呢?欢迎于评论区去分享你自身的经历以及解决方案,要是觉得这篇文章对你存有帮助,同样请点赞予以支持,并且分享给更多有需求的朋友哟。
