Linux 利用 IP转发使内网连接到公网

本文介绍如何利用Linux的IP转发功能,通过DMZ主机实现内网机器访问公网。步骤包括启用IPv4转发,配置内网主机静态路由,设置iptables规则,并通过带外主机SSH访问内网主机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目背景描述

在这里插入图片描述

  实际运维工作中,很多机器是不带公网的,一般一个集群或一个平台只有前端能访问互联网,划属于DMZ区域,而内网机器一些因安全所进行的升级,如果采用手动离线升级的话,效率低,而且比如内核升级的话,因个人能力或系统未知原因,还会出现意外的问题。那我们如何借助于DMZ去的linux主机,让其具备路由转发功能(路由),从而实现内网机器外访互联网呢?

在这里插入图片描述

二、实现方法

  我们知道,Linux本身自带iptables包过滤,但是其还有一重要功能,即实现数据的转发,本文就利用Linux 自带 iptables 实现从一个网络接口到另一个接口的IP转发(数据包转发)。IP转发的概念是,使 Linux 机器像路由器一样将数据从一个网络发送到另一个网络。所以,它能作为一个路由器或者代理服务器,实现将一个连接的互联网或者网络连接共享给多个客户端机器。
在这里插入图片描述

● 示例及原理解释(来源网络):

源IP 源端口 NAT 网关机器IP NAT 网关 机器端口 目标IP 目标端口
192.168.10.14 8080 192.168.10.15 18080 106.11.45.35 80

转发过程如下:

  1. 192.168.10.14:8080 [request dysmsapi.aliyuncs.com] --> 192.168.10.15:18080
  2. 192.168.128.145:18080 [request dysmsapi.aliyuncs.com] --> dysmsapi.aliyuncs.com (106.11.211.236:80)
  3. dysmsapi.aliyuncs.com [response] --> 192.168.10.14:18080
  4. 查找映射表得知,18080获得的数据返还给 192.168.10.14:8080
  5. dysmsapi.aliyuncs.com [response] --> 192.168.10.14:8080

在这里插入图片描述

2.1、启用 IPv4 转发

带外主机上配置,使用root或sudo执行:

cat /proc/sys/net/ipv4/ip_forward
sysctl -a |grep 'net.ipv4.ip_forward'  //查看是否已经打开,如值为1,则已经打开
echo 1 > /proc/sys/net/ipv4/ip_forward   //开启ipv4转发,或修改配置文件/etc/sysctl.conf
vim /etc/sysctl.conf  //修改参数为1
net.ipv4.ip_forward = 1

#立即生效
sysctl -p

注:执行命令后可马上启用ip转发,但仅对本次登录有效;要想永久生效需要修改配置文件/etc/sysctl.conf ,增加/修改 net.ipv4.ip_forward = 1。

在这里插入图片描述
修改后执行:# sysctl -p /etc/sysctl.conf ##启用更改,使其立即生效。

在这里插入图片描述

2.2、内网主机配置静态路由转发到公网

本次项目中使用eth0网口的网关配置静态路由转发到公网,来实现连接外网,编辑配置文件:

vi /etc/sysconfig/static-routes

格式如下:any net 172.16.152.0/24 gw 10.102.3.254 ;其中:

net 172.16.152.0/24 ----->目标网段,即你需要访问的公网网段
gw 10.102.3.254 -------->本地nat代理的网关(前提是开启了本地ipv4转发)

修改配置后需要重启网卡或主机,才能生效;

2.3、带外主机配置,如你本地有1块上网的网卡:

  配置iptables,且由于netfilter/iptables是一个无状态的防火墙,我们需要让 iptables 允许已建立的连接通过。

在这里插入图片描述

iptables -A FORWARD -i 内网口 -o 外网口 -j ACCEPT
iptables -A FORWARD -i 外网口 -o 内网口 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.10.14 -j SNAT --to 192.168.10.15  #或直接如下配置
iptables -t nat -A POSTROUTING -o 外网口 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save  /etc/iptables.up.rules

另外,如果是云主机的需要关闭如下功能:

在这里插入图片描述

2.4、其他

iptables -t nat -nL
iptables -nL --line-numbers -t nat
iptables -t nat -D POSTROUTING  1
iptables -P INPUT ACCEPT
iptables -I FORWARD -s 172.16.18.0/24 -j ACCEPT
tcpdump -i eth0 |grep "106.11.211.236"
#示例1:A → B → 公网服务器	A发起SYN(Flags [S]),经B转发;2)公网服务器 → B	服务器返回SYN-ACK(Flags [S.])到B;3)公网服务器 → A 
#问题点:服务器尝试直接回复SYN-ACK到A(未通过B中转)---网卡未关闭源检查;默认网卡思华开启虚拟网卡的源目的地址检查的,系统会检查服务器发送的报文中源IP地址是否正确。源地址不正确或者属于不信任的地址范围,该数据包会被阻止。当服务器作网关、转发功能的时候,需要关闭源目的地址检查。
IP A.60761 > 183.204.68.114.http: Flags [S], seq 2684448681, win 5840, options [mss 1460,sackOK,TS val 2517892865 ecr 0,nop,wscale 2], length 0
21:13:24.558737 IP B.60761 > 183.204.68.114.http: Flags [S], seq 2684448681, win 5840, options 
03-08
### NAT 网络地址转换的工作原理 NAT(Network Address Translation),即网络地址转换,是一种用于修改网络数据包头中源地址或目的地址的技术[^1]。通过这种方式,NAT使得位于不同网络环境下的设备能够相互通信。 对于内部网络中的私有IP地址而言,在这些设备尝试连接至互联网或其他公共网络时,其原始的私有IP会被替换为合法的公网IP;反之亦然——来自部的数据包到达边界路由器后,目标地址由公网IP变更为对应的内网私有IP。此过程不仅限于IPv4环境中,在某些情况下也适用于IPv6场景下实现跨版本互访的需求。 #### 动态NAT特性说明 动态NAT允许内部网络内的多个节点共享有限数量的真实全球唯一可路由的IP资源来访界服务。具体来说: - **多对一或多对多映射**:不同于静态一对一的形式,这里可以是一组内部地址对应单个或几个部出口地址; - **按需分配原则**:每当一台机器发起对请求时才临时获取一个可用的公有IP作为代理身份参与通信活动,结束后立即释放以便其他成员继续借用; - **受限于地址池大小**:如果当前在线并发量超过了预设好的可供变换使用的公网号段总数,则超出部分可能无法正常上网[^3]。 ### 配置方法实例展示 以下是基于华为系列路由器平台的一个简单配置案例,旨在演示如何设置基本形式的静态与动态两种模式下的NAT功能。 #### 静态NAT配置命令序列 ```shell [R1]interface GigabitEthernet0/0/1 //进入网接口视图 [R1-GigabitEthernet0/0/1]nat static global 8.8.8.8 inside 192.168.10.10 //定义一条固定的内部地址映射关系 [R1]display nat static //查看已生效的所有静态条目详情 ``` 这段脚本实现了将特定的一台内部服务器(拥有固定不变的LAN侧标识`192.168.10.10`)暴露给广域网上指定位置(`8.8.8.8`)的功能,从而让远端客户可以直接通过后者寻址并建立TCP/IP会话链接[^4]。 #### 动态NAT配置概览 为了使更多不确定数量确切ID的企业终端都能顺利触达因特网空间而不必各自申请独立的身份标签,管理员可以选择开启动态机制: ```shell //假设已经预先规划好了一个范围足够覆盖所有潜在需求者的弹性IP集合,并命名为pool_1 ip nat pool pool_1 start-ip end-ip netmask subnet-mask access-list acl_id permit ip any host internal_network_segment ip nat inside source list acl_id pool pool_1 overload ``` 上述指令集创建了一套灵活应对大规模局域网接入情况的基础框架,其中涉及到了地址池(pool)以及访问控制列表(acl)两个核心组件的设计思路。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羌俊恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值