0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Linux系统使用iptables实现外网访问内网

Linux爱好者 来源:ZONG_XP 作者:ZONG_XP 2020-10-29 11:23 次阅读

转自:ZONG_XP

0 背景

考虑一种网络拓扑应用情景,一个内部局域网中有多台服务器提供不同的服务,如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的完整结构图:

二、实现

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。

配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能

cat /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可将命令echo "1" > /proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local 或者在/etc/sysconfig/network脚本中添加 FORWARD_IPV4="YES"

但在我的系统中没有这两个文件,因此可以修改/etc/sysctl.conf文件,将net.ipv4.ip_forward=1的注释取消即可

根据拓扑图,一一实现不同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:23iptables -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:23iptables -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:80iptables -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:80iptables -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:23iptables -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:23iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80# 源IP地址SNATiptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44

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

三、测试

为了保证文中所述的正确性,本节列出操作结果,以及实验过程的信息。服务器(网关)上的路由表如下:

root@latelee:test# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface100.100.100.0 * 255.255.255.0 U 0 0 0 eth1172.18.0.0*255.255.0.0U000eth0

可以看到服务器上有2个网卡,网段都不相同。iptables的NAT表如下:

root@latelee:~# iptables -L -t natChain PREROUTING (policy ACCEPT)target prot opt source destination DNAT tcp -- anywhere 172.18.44.44 tcp dpt:2324 to23Chain 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:~# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface100.100.100.0 * 255.255.255.0 U 0 0 0 eth0172.18.0.0 * 255.255.0.0 U 0 0 0 eth1default 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 3IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21IP 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 0IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3IP 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 2IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0

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

四、其它

建议在使用iptabls指令时,使用root用户进行操作,否则容易失败

保存iptables配置方法:

iptables-save > /etc/iptables.up.rules

配置iptables开机加载

iptables-save>/etc/iptables.up.rulesecho -e '#!/bin/bash /sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptableschmod +x /etc/network/if-pre-up.d/iptables

本地测试指令

iptables -t nat -A PREROUTING -i wlan0 -d 192.168.11.100 -p tcp --dport 8081 -j DNAT --to 192.168.10.101:80iptables -t nat -A POSTROUTING -o eth0 -d 192.168.10.101 -p tcp --dport 80 -j SNAT --to 192.168.10.52

原文标题:Linux之iptables端口转发:外网访问内网

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • 服务器
    +关注

    关注

    12

    文章

    8125

    浏览量

    82543
  • 网络
    +关注

    关注

    14

    文章

    7251

    浏览量

    87447

原文标题:Linux之iptables端口转发:外网访问内网

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    企业如何安全合规地访问外网

      国际专线、SD-WAN线路与VPN翻墙的利弊与风险 在全球化背景下,中国的外贸企业以及海外公司分支机构、科研研发机构等,都需要频繁访问外网站以开展正常业务。然而,企业访问外网
    的头像 发表于 04-16 11:58 61次阅读

    为什么自己的服务器访问不了家里电脑?

    内网机子主动连接公网IP,中间的NAT会将内网机子的内网IP转换为公网IP,从而实现内网外网
    发表于 01-06 17:54 166次阅读
    为什么自己的服务器<b class='flag-5'>访问</b>不了家里电脑?

    外网设备访问内网设备NAT如何快速配置

    访问,无法从外网访问。这样子可以有效加强网络安全,但也对数据交互造成影响。 如何企业需要通过外网设备对内网设备进行
    的头像 发表于 12-18 17:23 339次阅读
    <b class='flag-5'>外网</b>设备<b class='flag-5'>访问</b><b class='flag-5'>内网</b>设备NAT如何快速配置

    如何禁止外网访问公司内网服务器

    几乎大部分公司都有自己内部服务器,里面有一些公司保密性的内容,只供内部员工进入,禁止外部网络访问,大部分公司都会做这样的限制,我们来看下这个华为的实例。
    的头像 发表于 11-25 10:20 441次阅读
    如何禁止<b class='flag-5'>外网</b><b class='flag-5'>访问</b>公司<b class='flag-5'>内网</b>服务器

    通过OpenWrt路由转发免费实现外网访问局域网内所有设备

    枯竭,运营商在新办理的宽带几乎都不给公网IP导致无法通过公网IP访问这些内网服务,Frp端口映射又需要每一个服务生成一个地址和端口,小白用户部署起来很繁琐而且速度较慢导致用户体验很差。我这里提供一种利用OpenWrt系统几分钟就
    的头像 发表于 10-25 15:48 588次阅读
    通过OpenWrt路由转发免费<b class='flag-5'>实现</b><b class='flag-5'>外网</b><b class='flag-5'>访问</b>局域网内所有设备

    外网络布线对标室外网线的重要性

    外网络布线对标室外网线的重要性主要体现在以下几个方面: 室外网线具有防水防晒、抗拉抗压的作用,是针对室外布线的阻水网线。而普通的室内网线只有单层线皮,没有室
    的头像 发表于 10-11 10:03 377次阅读

    内网PLC通过网段隔离器实现跨网段访问

    ,局域网和公网在物理上是相互隔离的,除非开放一个数据接口或者接入一个交换价路由器商,否则在网络上做任何设置都是没用的。而内网外网交互也带来新的问题,如果出现不同的网段,这时相同IP设备便无法通讯,工业物联网数据采集网
    的头像 发表于 09-26 14:09 297次阅读
    <b class='flag-5'>内网</b>PLC通过网段隔离器<b class='flag-5'>实现</b>跨网段<b class='flag-5'>访问</b>

    Linux中使用Iptables实现简单的网站防火墙

    Linux中使用Iptables实现一个简单的网站防火墙可以帮助我们保护服务器不受到恶意请求的攻击。一个现实的场景是我们想要阻止某个IP地址访问我们的网站。
    发表于 09-22 10:11 146次阅读
    <b class='flag-5'>Linux</b>中使用<b class='flag-5'>Iptables</b><b class='flag-5'>实现</b>简单的网站防火墙

    内网线和室外网线使用上有哪些区别

    内网线和室外网线在使用上有一些区别: 场景:室内网线主要用在室内布线,而室外网线则更多应用在户外环境中。 外皮:室内网线只有一层外皮,而室
    的头像 发表于 09-08 11:24 1586次阅读

    公网,私网,内网,外网的区别

    我们知道由于国内网络实际上被限制了的,可以称之为全球最大的局域网,所以国内网络群组可以(科学)访问外网络群组,而阿里云和你自家电脑都属于C。 那么如果你的电脑在C,W对于你来说就叫
    发表于 08-24 17:32 1199次阅读
    公网,私网,<b class='flag-5'>内网</b>,<b class='flag-5'>外网</b>的区别

    Linux系统iptables和firewall防火墙的配置方法

    防火墙就是根据系统管理员设定的规则来控制数据包的进出,主要是保护内网的安全,目前 Linux 系统的防火墙类型主要有两种:分别是 [iptables
    发表于 07-17 10:34 715次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>系统</b><b class='flag-5'>iptables</b>和firewall防火墙的配置方法

    一文搞懂室内外网线不同

    网线从其应用场景来看分为室外网线和室内网线,室内外网线有什么不同呢?这是很多网友的疑问,为了帮助大家正确选择,科兰通讯小编围绕室内外网线展开介绍。 室内
    的头像 发表于 07-11 10:58 801次阅读
    一文搞懂室内<b class='flag-5'>外网</b>线不同

    如何在三层核心交换机上通过MAC地址限制终端访问外网

    需要在三层核心交换机(S5700)上通过MAC地址限制终端访问外网(刷抖音),但不影响其访问内网其它网段。
    的头像 发表于 06-26 10:43 1711次阅读
    如何在三层核心交换机上通过MAC地址限制终端<b class='flag-5'>访问</b><b class='flag-5'>外网</b>

    专网,内网外网的区别

     外网(Internet):外网是指全球范围内的互联网,是由各个组织和企业共同构成的公共网络,任何人都可以通过互联网进行通信和信息交流。外网通常需要采取各种安全措施来保护网络安全。
    发表于 05-16 16:41 1w次阅读

    HCL实验:配置VLAN+NAT模拟内外网

    本次实验需要构建模拟内外网,其中内网设置2个VLAN分别是VLAN10和VLAN20,最终连接到路由器,路由器作为内网出口连接外网,并且设计同在一个交换机下的两个VLAN以及增加一个扩
    的头像 发表于 05-05 14:23 2390次阅读
    HCL实验:配置VLAN+NAT模拟内<b class='flag-5'>外网</b>