考虑一种网络拓扑应用情景,一个内部局域网中有多台服务器提供不同的服务,如web服务、FTP服务、ssh、telnet等,通过服务器(或网关、防火墙)连接外部网络,如果外部网络上的主机需要访问这些服务器,则需要在网关上实现转发。

再转述成另一种应用场合,多台设备连接到一台服务器,服务器有2个网卡,分别连接内外网。外网无法直接访问设备上的数据、服务。在服务器上实现转发后,则可达到目的。

网络拓扑如下:

比如,可以通过服务器的8081端口访问1号设备的web服务,8082端口访问2号设备web,这样可以在外部网络对内网设备进行参数配置、调整。类似地,通过2321访问1号设备的telnet服务,2322访问2号设备telnet,以方便登陆设备系统,进行设备状态监控,日志处理,等等。

本文将直接引用此网络拓扑图中的名称及IP地址。实际使用配置根据实际情况修改。另外说明一下,不必拘泥于本文给出的名称。像拓扑图中的“设备”,可以使用一台安装linux的服务器替换。其它的类似。

一、原理

在Linux系统使用iptables实现防火墙、数据转发等功能。iptables有不同的表(tables),每个tables有不同的链(chain),每条chain有一个或多个规则(rule)。本文利用NAT(network address translation,网络地址转换)表来实现数据包的转发。iptables命令要用-t来指定表,如果没有指明,则使用系统缺省的表“filter”。所以使用NAT的时候,就要用“-t nat”选项了。
NAT表有三条缺省的链,它们分别是PREROUTING、POSTROUTING和OUTPUT。

先给出NAT结构,如下图:

PREROUTING:在数据包传入时,就进到PREROUTIING链。该链执行的是修改数据包内的目的IP地址,即DNAT(变更目的IP地址)。PREROUTING只能进行DNAT。因为进行了DNAT,才能在路由表中做判断,决定送到本地或其它网口。

POSTROUTING:相对的,在POSTROUTING链后,就传出数据包,该链是整个NAT结构的最末端。执行的是修改数据包的源IP地址,即SNAT。POSTROUTING只能进行SNAT。
OUTPUT:定义对本地产生的数据包的目的NAT规则。

每个数据包都会依次经过三个不同的机制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT)。下面给出数据包流方向:

文中的网络拓扑图所示的数据包,是从eth0入,eth1出。但是,无论从eth0到eth1,还是从eth1到eth0,均遵守上述的原理。就是说,SNAT和DNAT并没有规定只能在某一个网口(某一侧)。

顺便给出netfilter的完整结构图:

二、实现

首先要在服务器上使能转发,命令如下:

echo "1" > /proc/sys/net/ipv4/ip_forward

根据拓扑图,一一实现不同IP、不同端口的映射,如下命令为一种示例形式:

# 第一台设备的telnet服务
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 23 -j SNAT --to 100.100.100.44
# 第二台设备的telnet服务
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 23 -j SNAT --to 100.100.100.44# 第一台设备的web服务
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 100.100.100.44
# 第二台设备的web服务
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 80 -j SNAT --to 100.100.100.44

以第一台设备转发命令为例,用白话解释一下。

第一条是PREROUTING链,只能进行DNAT,该命令对从eth0进入且目的IP为172.18.44.44(注:可以用-s指明数据包来源地址,但这时无法知道来源IP是多少,虽然可以用网段的做法,但用-d则指定必须一定唯一的是本机的eth0地址,相对好一点),端口号为2321的数据包进行目的地址更改,更改为100.100.100.101,端口为23,亦即此包的目的地为第一台设备的telnet服务。

第二条是POSTROUTING链,只能进行SNAT,即对先前已经DNAT过的数据包修改源IP地址。

这样,这个数据包达到第一台设备时,源IP地址、目的IP地址,均为100.100.100.0/24网段了。

上述命令的SNAT有些冗余,可以做简化,命令如下:

# 第一台设备的telnet、web服务
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80
# 第二台设备的telnet、web服务
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80
# 源IP地址SNAT
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44

实际中使用的命令可能还有变化(简化),本文不再展示。

三、测试

为了保证文中所述的正确性,本节列出操作结果,以及实验过程的信息。

服务器(网关)上的路由表如下:

root@latelee:test# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
100.100.100.0   *               255.255.255.0   U     0      0        0 eth1
172.18.0.0      *               255.255.0.0     U     0      0        0 eth0

可以看到服务器上有2个网卡,网段都不相同。(注:此处没有设置默认网关,下一篇文章将需默认网关)

iptables的NAT表如下:

root@latelee:~# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             172.18.44.44         tcp dpt:2324 to:100.100.100.101:23Chain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  anywhere             100.100.100.0/24     to:100.100.100.44

可以看到,PREROUTING和POSTROUTING各有一条规则,这些规则由上文命令所产生。

对应的,在第一号设备上查看路由信息,如下:

root@latelee:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
100.100.100.0   *               255.255.255.0   U     0      0        0 eth0
172.18.0.0      *               255.255.0.0     U     0      0        0 eth1
default         100.100.100.44 0.0.0.0         UG    0      0        0 eth0

可以看到这台设备有2个网卡,默认网关为服务器的IP地址。但是,其中一个网卡eth1竟然和PC所在网段相同!如果没有进行源IP地址修改(伪装),会匹配到eth1这个网口,无法匹配eth0。

在外网的PC上对设备进行telnet,设备抓包信息如下:

IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 1:4, ack 16, win 256, length 3
IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3
IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21
IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 19:34, ack 25, win 2190, length 15

可见,所有包的IP段都相同。
在服务器上对内网eth1进行抓包,由于进行了DNAT和SNAT,此网卡数据包IP地址还是100.100.100.0/24网段,如下:

IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [.], ack 1, win 256, length 0
IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15
IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3
IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3

但是,在服务器eth0抓包,将会是172.18.0.0/16的网段数据包:

IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [P.], seq 18:20, ack 154, win 255, length 2
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0

从抓包分析,本文所用命令已经能正确进行DNAT和SNAT了。

四、其它

本文使用的网络拓扑图中有多台设备,故只有使用特定端口转发,但如果转发的只有一台设备的话,在iptables命令中就无须指定端口,从而简化命令。
参考资料:
《Linux网络安全技术与实现》

李迟 2016.9.25 周日

iptables学习笔记:端口转发之“外网访问内网”相关推荐

  1. 将oracle端口1521共享_oracle端口1521映射 怎么使用全端口映射实现外网访问内网oracle数据库 - Oracle - 服务器之家...

    oracle端口1521映射 怎么使用全端口映射实现外网访问内网oracle数据库 发布时间:2017-03-21 来源:服务器之家 内网使用nat123端口映射之全端口映射可以将内网oracle数据 ...

  2. 如何实现外网访问内网ip?公网端口映射或内网映射来解决

    本地搭建服务器应用,在局域网内可以访问,但在外网不能访问.如何实现外网访问内网ip?主要有两种方案:路由器端口映射和快解析内网映射.根据自己本地网络环境,结合是否有公网IP,是否有路由权限,设置让外网 ...

  3. 外网访问内网80端口【内网穿透】

    微信公众号开发.本地搭建web服务器,或者在本地服务器搭建了IIS或apache等web网站时,需要解决80端口映射的问题. 但很多人在路由器映射80端口的时候,会出现映射失败的情况.造成这种情况的原 ...

  4. 【内网穿透服务器】使用Frp外网访问内网FTP服务器(以访问内网samba服务为例)

    使用Frp外网访问内网FTP服务器(以访问内网samba服务为例) FTP是基于TCP的服务,使用两个端口,命令端口和数据端口,命令端口是21,数据端口在主动模式下为20,在被动模式随机分配. FTP ...

  5. 无公网IP,VB应用从外网访问内网服务器

    应用需求 之前做的板子加密工具,需要客户在工厂将所有板子先扫描一遍,然后将扫描得到的结果文件通过邮件发送给开发人员.开发人员根据收到的数据文件,生成一个加密文件,并发回给工厂.工厂收到加密数据后,需要 ...

  6. 如何实现外网访问内网mysql数据库

    今天跟大家分享一下两种特定网络环境下,如何实现外网访问内网mysql数据库. 第一种网络环境:路由器分配的是动态公网IP,且有路由器登录管理权限.如何实现外网访问内网mysql数据库? 针对这种网络环 ...

  7. 外网访问内网ERP【内网穿透】

    一般公司购买的ERP管理软件,都会安装在公司内网的主机上,公司员工只能在公司内网环境下访问进入. 但对于出差或者疫情在家办公的情况下,想要远程查看公司内网办公系统的一些资料文件,又该如何实现呢? 在大 ...

  8. 通过外网访问内网服务器

    通过外网访问内网服务器 ---------------- 版权声明:本文为CSDN博主「Chao's Code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文 ...

  9. 外网访问内网服务器配置方法

    前提需要有固定IP 路由器必须得是通过固定IP上网,才能通过外网访问内网服务器 登录路由器 在地址栏输入192.168.1.1或192.168.0.1.初始密码为admin,若忘记密码请重置路由器.这 ...

  10. NAT反向代理技术的实现(外网访问内网)

    NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一.当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现.如:单位建 ...

最新文章

  1. 模板 - 二分图(包含全套常用定理性质)
  2. samba mv命令出错
  3. Python也有做大型游戏的潜力?原来我们小看了Python,无所不能!!
  4. 使用Boost.Compute的STL 在GPU上添加两个向量的实现
  5. 魅族 虚拟位置服务状态:未运行_魅族17评测:「重量平衡设计」 手感出色 魅友们的5G梦想旗舰...
  6. php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?
  7. django启动时同时使用Schedule启动其他程序
  8. java2实用教程第四版实验指导_Java2实用教程(第4版)实验指导与习题解答_IT168文库(精)...
  9. javascript编程知识点
  10. mysql打开网络访问权限_四种方法打开MySQL数据库远程访问权限
  11. 《东周列国志》第十八回 曹沫手剑劫齐侯 桓公举火爵宁戚
  12. 基于线性回归的员工离职率预测
  13. 第十三届蓝桥杯C++B组国赛D题——最大数字(AC)
  14. 粒子群优化能做相机标定吗
  15. Linux内核中的IPSEC实现(1)
  16. mx250是什么_分析mx250显卡什么级别
  17. uA741运算放大器电路基本原理
  18. docker修改服务器参数怎么办,Docker(32)- 如何修改 docker 容器的启动参数
  19. Cisco anyconnect 连接成功浏览器无法访问任何网页
  20. java 文件路径怎么写_java本地文件路径怎么写

热门文章

  1. Mate 50系列首发?曝鸿蒙3.0用户版5月内测
  2. 妇女节放假送礼物 乐视:提倡工作的同时要兼顾家庭生活
  3. 陈睿:B站是中国最适合实现元宇宙概念的公司之一
  4. 买断变订阅!苹果第一付费软件被骂上热搜 官方回应
  5. 格力电器成为银隆新能源股东 持股30.47%
  6. 2020年特斯拉是在中国获得补贴最多的电动汽车制造商
  7. 万物新生招股书:每股发行价格区间为13-15美元
  8. 四部门联合约谈马云等蚂蚁集团有关人员,蚂蚁集团回应...
  9. 瑞典禁止在5G网络中用华为和中兴设备 同时也将移除老设备
  10. 罗永浩直播带货二手iPhone 11:1700台秒售光!