Linux iptables IP映射 跨网段访问

本文详细介绍了如何使用Linux的iptables和netfilter机制实现跨网段访问,通过IP映射解决不同网段间设备通信问题。文章涵盖了iptables的配置、表与链的概念,以及具体的脚本实现。

                        Linux iptables IP映射 跨网段访问 

19.1 前言

开发中,遇到一个跨多个网段访问设备内部局域网的问题。刚开始对这个跨网段的问题无从下手,但后面想了又想,难道不能让一个网口直接桥接到另外一个网口吗?顺着这个想法,于是就想到了IP映射,后面又深入到Linux中的netfilter机制。我们可以使用Linux中netfilter的机制将数据包源地址、目标地址进行“如假包换”,改变数据包的流向,从而实现跨网段的访问。该机制其实就是将Linux当做防火墙,局域网内部的IP为服务器IP,外网通过访问Linux,Linux作为中间组件再访问内部服务器,再将服务器的数据给到外网的客户端,从而避免服务器直接与外网相连带来的安全隐患。

如上图示,Linux Device跟PC机是在同一网段,我们要PC机直接访问server,但是server和PC机是在不同网段的,因此不能直接访问。解决这种访问的方法有两个:

第一:将PC的网关配成设备的IP=192.168.36.28,然后开启Linux Device的网络转发功能:(echo 1 > /proc/sys/net/ipv4/ip_forward),让Linux Device作为PC与server之间的网关,这样便PC就可以直接访问server了。(注:此方式只支持一个两个网段不同设备之间的访问,如果中间经过了很多路由,此方法失效。另外此方法需要更改PC的IP比较麻烦)。

第二:使用Linux的netfilter机制,利用Linux进行IP映射。(该方式克服了跨越多网段访问的问题,另外无需更改PC端的IP网关也能实现跨网段访问)。

 

19.2 IP映射过程简介

如果开启了IP映射功能,那么其数据的转发流程将如下示:

第一:当PC发起到服务器的连接请求时,数据包从192.168.36.59发出,到达linux主机192.168.36.28,经过Linux防火墙时将数据包重新构造,把数据包的目的地址由192.168.36.28改为192.168.168.168。

第二:经过第一步处理的数据包进入192.168.168.100,数据包从192.168.168.100发向192.168.168.168时,将数据包的源地址192.168.36.59改为192.168.168.100。

第三:server接收到请求数据包之后响应,响应数据包从192.168.168.168发送到192.168.168.100,在接收到src为192.168.168.168的数据包时,将其目的地址192.168.168.100改为192.168.36.59.

第四:数据包第三步处理后流向192.168.36.28,当数据包流出192.168.36.28时,将其源地址192.168.168.168改为192.168.36.28。

经过上述四个步骤,Linux Device相当于一个透明设备,只是作为中间桥梁。

 

19.3 Iptables移植

第一步:从网上下载iptables源码、Linux2.6以上Linux3.1以下 kernel源码。

第二步:配置内核支持netfilter,相关自行网上查阅。

第三步:编译iptables,编译时一定要加上--enable-static --disable-shared否则运行命令时会出现一些问题。

./configure --host=arm-linux --prefix=/home/veryarm/iptables/install --enable-static --disable-shared --with-ksource=/home/veryarm/board/kernel

备注:Linux内核3.10版本以上源码存在头文件包含问题,因此我选择了Linux内核3.0版本跟iptables一起编译。

附:编译参考博客:https://blog.youkuaiyun.com/zhang_danf/article/details/50461350

 

19.4 Linux netfilter简介

对于网络数据包转发,IP映射其涉及的是计算机网络知识。Linux内核包含几个模块,其中一大模块就是网络相关部分,里面涉及很多的网络协议栈,其中包含现在要讲述的Linux 防火墙。

当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。而iptables实现防火墙功能的原理是:在数据包经过Linux内核的过程中有五处关键地方(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING)时,数据包会经过由iptables在用户空间在这5处设置规则关卡,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。

由图可知,当一个数据包进入计算机时,首先进入POSTROUTING链,然后内核根据路由表决定数据包的方向。若数据包的目的地址是本机,则将数据包送往INPUT链进行规则检查,当数据包进入INPUT链后,系统的任何进程都会收到它,本机上运行的程序可以发送该数据包,这些数据包会经过OUTPUT链,再POSTROUTING链发出;若数据包的目的地址不是本机,则检查内核是否允许转发,若允许,则将数据包送FORWARD链进行规则检查,若不允许,则丢弃该数据包。若是防火墙主机本地进程产生并准备发出的包,则数据包被送往OUTPUT链进行规则检查。

 

附:具体学习iptables相关网站链接:http://www.zsythink.net/archives/1199

 

19.5 iptables介绍

首先,iptables是用户层可直接修改内核网络协议栈配置的命令。iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw-->mangle-->nat-->filter。还定义了链,5个链(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING)其实就是每个链都会有自己的规则,那把这些规则挂起来的变成一条规则链,这就是链的由来。

 

Iptables四个表:

filter表:  负责过滤功能,防火墙;内核模块:iptables_filter

nat表:     network address translation,网络地址转换功能;内核模块:iptable_nat

mangle表:  拆解报文,做出修改,并重新封装 的功能;iptable_mangle

raw表:     关闭nat表上启用的连接追踪机制;iptable_raw

Iptables链概念:

PREROUTING      的规则可以存在于:raw表,mangle表,nat表。
INPUT          的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD         的规则可以存在于:mangle表,filter表。
OUTPUT         的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING      的规则可以存在于:mangle表,nat表。

Iptables中链与表的关系:

 

Iptables匹配规则之后的动作参数。

DNAT:      目标地址转换
ACCEPT:    允许数据包通过
DROP:      丢弃数据包,不做任何回复
EWJECT:    拒绝数据包通过
SNAT:      源地址转换、解决内网用户同一个公网地址上网问题。
MASQUERADE: 是SNAT特殊模式,用于动态的、临时的ip上

iptables -t filter -A INPUT -s 192.168.36.28 -j DROP

-t 指定要操作的表,后接表名

-A 后面添加规则到哪个链,后接chains

-s 指明匹配条件的“源地址”,后接IP地址

-j 表示条件满足时所对应的动作,后接上述动作

-L 表示list

 

以下是配置Linux设备IP映射的脚本。

#!/bin/sh  

SOURCE_CLIENT_IP_ADDR="192.168.36.59"  
ETH_OUTER_IP_ADDR="192.168.12.60"  

TARGET_SERVER_IP_ADDR="192.168.168.168"  
ETH_INTER_IP_ADDR="192.168.168.100"  

help()  
{  

    echo "[inform] visit through multi-networks script";  
    echo "1:your system must support netfilter";  
    echo "2:your system have two ethx at least";  
    echo "3:you must have ipptables tools";  
    echo "4:ifconfig eth0:1 xxx for telnet";  
    echo ">>after you finish operation please shutdown eth:1<<";  
}  

# message  
help;  

echo ">>>> config start!";  
# clear nat tables first(it's selectable)  
iptables -t nat -F;  

# Start Network Forwarding  
echo 1 > /proc/sys/net/ipv4/ip_forward  
sleep 2;  

iptables -t nat -I PREROUTING -d $ETH_OUTER_IP_ADDR -i eth0 -j DNAT --to-destination $TARGET_SERVER_IP_ADDR  

iptables -t nat -I POSTROUTING -d $TARGET_SERVER_IP_ADDR -o eth1 -j SNAT --to-source $ETH_INTER_IP_ADDR  

iptables -t nat -I PREROUTING -d $ETH_INTER_IP_ADDR -i eth1 -j DNAT --to-destination $SOURCE_CLIENT_IP_ADDR  

iptables -t nat -I POSTROUTING -s $TARGET_SERVER_IP_ADDR -o eth0 -j SNAT --to-source $ETH_OUTER_IP_ADDR  

echo ">>>> config finished!";  

 

 

<think> 嗯,用户之前问过网关地址设置的作用和影响,现在又提出了设备跨网段访问的具体使用方法。用户可能是网络管理员或工程师,正在实际部署跨网段访问方案,需要具体操作指导。从用户引用的内容看,ta手头有跨网段网关设备和路由器,但可能对路由配置细节不太熟悉。 用户引用了三个资料:第一个是物通博联网关产品的功能说明,提到IP转换和网段统一;第二个是Keepalived部署中静态路由配置示例;第三个是Windows环境下用route命令添加静态路由的方法。这说明用户需要的是实操层面的指导,而不仅仅是理论说明。 考虑到用户之前的网关相关问题,这次回答要延续技术深度,但侧重操作步骤。需要重点解决: 1)跨网段访问的三种实现方式(网关设备、路由配置、主机配置)的适用场景差异 2)每种方式的具体配置命令和参数说明 3)排错流程(比如用户引用[3]中提到的ping不通问题) 特别要注意的是,用户引用[3]里提到的Windows网络共享设置会影响跨网段发现,这个细节容易被忽略,必须包含在排错建议里。另外工业场景中PLC/CNC设备的特殊要求(如固定UDP端口)也要强调。 用户没有说明具体设备类型(是普通电脑还是工业设备),所以回答要覆盖通用场景。但根据ta引用物通博联网关的描述,工业环境可能性较大,案例部分可以侧重PLC访问示例。 最后生成的相关问题要延续实操路线,比如网关选型、协议转换这些用户下一步可能遇到的痛点。 </think> 以下是设备跨网段访问的完整实现方法及技术要点,结合工业场景进行说明: --- ### **一、跨网段通信的核心原理** 1. **路由寻址机制** 当设备A(`192.168.1.100/24`)访问设备B(`172.16.2.50/24`)时: - 设备A检查目标IP是否在同一子网(通过子网掩码计算) - 若目标在不同子网,数据包发送至**默认网关**(如`192.168.1.1`) - 网关根据路由表进行转发(需配置静态路由或动态路由协议)[^1][^2] 2. **关键公式** 跨网段通信路径满足: $$ \text{源IP} \xrightarrow{\text{网关路由}} \text{目标IP} \quad (\text{当} \ \text{源子网} \neq \text{目标子网}) $$ --- ### **二、三种实现方式及配置步骤** #### ▶ **方式1:专用网关设备(推荐工业场景使用)** ```mermaid graph LR A[PLC 192.168.1.10/24] --> B[跨网段网关] C[MES服务器 172.16.2.20/24] --> B B --> D[统一网段通信] ``` **配置步骤**: 1. **网关部署** - 生产网侧接入:`eth0: 192.168.1.1/24` - 管理网侧接入:`eth1: 172.16.2.1/24` 2. **启用IP转换** - 将PLC的`192.168.1.10`映射为管理网段的`172.16.2.100` 3. **验证连通性** ```bash # 在MES服务器执行 ping 172.16.2.100 # 实际访问PLC ``` > *优势*:无需修改PLC/IP配置,天然隔离生产网与管理网[^1] #### ▶ **方式2:配置静态路由(需网络设备权限)** ```bash # 在生产网网关(192.168.1.1)添加路由 ip route add 172.16.2.0/24 via 172.16.2.1 # 目标网段 → 下一跳 # 在管理网网关(172.16.2.1)添加反向路由 ip route add 192.168.1.0/24 via 192.168.1.1 ``` **验证命令**: ```bash route -n # 查看路由表 traceroute 172.16.2.20 # 跟踪路径 ``` #### ▶ **方式3:主机添加路由(临时调试用)** ```powershell # Windows主机添加永久路由 route add -p 172.16.2.0 mask 255.255.255.0 192.168.1.1 # Linux主机添加路由 ip route add 172.16.2.0/24 via 192.168.1.1 ``` > *注*:需在**每一台**需跨网段访问的设备上配置[^3] --- ### **三、工业场景故障排查清单** | **现象** | **排查点** | **解决命令** | |------------------------|----------------------------|---------------------------------------------| | 单向Ping通(A→B成功,B→A失败) | 1. 目标防火墙策略<br>2. 反向路由缺失 | `netsh advfirewall show allprofile` (Win)<br>`iptables -L` (Linux) | | 完全不通 | 1. 网关配置错误<br>2. 物理链路故障 | `arp -a` 检查网关MAC<br>`tracert 目标IP` 跟踪路径 | | 时通时断 | 1. 网络环路<br>2. IP冲突 | `ping -t 目标IP` 持续测试<br>`arp-scan -l` 扫描冲突IP | **特殊问题处理**: - **网络共享发现失败**(引用[3]案例): 控制面板 → 网络和共享中心 → 启用**网络发现**和**文件共享** - **工业协议不通**: 确认网关是否支持协议穿透(如Modbus TCP端口502需开放) --- ### **四、最佳实践建议** 1. **工业网络拓扑规范** ```mermaid graph TB subgraph 生产网 PLC1[PLC] --- Switch1 HMI[HMI] --- Switch1 end subgraph 管理网 MES[MES] --- Switch2 SCADA[SCADA] --- Switch2 end Switch1 -- 跨网段网关 --- Switch2 ``` 2. **安全加固措施** - 在网关上配置ACL: ```bash # 只允许MES服务器访问PLC iptables -A FORWARD -s 172.16.2.20 -d 192.168.1.10 -j ACCEPT iptables -A FORWARD -j DROP # 默认拒绝其他流量 ``` - 关闭不必要服务:禁用SNMP、Telnet等高风险协议 > **案例**:某汽车厂通过物通博联网关实现PLC跨网段访问,将原15个不同网段设备统一映射至`10.10.1.0/24`网段,维护效率提升60%[^1] --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值