iptables的SNAT与DNAT配置

实验环境:

主机:Windows 10 20H2

虚拟机:Windows XP SP3,Ubuntu 16.04

网络连接:Ubuntu采用双网卡(NAT网络+内部网络),提供服务的WinXP采用内部网络,充当外网访问的WinXP采用NAT网络。

详细过程:

建立网络实验虚拟环境

        准备一个Ubuntu虚拟机以及两个WinXP虚拟机。将Ubuntu虚拟机的网卡1设置为NAT模式,网卡2设置为内部网络模式;将WinXP虚拟机的网卡设置为内部网络模式、NAT网络模式(图1)。

图 1

        在Ubuntu虚拟机中配置内网网卡(enp0s8),设置静态IP地址为192.168.0.1。然后编辑/etc/sysctrl.conf,将net.ipv4.ip_forward=1的注释去掉。操作结果如图2。使用命令/etc/init.d/networking restart重启服务。

图 2

        由于内部网络中需要Ubuntu虚拟机为两台WinXP虚拟机分配IP,因此需要通过apt安装dnsmasq。安装完成后,运行/etc/init.d/dnsmasq停止服务,修改/etc/dsnmasq.conf如图3。(由于命令较为分散因此使用grep逐个列出)。重启Ubuntu虚拟机使所有配置生效。

图 3

        两台WinXP虚拟机与Ubuntu虚拟机所处的内部网络名称应一致(intnet)。启动WinXP虚拟机并将IP改为自动获取,使用ipconfig查看能否从Ubuntu虚拟机获取IP。查询结果如图4,证明WinXP能够从Ubuntu虚拟机获取IP地址,IP地址分别为192.168.0.121和192.168.0.135。

 

图 4

        Ubuntu虚拟机的网络属性如图5。综上所述,Ubuntu虚拟机外网IP为10.0.2.15,内网IP为192.168.0.1;WinXP虚拟机IP分别为192.168.0.121和192.168.0.135。

图 5

在两台WinXP虚拟机上开启http服务和ftp服务。在控制面板->添加或删除程序->添加/删除Windows组件中勾选IIS进行安装。安装完成后,需要配置http服务的默认网页。新建文本文件,写入简单的html代码如图6,另存为index.html,并拷贝一份至C:\Inetpub\wwwroot目录下。

图 6

        在控制面板中找到Internet信息服务,右击“默认网站”设置属性。在“网站”页面中,将端口更改为8080;在“文档”页面中,添加index,html并上移至顶部。

图 7

        在WinXP浏览器中访问http://127.0.0.1:8080,可以看到出现自己编写的页面;访问ftp://127.0.0.1 可以出现默认文件。http和ftp服务验证结果如图8。

 

图 8

SNAT应用

1. SNAT配置

        为了使两台WinXP能够通过SNAT上网,需要在Ubuntu虚拟机iptables的nat表添加SNAT转发规则。向iptables的nat表添加的规则如图9所示,在POSTROUTING链上将源地址为192.168.0.0/24网段的IP转换为Ubuntu虚拟机的外网IP(10.0.2.15)。添加规则后,通过-L参数查看rules,如图10。

图 9

图 10

        在两台WinXP虚拟机上分别使用IE浏览器打开baidu.com、在cmd中ping baidu.com,测试结果如图11。结果显示,两台WinXP均能够通过http和ICMP访问外网。

图 11

2. 协议过滤

        在配置SNAT完成的基础上,可以在filter表中的FORWARD链对协议进行过滤,从而阻止或放行指定协议的数据包。本次实验中允许ICMP数据包通过,阻止http数据包通过。为了防止访问网站时出现https协议的干扰,因此将https协议一同阻止。配置命令如图12。

图 12

        配置完成后,通过-L参数查看规则,如图13所示。由于nat表没有变化,因此此处只展示filter表的规则。图中蓝框线内为配置的规则。

图 13 

        在两台WinXP虚拟机上分别使用浏览器访问baidu.com、在cmd中ping baidu.com,测试结果如图14。结果显示,两台WinXP均能够通过ICMP访问外网,但是不能通过http访问外网。

图 14

3. IP过滤

        执行iptables -t filter -F清除filter表的规则。如果要使一台WinXP能够上网,另一台不能上网,则可以通过IP过滤实现。配置命令如图15。配置的规则为:阻止源地址为192.168.0.110~192.168.0.130的数据包的转发,允许源地址为192.168.0.131~192.168.0.150的数据包的转发。这里IP过滤的是一段范围内的IP地址,当然也可以禁止单个IP地址。

图 15

        通过-L参数查看filter表的规则,如图16所示。蓝色框线内为配置的规则。

图 16

        在两台WinXP虚拟机上分别使用浏览器访问baidu.com、在cmd中ping baidu.com,测试结果如图17。结果显示,一台WinXP不能通过http和ICMP访问外网,另一台WinXP能够通过http和ICMP访问外网。

图 17

DNAT应用

        由于在NAT/NAT网络模式下主机访问虚拟机需要进行端口转发,而ftp在被动模式下往往需要随机端口建立数据链路,因此需要在NAT网络中设置WinXP虚拟机充当外网主机。网络结构大致如下图18所示。

图 18

1. DNAT配置

        为了使外网计算机能够访问到内网计算机(服务器)提供的服务,需要使用DNAT技术对IP地址进行转换。由于内网有两台WinXP提供服务,每台WinXP提供两种服务,因此不能简单地将发往Ubuntu的IP地址转换为其中一台WinXP的地址,而需要加上端口的对应关系。在本次实验中,(IP:Port)的转换关系如下表:

DNAT转换前

DNAT转换后

10.0.2.15:121

192.168.0.121:21

10.0.2.15:221

192.168.0.135:21

10.0.2.15:180

192.168.0.121:8080

10.0.2.15:280

192.168.0.121:8080

        使用iptables实现如上规则。四条规则均通过nat表的PREROUTING链实现,需要指定转换前的端口和转换后的端口。配置命令如图19。

图 19

        如此配置完成后,发现“外网”的WinXP能够成功访问内网服务器提供的http服务,但是ftp服务无法正常访问。考虑到目前ftp推荐使用被动模式,因此需要对被动模式下的ftp进一步配置。

        经查阅资料,资料[1]提出需要使用modprobe命令加载ip_conntrack_ftp和ip_nat_ftp模块;资料[2]显示加载的模块所提供的功能是Connection Tracking,能够记录连接的状态信息,从而动态地调整过滤或转发行为;资料[3]提出当Linux内核版本为4.7及以上时需要通过配置文件或iptables -A PREROUTING -t raw -p tcp --dport xxx -j CT --helper ftp命令启用某端口的ftp服务的Connection Tracking功能。对于ftp来说,connection tracking能够将ftp在随机端口发起的数据传输连接标记为RELATED,从而允许该连接的转发。有关模块加载和激活的命令如图20。

图 20

        通过-L参数查看已配置的规则,如图21。

图 21

        在NAT网络的WinXP上使用ftp客户端FileZilla以被动模式访问内网两台WinXP的ftp服务,使用IE浏览器访问http服务。验证结果如图22,证明经过DNAT的相关配置后处于“外网”的计算机确实能够访问内网提供的ftp和http服务。

图 22

参考资料:

[1] https://blog.youkuaiyun.com/weixin_33918357/article/details/90631341

[2] https://www.rigacci.org/wiki/lib/exe/fetch.php/doc/appunti/linux/sa/iptables/conntrack.html

[3] https://wiki.archlinux.org/title/Very_Secure_FTP_Daemon

2. IP限制

如果想要使外网计算机只能访问一台WinXP的http和ftp服务,则需要对IP地址和端口进行过滤。对于DNAT的IP和端口过滤,需要知道nat表的PREROUTING和filter表的FORWARD的执行顺序。根据资料[1],nat表的PREROUTING先于filter表的FORWARD执行,因此filter表中拒绝的IP地址应为192.168.0.121(内网的一台WinXP),端口为8080和21。Iptables的filter表配置如图23。

图 23

使用-L参数查看filter表配置的规则如图24。此处虽然开启了ftp的Connection Tracking,但只需要拦截其建立控制链路的数据包使其无法建立控制连接即可。

图 24

配置完成后使用外网的WinXP访问内网两个WinXP的ftp服务和http服务,结果如图25。结果显示,经过在filter表中对IP地址和端口的过滤后,其中一台WinXP的http服务和ftp服务已经无法访问,而另一台WinXP提供的服务可正常访问。

图 25

参考资料:

[1] https://www.programmersought.com/article/91143643550/

<think>好的,我现在需要给用户介绍一下iptables中的SNATDNAT。首先,我得回忆一下自己对这两个概念的理解,确保没有混淆。SNAT是源地址转换,DNAT是目的地址转换,对吗?对的,我记得SNAT主要用于当内部网络的主机访问外部网络时,修改源IP地址,通常是用来共享一个公网IP出口。而DNAT则是当外部网络的主机访问某个公网IP的特定端口时,将其转发到内部网络的某个服务器上,比如端口映射。 接下来,我需要考虑用户可能的背景。用户可能对iptables有一定了解,但需要明确区分这两个NAT类型,或者是在配置网络时遇到了问题。需要从基本概念入手,解释两者的用途和典型应用场景,同时给出实际例子,这样用户更容易理解。 需要确认SNATDNATiptables中的具体应用链。SNAT一般用在POSTROUTING链,而DNAT用在PREROUTING链。这是因为SNAT是在路由之后修改源地址,而DNAT是在路由之前修改目标地址,确保数据包能正确路由到内部主机。 同时,应该提到MASQUERADE,这是SNAT的一种特殊形式,适用于动态IP的情况,比如拨号上网。而DNAT常用于将外部请求转发到内部的Web服务器或SSH服务器。 还要注意语法格式,比如SNAT的--to-source和DNAT的--to-destination,以及相应的端口映射示例。比如,将外部的80端口请求转发到内网服务器的8080端口。 可能会遗漏一些细节,比如conntrack模块的作用,或者需要开启IP转发功能(net.ipv4.ip_forward=1)。这些虽然不是核心概念,但对于实际配置成功很重要,应该提到。 用户可能想知道什么时候用SNAT,什么时候用DNAT,所以需要明确两者的区别:SNAT改的是发出数据包的源地址,DNAT改的是接收数据包的目标地址。典型的SNAT用例是让多个内网设备通过一个公网IP上网,而DNAT用于从外部访问内网服务。 最后,结构要清晰,分点解释,给出示例命令,并总结两者的区别和常见应用场景,这样用户能快速抓住重点。</think>**iptablesSNATDNAT详解** **1. 核心概念对比** - **SNAT(Source NAT)** - 作用:修改数据包源地址 - 典型场景:内网设备共享公网IP访问互联网 - 生效阶段:`POSTROUTING`链(路由决策之后) - 特点:需指定固定IP(如 `--to-source 202.96.128.5`) - **DNAT(Destination NAT)** - 作用:修改数据包目标地址 - 典型场景:公网访问内网服务器 - 生效阶段:`PREROUTING`链(路由决策之前) - 特点:支持端口映射(如 `--to-destination 192.168.1.10:8080`) **2. 配置示例** ```bash # SNAT示例(静态IP环境) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.96.128.5 # SNAT动态IP场景(ADSL拨号) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE # DNAT端口映射(外部80转内部8080) iptables -t nat -A PREROUTING -d 202.96.128.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080 ``` **3. 关键实现原理** - **连接跟踪机制**:依赖`conntrack`模块记录NAT前后的连接状态 - **双向地址转换**:自动处理响应数据包的逆向转换 - **路由决策时机**: - DNAT在路由前修改目标地址,影响后续路由路径 - SNAT在路由后修改源地址,保证出站路径正确 **4. 典型应用场景** - SNAT常见用途: - 企业内网共享上网 - 多服务器负载均衡出口 - 隐藏真实客户端IP - DNAT常见用途: - 家庭宽带映射游戏服务器 - 云服务器端口转发 - 反向代理后端服务 **5. 必要系统配置** ```bash # 启用IP转发(永久生效需修改/etc/sysctl.conf) echo 1 > /proc/sys/net/ipv4/ip_forward ``` **6. 流量路径示意图** ``` 外部访问DNAT流程: 互联网 → 防火墙PREROUTING(DNAT) → 路由决策 → 内网服务器 内部访问SNAT流程: 内网主机 → 路由决策 → 防火墙POSTROUTING(SNAT) → 互联网 ``` **7. 诊断命令** ```bash # 查看NAT表规则 iptables -t nat -nvL --line-numbers # 监控NAT连接状态 conntrack -E ``` **注意**:实际部署时需同步考虑安全策略,建议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值