技术标签: iptables Linux linux 网关 docker
主机防火墙:针对于单个主机进行防护。
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
网络防火墙和防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
iptables是linux自带的一款开源的内核级基于数据包过滤的防火墙。利用iptables可以实现诸如数据包过滤、转发等功能。
iptables包含表,表中包含链,链中包含规则。(规则指的是一条条用于过滤数据包的语句)
iptables是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。
配置防火墙的主要工作就是添加、修改和删除这些规则。具体可查看此文档:https://blog.csdn.net/biao0309/article/details/106951023
如下图,当请求主机的某个服务时,需要经过iptables中的匹配规则,由上到下层层过滤。
举个例子,通过docker启用了一个Mysql服务,这个服务为了安全,只允许A服务器访问,需要设置防火墙
# 禁止全部
iptables -P INPUT DROP
# 允许A服务器访问
iptables -A INPUT -p tcp –s 192.168.2.1 -j ACCEPT
但此时会发现规则并不生效,这个容器服务依旧是对所有人开放,那么这是怎么了?
实际上,Docker容器不是主机服务。它们依赖于主机中的虚拟网络,并且主机充当该网络的网关。对于网关,路由流量不是由INPUT表处理,而是由FORWARD表处理,这会使设置的规则无效。
实际上,Docker守护程序在开始做有关容器网络连接的时候,会创建许多iptables规则。特别是,创建了DOCKER表来处理有关容器的规则,将流量从FORWARD表转发到此新表。
Docker在FORWARD链中,还额外提供了自己的链,以实现bridge网络之间的隔离与通信。
Docker在iptables的filter表中的链
在2015.12之前,Docker只额外提供了DOCKER链。
在此之后,直到Docker 17.06.0(2017.6)之前的版本中,Docker提供了如下2个链:DOCKER、DOCKER-ISOLATION
在Docker 17.06.0(2017.6)及之后,Docker 18.03.1(2018.4)及之前的版本中,Docker提供了如下3个链:DOCKER、DOCKER- ISOLATION、DOCKER-USER
Docker的DOCKER链
仅处理从宿主机到docker0的IP数据包。
Docker的DOCKER-ISOLATION链
可以看到,为了隔离在不同的bridge网络之间的容器,Docker提供了两个DOCKER-ISOLATION阶段实现。
DOCKER-ISOLATION-STAGE-1链过滤源地址是bridge网络(默认docker0)的IP数据包,匹配的IP数据包再进入DOCKER-ISOLATION-STAGE-2链处理,不匹配就返回到父链FORWARD。
在DOCKER-ISOLATION-STAGE-2链中,进一步处理目的地址是bridge网络的IP数据包,匹配的IP数据包表示该IP数据包是从一个bridge网络的网桥发出,到另一个bridge网络的网桥,这样的IP数据包来自其他bridge网络,将被直接DROP;不匹配的IP数据包就返回到父链FORWARD继续进行后续处理。
Docker的DOCKER-USER链
Docker启动时,会加载DOCKER链和DOCKER-ISOLATION(现在是DOCKER-ISOLATION-STAGE-1)链中的过滤规则,并使之生效。
如果用户要补充Docker的过滤规则,建议追加到DOCKER-USER链。DOCKER-USER链中的过滤规则,将先于Docker默认创建的规则被加载,从而能够覆盖Docker在DOCKER链和DOCKER-ISOLATION链中的默认过滤规则。
例如,Docker启动后,默认任何外部source IP都被允许转发,从而能够从该source IP连接到宿主机上的任何Docker容器实例。如果只允许一个指定的IP访问容器实例,可以插入路由规则到DOCKER-USER链中,从而能够在DOCKER链之前被加载。示例如下:
# 只允许192.168.1.1访问容器
iptables -A DOCKER-USER -i docker0 ! -s 192.168.1.1 -j DROP
# 只允许192.168.1.0/24网段中的IP访问容器
iptables -A DOCKER-USER -i docker0 ! -s 192.168.1.0/24 -j DROP
# 只允许192.168.1.1-192.168.1.3网段中的IP访问容器(需要借助于iprange模块)
iptables -A DOCKER-USER -m iprange -i docker0 ! --src-range 192.168.1.1-192.168.1.3 -j DROP
启动了容器数据库Mysql服务,内部端口3306,映射端口3307
根据国际惯例,需要对端口做限制,数据库只能被指定服务器访问,按照经验,禁止全部访问3307
# 禁用全部访问端口3307
iptables -I DOCKER-USER -p tcp –dport 3307 -j DROP
# 同时允许一个服务器访问本机3307端口
iptables -I DOCKER-USER -p tcp –s 192.168.3.1 –dport 3307 -j ACCEPT
奇怪的事情发生了,经验出了问题,依旧是可以全部IP都可以访问,并不是指定IP。
看下防火墙设置:
iptables-save
# 输出了两部分
# 第一部分,nat表,部分内容如下
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [4:296]
:POSTROUTING ACCEPT [4:296]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.28.0.0/16 ! -o br-0be676646756 -j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 3306 -j MASQUERADE
-A DOCKER -i br-0be676646756 -j RETURN
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 3307 -j DNAT --to-destination 172.17.0.2:3306
COMMIT
这里可以看到在nat表的DOCKER链中,对目的IP进行了nat转换,变成了容器IP: 3307
那么,正确是设置规则对内部端口进行设置
# 设置容器内部端口
iptables -I DOCKER-USER -p tcp –s 10.0.0.1 –dport 3306 -j ACCEPT
如果是有两个容器,内部端口都是3306,此时可以对容器IP进行控制:
# 容器一的IP:172.0.0.1
iptables -I DOCKER-USER -p tcp –s 10.0.0.1 –d 172.0.0.1 –dport 3306 -j ACCEPT
# 容器二的IP:172.0.0.2
iptables -I DOCKER-USER -p tcp –s 10.0.0.2 –d 172.0.0.2 –dport 3306 -j ACCEPT
Apache Spark 社区是全球最大的开源社区。而借由快速、易于使用的特点,Spark 成为时下最流行的分布式内存大数据处理引擎,可以帮助解决各种复杂的数据问题,无论是半结构化、结构...
今天来总结下这几天暑假最后一周赶作业刷题好了。这几天尽管有很多题并非完全是用键盘敲出来的,有不少改版甚至套版的情况,但是在逆向读标程的时候也提高了一些自己的编程姿势水平。一个就是发现djkstra竟然是用系统栈优化的写法,要是我来写多半写个n方出来或者手动开一个堆优化出来(雾)。还有就是有的时候stack、queue和vector能实现一些很玄学的东西是手写写不出来的,用vector存每个点的边比
一、shell处理多线程在特殊情况下需要同时启动多个程序,而且要求执行的命令不能停止完再执行下一条。即顺序执行是不满足要求的,因此,此时需要用到多线程处理。具体实现方法如下图所示:方式:shell 的for循环do与done之间的代码使用{ }&放在后台执行。 #!/bin/bashfor i in `seq 2 5`do{ java -jar Vehicle_V1...._shell kill 线程
入门书籍 《明解Java》- 豆瓣评分 8.5 《Java从入门到精通(第4版 附光盘)》- 豆瓣评分 6 《入门很简单丛书:Java Web开发入门很简单》 《程序员炼成记 从小白到工程师》 《Java从小白到大牛》 《JavaWeb项目开发实战入门(全彩版)》 《Java精彩编程200例(全彩版)》 《Java轻松学》 《大话Java:程序设计从入门到精通(含DVD光盘1张)》 《Java语言袖珍指南(第.._最值得程序员珍藏的200部技术经典系列
我们需要把图中的数据位置(或坐标)分成两组。We need to divide the position (orcoordinate) data into two groups. 图1-6中的数据点是训练数据。The points on the figure are the trainingdata.设计目标是使用训练数据确定两组数据边界的曲线。The objective i...
题目描述: 实现一个函数,检查一棵二叉树是否为二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 解题思路1: C++解法:给出节点的范围如下图所示。 代码1: class Solution {publi.
这是一道NOJ简单题卡了一下,发现是找规律题。。。(主要还是太菜)直接算就好,不用想太多。直接放代码#include<iostream>#include<iomanip>using namespace std;int main(){ float up=2,_up=3,down=1,_down=2,temp=0; float sum=up/down+_up..._noj奇特的分数数列
文章目录Vue 简介Vue 特性Vue的使用Vue 简介Vue:是一套用于构建用户界面的前端框架。构建用户界面用 vue 往 html 页面中填充数据,非常的方便框架框架是一套现成的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能要学习 vue,就是在学习 vue 框架中规定的用法 vue的指令、组件(是对 UI 结构的复用)、路由、Vuex、vue 组件库Vue 的特点遵循 MVVM 模式编码简洁,体积小,运行效率高,适合移动 / PC 端开发它本身只关注 _vue特点
版权声明:本文为博主原创文章,未经博主允许不得转载。 首先,对于SqlServer的事务和隔离级别,与其他关系型数据库类似,事务是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动。我们可以显式或隐式的定义事务边界。可以使用BEGIN TRAN或者BEGIN TRANSACTION语句显式的定义事务的开始。如果希望提交事务,可以使用COMMIT TRAN语句显式的定义事...
JDK中的排序:Arrays.sort的源码实现文章目录JDK中的排序:Arrays.sort的源码实现Java中的排序并没有那么简单整体看看Arrays.sort的所有重载方法对基本数据类型数组的排序对Object数组和泛型数组的排序在使用Arrays.sort时需要注意的点Java中的排序并没有那么简单 JDK中的排序是如何实现的?用了什么算法?或许有人说用了快排,但事实上JDK中排序的实现并没有那么简单,我们进入Arrays.sort的源码来一探究竟整体看看Arrays.sort的所有重载方_arrays.sort()源码
使用的天翼云端口被占用了更换端口解决了postgresql修改完端口后直接psql连接数据库报错https://blog.csdn.net/silenceray/article/details/68066514psql 后面加上端口号 [postgres@node2 data]$ psql -p 5435..._received invalid response to ssl
这里面有些搬运前辈的,有一部分自己摸索的_谷歌浏览器卸载