当前位置: 首页 > news >正文

Linux网络服务(六)——iptables Forward实现内网服务暴露与访问外网

文章目录

  • 前言
  • 一、 网络架构设计
    • 1.1 虚拟机角色分配
    • 1.2 网络配置方案
  • 二、详细步骤
    • 2.1 网络环境配置
      • 2.1.1 网关服务器配置
      • 2.1.2 内网服务器配置
      • 2.1.3 外网客户端(Windows)配置
      • 2.1.4 网络环境配置总结
    • 2.2 网关服务器iptables配置
    • 2.3 测试验证
  • 三、可能遇到的问题
    • 3.1 网关设置错误
    • 3.2 网关服务器无法访问外网
  • 总结

前言

本文档将演示DNAT(将内网服务暴露到公网)和SNAT(让内网访问外网)的实现。使用三台虚拟机:两台CentOS(一台作为网关,一台作为内网服务器)和一台Windows(作为外网客户端)。


一、 网络架构设计

1.1 虚拟机角色分配

  1. 网关服务器:CentOS7,双网卡配置
  2. 内网服务器:CentOS7,运行HTTP服务
  3. 外网客户端:Windows,模拟公网用户

1.2 网络配置方案

虚拟机网卡1网卡2网络模式
网关服务器ens33: 内网(192.168.91.100/24)ens36: 外网(192.168.66.100/24)内网用仅主机,外网用桥接
内网服务器ens33: 内网(192.168.91.101/24)仅主机模式
外网客户端以太网: 外网(192.168.66.101/24)桥接模式

二、详细步骤

2.1 网络环境配置

2.1.1 网关服务器配置

1、配置内网网卡

vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.91.100"   
PREFIX="24"
GATEWAY="192.168.91.1"
DNS1="114.114.114.114"
IPV6_PRIVACY="no"

在这里插入图片描述
2、配置外网网卡

cd /etc/sysconfig/network-scripts
cp ifcfg-ens33 ifcfg-ens36
vim ifcfg-ens36

将里面的内容修改

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens36"
DEVICE="ens36"
ONBOOT="yes"
IPADDR="192.168.66.100"
PREFIX="24"
GATEWAY="192.168.66.1"
DNS1="114.114.114.114"
IPV6_PRIVACY="no"

在这里插入图片描述

3、重启网络

# 重启网络
systemctl restart network

2.1.2 内网服务器配置

1、 配置内网网卡

vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.91.101"
PREFIX="24"
GATEWAY="192.168.91.100"     # 网关注意不要配置错误
DNS1="114.114.114.114"
IPV6_PRIVACY="no"

在这里插入图片描述

2、重启网络

systemctl restart network

2.1.3 外网客户端(Windows)配置

  • 设置静态IP:192.168.66.101
  • 子网掩码:255.255.255.0
  • 默认网关:192.168.66.1
  • DNS:114.114.114.114

在这里插入图片描述
关键配置:
外网客户端默认网关是 192.168.66.1(保证正常上互联网),但需要手动添加一条静态路由:访问内网网段(192.168.91.0/24)时,数据包必须发给网关服务器的外网 IP(192.168.66.100),而不是真实网关(192.168.66.1)。

route add 192.168.91.0 mask 255.255.255.0 192.168.66.100# 持久化(可选)
route add -p 192.168.91.0 mask 255.255.255.0 192.168.66.100route print  # 查看

在这里插入图片描述

2.1.4 网络环境配置总结

注意点:外网客户端和内网服务器的网关要注意不要配置错误。

  • 对于外网客户端(windows)(IP 192.168.66.101)来说,它可以访问外网以及ping通网关服务器的外网网卡,但是它无法连接内网服务器:
    在这里插入图片描述
    在这里插入图片描述

  • 对于内网服务器(IP 192.168.91.101),它可以访问网关服务器的内网网卡,但是无法访问外网
    在这里插入图片描述

2.2 网关服务器iptables配置

  • 配置SNAT(内网访问外网)
# 1. 开启IP转发(必须)
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf  # 永久生效# 清除nat表现有规则
iptables -t nat -F
iptables -t nat -nvL

在这里插入图片描述

# 设置SNAT(让内网可以访问外网)
iptables -t nat -A POSTROUTING -s 192.168.91.0/24 -o ens36 -j SNAT --to-source 192.168.66.100# 或者使用MASQUERADE(适用于动态IP)
# iptables -t nat -A POSTROUTING -o ens36 -s 192.168.91.0/24 -j MASQUERADE

在这里插入图片描述

  • 配置DNAT(暴露内网服务到公网)
# 将公网IP的22端口转发到内网服务器的22端口
iptables -t nat -A PREROUTING -i ens36 -d 192.168.66.100 -p tcp --dport 22 -j DNAT --to 192.168.91.101# 设置FORWARD策略允许转发
iptables -F FORWARD  # 清空filter表中FORWARD链
# 内网主动发起的转发都允许
iptables -A FORWARD -i ens33 -o ens36 -s 192.168.91.101 -j ACCEPT 
# 外网只允许tcp的22端口连接
iptables -A FORWARD -i ens36 -o ens33 -p tcp --dport 22 -d 192.168.91.101 -j ACCEPT
# 允许所有与已建立连接相关的流量
iptables -I FORWARD 2 -i ens36 -o ens33 -d 192.168.91.101 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 默认拒绝所有转发
iptables -P FORWARD DROP

在这里插入图片描述

在这里插入图片描述

2.3 测试验证

测试SNAT(内网访问外网)
在内网服务器上执行:

# 测试访问外网客户端
ping 192.168.66.101

在这里插入图片描述

测试DNAT(从外网访问内网服务)

ssh root@192.168.91.101

在这里插入图片描述

三、可能遇到的问题

3.1 网关设置错误

内网服务器和外网客户端的网关不能设置成我们熟悉的192.168.91.1和192.168.66.1。而是要设置成网关服务器的IP。

外网客户端默认网关是 192.168.66.1(保证正常上互联网),但需要手动添加一条静态路由:访问内网网段(192.168.91.0/24)时,数据包必须发给网关服务器的外网 IP(192.168.66.100),而不是真实网关(192.168.66.1)。

route add 192.168.91.0 mask 255.255.255.0 192.168.66.100

3.2 网关服务器无法访问外网

有可能是网关服务器双网卡导致的路由问题,检查网关服务器路由表。

ip routedefault via 192.168.91.1 dev ens33 proto static metric 100 
default via 192.168.66.1 dev ens36 proto static metric 101 
192.168.66.0/24 dev ens36 proto kernel scope link src 192.168.66.100 metric 101 
192.168.91.0/24 dev ens33 proto kernel scope link src 192.168.91.100 metric 100

Linux 会优先使用metric 值小的路由(100 <101),所以所有对外访问请求会被发送到内网网关(192.168.91.1),内网是 “仅主机” 模式,无法连接互联网,导致访问失败。

解决方案:

# 删除现有默认路由
ip route del default via 192.168.91.1 dev ens33
ip route del default via 192.168.66.1 dev ens36# 重新添加路由,交换metric值(根据需要调整)
ip route add default via 192.168.91.1 dev ens33 metric 101
ip route add default via 192.168.66.1 dev ens36 metric 100

在这里插入图片描述


总结

本文档将帮助您理解iptables的DNAT和SNAT工作原理,以及如何配置Linux作为网关服务器实现网络地址转换。

http://www.dtcms.com/a/350897.html

相关文章:

  • 直播美颜SDK技术解析:人脸美型功能的算法原理与实现方案
  • linux环境下 - 如何干净地卸载掉nvidia驱动
  • 工业通信协议综合调研报告
  • 深入浅出 ArrayList:从基础用法到底层原理的全面解析(上)
  • vue-Router中通过路由地址path中的数据转换为props传参,不建议添加多个可选参数
  • More Effective C++ 条款07:不要重载、和,操作符
  • linux的conda配置与应用阶段的简单指令备注
  • Typora + PicList + Gitee 图床完整配置教程
  • 《P1656 炸铁路》
  • C++ 编译链接杂谈——前向声明
  • JavaScript 类中静态变量与私有变量的区别及用法
  • eniac:世界上第一台通用电子计算机的传奇
  • 开发避坑指南(36):Java字符串Base64编码实战指南
  • 深度学习-----《PyTorch深度学习核心应用解析:从环境搭建到模型优化的完整实践指南》
  • 初步了解多线程
  • 交换机是如何同时完成帧统计与 BER/FEC 分析的
  • 【应急响应工具教程】SPECTR3:通过便携式 iSCSI 实现远程证据的只读获取与分析
  • [pilot智驾系统] 模型守护进程(modeld)
  • rbio1:以生物学世界模型为软验证器训练科学推理大语言模型
  • 面试八股文之——JAVA基础
  • 深度学习梯度下降与交叉熵损失
  • 重塑企业沟通与增长:云蝠智能大模型如何成为您的智能语音中枢
  • 大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?
  • SQL查询-设置局部变量(PostgreSQL、MySQL)
  • 嵌入式学习 day58 驱动字符设备驱动
  • 玳瑁的嵌入式日记D25-0825(进程)
  • Java全栈开发实战:从Spring Boot到Vue3的项目实践
  • Android Glide 缓存机制深度解析与优化:从原理到极致实践
  • 集成电路学习:什么是ONNX开放神经网络交换
  • 深度学习③【卷积神经网络(CNN)详解:从卷积核到特征提取的视觉革命(概念篇)】