表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
目录
1. Docker在iptables的filter表中的链在Docker 18.05.0(2018.5)及之后的版本中,提供如下4个chain:
规则表之间的优先顺序
规则表之间的优先顺序 raw——mangle——nat——filter。
mangle 矫正表
nat 地址转化
filter策略表
raw表只使⽤在PREROUTING链和OUTPUT链上,因为优先级最⾼,从⽽可以对收到的数据包在连接跟踪前进⾏处理。
filter表主要⽤于过滤数据包,该表根据系统管理员预定义的⼀组规则过滤符合条件的数据包。对于防⽕墙⽽⾔,主要利⽤在filter 表中指定的规则来实现对数据包的过滤。
nat表主要⽤于⽹络地址转换NAT,该表可以实现⼀对⼀,⼀对多,多对多等NAT ⼯作,iptables就是使⽤该表实现共享上⽹ 的。
mangle表主要⽤于对指定数据包进⾏更改。
规则表之间的优先顺序 raw——mangle——nat——filter。
规则(rules)
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
指令用法:
DOCKER 容器
-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
列如:删除INPUT链的第一条规则
iptables -D INPUT 1-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
!可以将条件取反
列如:允许防火墙转发除ICMP协议以外的所有数据包
iptables -A FORWARD -p ! icmp -j ACCEPT
参数
| -P | 匹配协议,! 表示取反 |
| -s | 匹配源地址 |
| -D | 匹配目标地址 |
| -I | 匹配入站网卡接口 |
| -o | 匹配出站网卡接口 |
| -sport | 匹配源端口 |
| -dport | 匹配目标端口 |
| -src-range | 匹配源地址范围 |
| -dst-range | 匹配目标地址范围 |
| -limit | 四配数据表速率 |
| -mac-source | 匹配源MAC地址 |
| -sports | 匹配源端口 |
| -dports | 匹配目标端口 |
| -stste | 匹配状态(INVALID、ESTABLISHED、NEW、RELATED) |
| -string | 匹配应用层字串 |
iptables默认规则
*filter#INPUT规则链默认策略是ACCEPT
:INPUT ACCEPT [0:0]
#FORWARD 规则链默认策略是ACCEPT
:FORWARD ACCEPT [0:0]
#OUTPU 规则链默认策略是ACCEPT
:OUTPUT ACCEPT [0:0]
# 允许我发出去的数据包入站
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 允许ICMP协议
-A INPUT -p icmp -j ACCEPT
# 允许回环网卡
-A INPUT -i lo -j ACCEPT
# 允许ssh连接
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# 拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#表示提交前面的规则设置
COMMIT
原文链接:https://blog.csdn.net/ystyaoshengting/article/details/102651969
容器和虚拟机的区别对比


DOCKER
DOCKER-ISOLATION-STAGE-1
DOCKER-ISOLATION-STAGE-2
DOCKER-USER
目前,Docker默认对宿主机的iptables设置规则完整一览,在/etc/sysconfig/iptables文件中
##地址转发表nat中的规则链及默认
*nat
#PREROUTING规则链默认策略是ACCEPT
:PREROUTING ACCEPT [0:0]
#INPUT规则链默认策略是ACCEPT
:INPUT ACCEPT [0:0]
#OUTPUT规则链默认策略是ACCEPT
:OUTPUT ACCEPT [4:272]
#POSTROUTING规则链默认策略是ACCEPT
:POSTROUTING ACCEPT [4:272]
#DOCKER规则链默认策略是ACCEPT
:DOCKER - [0:0]
#规则表中的链及默认策略
*filter
:INPUT DROP [4:160]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [59:48132]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
#在FORWARD规则链中添加的规则
#数据包全部指定到DOCKER-USER链
-A FORWARD -j DOCKER-USER
dockerd启动时,参数--iptables默认为true,表示允许修改iptables路由表。要禁用该功能,可以有两个选择:
设置启动参数--iptables=false
修改配置文件/etc/docker/daemon.json,设置"iptables": "false";然后执行systemctl reload docker重新加载
命令帮助文档:Reference documentation | Docker Documentation
| 命令 | 描述 |
| docker attach | 将本地标准输入、输出和错误流附加到正在运行的容器 |
| docker build | 从泊坞文件构建映像 |
| docker builder | 管理生成 |
| docker checkpoint | 管理检查点 |
| docker commit | 根据容器的更改创建新映像 |
| docker config | 管理容器配置 |
| docker container | 管理容器 |
| docker context | 管理上下文 |
| docker cp | 在容器和本地文件系统之间复制文件/文件夹 |
| docker create | 创建新容器 |
| docker diff | 检查对容器文件系统上的文件或目录所做的更改 |
| docker events | 从服务器获取实时事件 |
| docker exec | 在正在运行的容器中运行命令 |
| docker export | 将容器的文件系统导出为 tar 存档 |
| docker history | 显示图像的历史记录 |
| docker image | 管理图像 |
| docker images | 列出图像 |
| docker import | 从压缩包导入内容以创建文件系统映像 |
| docker info | 显示系统范围的信息 |
| docker inspect | 返回有关 Docker 对象的低级信息 |
| docker kill | 终止一个或多个正在运行的容器 |
| docker load | 从焦油存档或 STDIN 加载映像 |
| docker login | 登录到泊坞站注册表 |
| docker logout | 从泊坞站注册表注销 |
| docker logs | 获取容器的日志 |
| docker manifest | 管理 Docker 映像清单和清单列表 |
| docker network | 管理网络 |
| docker node | 管理群节点 |
| docker pause | 暂停一个或多个容器中的所有进程 |
| docker plugin | 管理插件 |
| docker port | 列出容器的端口映射或特定映射 |
| docker ps | 列出容器 |
| docker pull | 从注册表中拉取映像或存储库 |
| docker push | 将映像或存储库推送到注册表 |
| docker rename | 重命名容器 |
| docker restart | 重新启动一个或多个容器 |
| docker rm | 删除一个或多个容器 |
| docker rmi | 删除一张或多张图片 |
| docker run | 在新容器中运行命令 |
| docker save | 将一个或多个图像保存到 tar 存档(默认情况式传输到 STDOUT) |
| docker search | 在泊坞站中心搜索映像 |
| docker secret | 管理泊坞站机密 |
| docker service | 管理服务 |
| docker stack | 管理泊坞站堆栈 |
| docker start | 启动一个或多个已停止的容器 |
| docker stats | 显示容器资源使用情况统计信息的实时流 |
| docker stop | 停止一个或多个正在运行的容器 |
| docker swarm | 管理蜂群 |
| docker system | 管理容器 |
| docker tag | 创建引用SOURCE_IMAGE的标记TARGET_IMAGE |
| docker top | 显示容器的运行进程 |
| docker trust | 管理对 Docker 映像的信任 |
| docker unpause | 取消暂停一个或多个容器中的所有进程 |
| docker update | 更新一个或多个容器的配置 |
| docker version | 显示泊坞版本信息 |
| docker volume | 管理卷 |
| docker wait | 阻止直到一个或多个容器停止,然后打印其退出代码 |
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密