Chinaunix首页 | 论坛 | 博客
  • 博客访问: 745910
  • 博文数量: 141
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,既当司令也当兵!

文章分类

全部博文(141)

分类: LINUX

2020-07-13 17:28:53

问题描述


在一些内网部署服务的场景中,比如家庭NASS,希望通过外部对内部服务进行访问。由于NAT的隔离,则需要在网关防火墙上做端口转发(关于端口转发的原理,本文不表,默认读者是知道的)。经典拓扑如下:


如上图,网关设备外网IP 为12.x.x.178,内部网段外192.168.1.1。其中服务部署在内部主机 192.168.1.100上。为了让外部主机(PC1)能够通过网关设备的公网地址,访问到服务,在网关防火墙上,配置如下规则(核心规则):

点击(此处)折叠或打开

  1. iptables -t nat -I PREROUTING -d 12.x.x.178 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.100

  2. iptables -I FOREARD -d 192.168.1.100 -j ACCEPT
经过上面配置后,PC1 可以通过12.x.x.178:8080 访问到内部服务!

但是,内网PC2,试图通过12.x.x.178:8080 访问内部服务时,却无法访问!过程如下:


PC2在请求服务过程中,由于发送的目标地址和接收数据的源地址不匹配,所以PC2会丢弃相关数据包,而导致服务无法访问!通过tcpdump/wireshark抓包,也证实这一点。

解决方案

经过上面的分析,我们已经很清楚问题的原因了:内部地址通过端口映射访问内部服务,在DNAT后,源地址没有正确映射,导致出现发送接收不同源的问题。做如下调整即可:



总结
只要在外部映射的基础上,加两条内部DNAT & SNAT映射规则,既可以处理:内部主机通过映射后的外部IP访问内部服务,造成的端口转发中的回流问题。新增配置如下()

点击(此处)折叠或打开

  1. iptables -t mangle -I PREROUTING -i br-lan -d 112.x.x.178 -j CONNMARK --set-xmark 0x100000/0xf00000

  2. iptables -t nat -I PREROUTING -i br-lan -m connmark --mark 0x100000/0xf00000 -j DNAT --to-destination 192.168.1.100

  3. iptables -t nat -I POSTROUTING -o br-lan -m connmark --mark 0x100000/0xf00000 -j SNAT --to-source 12.x.x.178



阅读(7579) | 评论(0) | 转发(0) |
0

上一篇:LUA split

下一篇:开篇

给主人留下些什么吧!~~