【docker】iptables实现NAT

iptables是一个Linux内核中的防火墙工具,可以被用来执行各种网络相关的任务,如过滤、NAT和端口转发等,可以监控、过滤和重定向网络流量。

iptables可以用于以下应用场景:

  1. 网络安全:iptables可以过滤网络流量,防止未经授权的访问和攻击。
  2. 网络管理:iptables可以限制网络带宽,控制网络流量,保证网络的稳定性和可靠性。
  3. 网络服务:iptables可以重定向网络流量,实现端口转发和负载均衡等功能。
  4. 网络监控:iptables可以记录网络流量,分析网络状况,提供网络性能和安全的监控和管理。

iptables实现SNAT和DNAT

主机规划:

  • host1:172.28.3.208/20
  • host2:172.28.15.169/20

原始网络模式

一开始,host1和host2都是通过网关gateway进行对外通讯。

原始网络模式如下:

在host2上可以访问百度:

$ ping www.baidu.com -c 3
PING www.wshifen.com (104.193.88.77) 56(84) bytes of data.
64 bytes from 104.193.88.77: icmp_seq=1 ttl=49 time=179 ms
64 bytes from 104.193.88.77: icmp_seq=2 ttl=49 time=173 ms
64 bytes from 104.193.88.77: icmp_seq=3 ttl=49 time=173 ms--- www.wshifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3036ms
rtt min/avg/max/mdev = 173.674/175.795/179.824/2.870 ms

SNAT

SNAT是source network address translation的缩写即源地址目标转换。

比如,多个PC机使用路由器共享上网,每个PC机都配置了内网IP。PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip。当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip。

这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了。所以叫做SNAT,基于源地址的地址转换。

现将host1作为host2的网关,在host1上进行SNAT转换,实现host2可以访问外网。

修改host2的默认网关

修改host2的默认网关为host1:

$ sudo ip route delete default
$ sudo ip route add default via 172.28.3.208 dev eth0
$ sudo ip route delete 172.28.0.1
$ sudo ip route delete 172.28.0.0/20$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.28.3.208  0.0.0.0         UG    0      0        0 eth0

此时在host2尝试访问百度,发现已经无法访问外部网络:

$ ping www.baidu.com -c 3
ping: www.baidu.com: Temporary failure in name resolution

host1开启转发能力

在host1开启转发能力,Linux的IP Forwarding功能并不是默认开启的,可以采用下面的方法开启:

// 没有持久化,临时修改
$ sudo -i# echo 1 >/proc/sys/net/ipv4/ip_forward

上面的方式只是临时开启转发能力,重启之后配置就会被重置,如果想永久修改可以在/etc/sysctl.conf下增加如下内容:

net.ipv4.ip_forward=1

然后使用sysctl -p重新加载配置文件:

$ sysctl -p /etc/sysctl.conf

host1配置SNAT规则

在host1上配置如下规则:

$ iptables -t nat -A POSTROUTING -s 172.28.15.169 -j SNAT --to-source 172.28.3.208

此时再去host2上访问百度,发现已经可以访问外部网络了:

$ ping www.baidu.com -c 3
PING www.wshifen.com (104.193.88.77) 56(84) bytes of data.
64 bytes from 104.193.88.77: icmp_seq=1 ttl=48 time=174 ms
64 bytes from 104.193.88.77: icmp_seq=2 ttl=48 time=174 ms
64 bytes from 104.193.88.77: icmp_seq=3 ttl=48 time=174 ms--- www.wshifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2583ms
rtt min/avg/max/mdev = 174.052/174.397/174.846/0.585 ms

SNAT和MASQUERADE的区别

MASQUERADE是SNAT的一个特例。

SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机。

MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。

但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT –to-source 192.168.5.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.5.3-192.168.5.5

这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip。

假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变,而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址,这个时候如果按照现在的方式来配置iptables就会出现问题了。

因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip,这样是非常不好用的。

MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。

比如下边的命令:

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

如此配置的话,不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。

注:对于MASQUERADE,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。

DNAT

假设现在host2上了运行了一个端口在8080的web服务,但是没有外网ip,无法在外部直接访问host2的web服务,但是host1上有外网ip,可以通过DNAT将访问host1的8080端口的请求转发到host2的8080端口。

在host2上运行一个web服务:

$ sudo docker run -d --rm -p 8080:80 --name web httpd
9c9a499ce0e566e1a5897d81a21d6d97d8925ef25066f901e9d41de22bd2f0c5$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>

在host1上配置DNAT:

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.28.15.169

此时再去其他机器上访问host1的8080端口,发现流量已经转发到host1的8080端口了:

$ curl 172.28.3.208:8080
<html><body><h1>It works!</h1></body></html>

SNAT和DNAT的区别

SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机。

DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。

因为,路由是按照目的地址来选择的,因此,DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的。

iptables记录网络流量

为了方便调试,我们可以在raw的PREROUTING链上增加trace规则:

sudo iptables -t raw -I PREROUTING -p tcp --dport 8080 -j TRACE
sudo iptables -t raw -I PREROUTING -p tcp --sport 8080 -j TRACE

使用dmesg命令来查看日志

// 先清空下日志
$ dmesg -C// 下面是curl 172.28.3.208:8080的部分日志
$ dmesg
[13428.991593] TRACE: raw:PREROUTING:policy:3 IN=eth0 OUT= MAC=00:15:5d:70:01:10:00:15:5d:cc:04:f5:08:00 SRC=172.28.0.1 DST=172.28.3.208 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=32326 DF PROTO=TCP SPT=63368 DPT=8080 SEQ=94812980 ACK=2940281795 WINDOW=0 RES=0x00 ACK RST URGP=0
[13428.991675] TRACE: mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=00:15:5d:70:01:10:00:15:5d:cc:04:f5:08:00 SRC=172.28.0.1 DST=172.28.3.208 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=32326 DF PROTO=TCP SPT=63368 DPT=8080 SEQ=94812980 ACK=2940281795 WINDOW=0 RES=0x00 ACK RST URGP=0
[13428.991697] TRACE: mangle:INPUT:policy:1 IN=eth0 OUT= MAC=00:15:5d:70:01:10:00:15:5d:cc:04:f5:08:00 SRC=172.28.0.1 DST=172.28.3.208 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=32326 DF PROTO=TCP SPT=63368 DPT=8080 SEQ=94812980 ACK=2940281795 WINDOW=0 RES=0x00 ACK RST URGP=0
。。。。。。

查看/var/log/messages日志

直接查看系统日志文件/var/log/messages时会提示说没有这个文件或目录。

原因是Ubuntu默认不开启系统日志,配置文件/etc/rsyslog.d/50-default.conf中系统日志那段的代码默认是被注释掉的:

#*.=info;*.=notice;*.=warn;\
#        auth,authpriv.none;\
#        cron,daemon.none;\
#        mail,news.none          -/var/log/messages

我们只要将这4行前面的注释#去除即可。

然后需要重启rsyslog服务:

$ sudo service rsyslog restart

最后就可以查看/var/log/messages文件中的日志了。

会话跟踪

疑问:当host2给host1返回时,目标ip为host1,我们也没有配置什么NAT规则,把目标ip改成客户端的ip,那么,服务器为啥不是把报文交给host1的进程处理,而是原路forward转发呢?

这个其实还是因为NAT依赖了netfilter的会话跟踪功能,简单来说,netfilter是有状态的,以tcp举例,tcp连接的建立是因为客户端ip:客户端端口和服务端ip:服务端端口,这个四元组是有来有回的,就是我给你发了消息,你也回我了,此时,netfilter就认为这是一个会话。

所以,在host2给host1返回时,host1拿着四元组去查,查到有会话,因此,就按照之前的路径原路回来。

另外,nat这个table里的链,只在检测到之前不存在会话时,才会进,后续就不会再进了;也就是只有首次报文的时候进nat的链。

像上面这个案例,只要执行如下命令,关闭会话跟踪,就执行不成功了:

sudo iptables -t raw -I PREROUTING -p tcp --dport 8080 -j NOTRACK

可以安装conntrack工具来查看会话。

sudo apt-get install conntrack

使用conntrack -L命令来查看会话

$ conntrack -L
tcp      6 431997 ESTABLISHED src=172.28.0.1 dst=172.28.3.208 sport=65499 dport=8080 src=172.28.15.169 dst=172.28.0.1 sport=8080 dport=65499 [ASSURED] mark=0 use=1
tcp      6 300 ESTABLISHED src=172.28.0.1 dst=172.28.3.208 sport=54422 dport=22 src=172.28.3.208 dst=172.28.0.1 sport=22 dport=54422 [ASSURED] mark=0 use=1
conntrack v1.4.4 (conntrack-tools): 2 flow entries have been shown.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Workplace Search 的演变:使用 Elasticsearch 搜索你的私人数据

作者&#xff1a;Dana Juratoni, Aditya Tripathi Workplace Search 功能将来将与 Elastic Search 合并。 这是你需要了解的内容。 生成式人工智能技术的最新进展为搜索带来了一系列可能性。 随着开发人员构建新的体验&#xff0c;用户正在采用新的搜索使用方式 —— 从用自然…

CSS滚动捕获 scroll-snap-align

CSS滚动捕获 scroll-snap-align 看到 align, 就条件反射想到对齐方式, 嗯猜对了. 不过要先看一下若干名词介绍 scroll-snap-align 指定了盒子的 snap position, 即盒子 snap area 和滚动容器的 snapport 的对齐方式. 这个属性是定义在滚动元素上, 而不是滚动容器上 语法 这个…

Python与ArcGIS系列(八)通过python执行地理处理工具

目录 0 简述1 脚本执行地理处理工具2 在地理处理工具间建立联系0 简述 arcgis包含数百种可以通过python脚本执行的地理处理工具,这样就通过python可以处理复杂的工作和批处理。本篇将介绍如何利用arcpy实现执行地理处理工具以及在地理处理工具间建立联系。 1 脚本执行地理处理…

《Fine-Grained Image Analysis with Deep Learning: A Survey》阅读笔记

论文标题 《Fine-Grained Image Analysis with Deep Learning: A Survey》 作者 魏秀参&#xff0c;南京理工大学 初读 摘要 与上篇综述相同&#xff1a; 细粒度图像分析&#xff08;FGIA&#xff09;的任务是分析从属类别的视觉对象。 细粒度性质引起的类间小变化和类内…

python之代理ip的配置与调试

目录 前言 一、代理IP的配置 二、代理IP的调试 2.1 使用curl命令测试代理IP 2.2 使用requests库调试代理IP 三、代理IP的获取 3.1 使用代理IP池 3.2 使用付费代理IP服务 总结 前言 代理IP是网络爬虫中常用的技术手段。通过使用代理服务器&#xff0c;可以实现对特定网…

某60区块链安全之不安全的随机数实战一

区块链安全 文章目录 区块链安全不安全的随机数实战一实验目的实验环境实验工具实验原理实验内容攻击过程分析合约源代码漏洞EXP利用 不安全的随机数实战一 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工…

【Flink】核心概念:并行度与算子链

并行度&#xff08;Parallelism&#xff09; 当要处理的数据量非常大时&#xff0c;我们可以把一个算子操作&#xff0c;“复制”多份到多个节点&#xff0c;数据来了之后就可以到其中任意一个执行。这样一来&#xff0c;一个算子任务就被拆分成了多个并行的“子任务”&#x…

爱上C语言:操作符详解(下)

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…

STM32/N32G455国民科技芯片驱动DS1302时钟---笔记

这次来分享一下DS1302时钟IC&#xff0c;之前听说过这个IC&#xff0c;但是一直没搞过&#xff0c;用了半天时间就明白了原理和驱动&#xff0c;说明还是很简单的。 注&#xff1a;首先来区分一下DS1302和RTC时钟有什么不同&#xff0c;为什么不直接用RTC呢&#xff1f; RTC不…

[Vue 代码模板] Vue3 中使用 Tailwind CSS + NutUI 实现侧边工具栏切换主题

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/vzkgy6gvcnpl3u2y 效果示例 配置 src 目录别名 https://www.yuque.com/u27599042/coding_star/ogu2bhefy1fvahfv 配置 Tailwind CSS https://www.yuque.com/u27599042/coding_star/yqzi9olphko9ity1 配置…

CAPL编程 - 事件驱动

1 事件概述 CAPL是一种面向过程、由事件驱动的类C语言。 事件驱动针对于顺序执行&#xff0c;其区别如下&#xff1a; 顺序执行&#xff1a;顺序执行流程中&#xff0c;子例程或过程函数按照代码编写顺序逐句执行。 事件驱动&#xff1a;CAPL程序由事件驱动&#xff0c;工程…

11.15 监控目录文件变化

监视对指定目录的更改&#xff0c;并将有关更改的信息打印到控制台&#xff0c;该功能的实现不仅可以在内核层&#xff0c;在应用层同样可以。程序中使用ReadDirectoryChangesW函数来监视目录中的更改&#xff0c;并使用FILE_NOTIFY_INFORMATION结构来获取有关更改的信息。 Re…

Selenium中元素定位方法详细介绍

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

JavaScript实现飞机发射子弹详解(内含源码)

JavaScript实现飞机发射子弹 前言实现过程源码展示源码讲解HTML结构CSS结构js结构 前言 文本主要讲解如何利用JavaScript实现飞机发射子弹&#xff0c;实现过程以及源码讲解。实现效果图如下&#xff1a; 实现过程 首先&#xff0c;找到飞机和子弹的UI图&#xff0c;gif图最…

【Android】使用Retrofit2发送异步网络请求的简单案例

添加网络权限到AndroidManifest.xml清单文件 为了让你的Android应用程序能够使用互联网进行通信&#xff0c;你需要在AndroidManifest.xml文件中添加网络权限声明。<uses-permission android:name"android.permission.INTERNET"/> 这个权限应该添加到 Android…

python爬虫概述及简单实践:获取豆瓣电影排行榜

目录 前言 Python爬虫概述 简单实践 - 获取豆瓣电影排行榜 1. 分析目标网页 2. 获取页面内容 3. 解析页面 4. 数据存储 5. 使用代理IP 总结 前言 Python爬虫是指通过程序自动化地对互联网上的信息进行抓取和分析的一种技术。Python作为一门易于学习且强大的编程语言&…

LabVIEW关于USRPRIO的示例代码

LabVIEW关于USRPRIO的示例代码 USRPRIO 通常以两种方式使用&#xff1a; 1 基于 FPGA 的编程 对于希望修改USRP上的底层FPGA代码以添加自定义DSP模块的应用&#xff0c;请使用USRP示例项目。它可作为构建 USRP RIO 流式处理应用程序的起点&#xff0c;可从“创建项目”对话框…

项目资讯丨轻空间中标连云港市首座“多功能声学综合馆”(EPC)

近日&#xff0c;轻空间&#xff08;江苏&#xff09;膜科技有限公司&#xff08;以下简称“轻空间”&#xff09;成功中标连云港市首座“多功能声学综合馆”项目&#xff0c;这标志着轻空间在新型气膜领域的创新突破技术&#xff0c;再次获得政府机构的高度认可&#xff0c;为…

水声功率放大器在声呐系统中的应用有哪些

水声功率放大器在声呐系统中扮演着重要的角色&#xff0c;其应用涵盖了声呐系统的多个方面。下面就让安泰电子来介绍水声功率放大器在声呐系统中的应用。 发射声波信号&#xff1a;声呐系统通过发射声波信号并接收其回波来探测和测量海洋中的目标物体。水声功率放大器用于放大发…

划片机新手教程:从准备工作到注意事项全解析!

随着科技的飞速发展&#xff0c;划片机已成为半导体行业不可或缺的一部分。对于新手来说&#xff0c;如何正确操作划片机显得尤为重要。以下是新手操作划片机的步骤和建议。 一、准备工作 在开始操作划片机之前&#xff0c;首先需要准备好以下工具和材料&#xff1a; 1. 划片机…