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 虚拟机角色分配
- 网关服务器:CentOS7,双网卡配置
- 内网服务器:CentOS7,运行HTTP服务
- 外网客户端: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作为网关服务器实现网络地址转换。