Iptables web
Firewall:隔离工具,packets filter firewall(包过滤防火墙);工做于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于可以被规则匹配到的报文进行某预约义的处理机制的一套组件; 算法
硬件防火墙:在硬件级别实现部分过滤功能的防火墙,另一部分功能基于软件实现; shell
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙; 安全
主机防火墙:服务范围为当前主机; 服务器
网络防火墙:服务范围为防火墙背后的局域网; 网络
Iptables/netfilter: 防火墙是在内核中实现的; 并发
Netfilter:防火墙框架,framework;位于内核空间; app
Iptables:命令行工具程序,位于用户空间,仅仅是规则管理工具;说白了就是在netfilter的门上放检测机制的; 框架
Netfilter: ssh
Hooks function:钩子函数;
Prerouting:路由以前
Input:
Forward:
Output:
Postrouting:路由以后;
Iptables:
CHAINS链
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
报文流向:
到本机某进程的报文先进入PEROUTINGàINPUT
由本机转发的报文先进入PEROUTINGàFORWARDàPOSTROUTING
由本机某进程发出的报文:OUTINGàPOSTROUTING
Tables:
Filter:过滤;
Nat:network address translate,网络地址转换;
Mangle:拆解报文,作出修改,并从新封装,一般用来作防火墙标记;
Raw:关闭nat表上启用的链接追踪机制;
优先级次序(由高而低):
Rawàmangleànatàfilter
功能和钩子的对应关系:
Raw:只适用于PREROUTING和OUTPUT;
Mangle:PREROUTINGàINPUTàFORWARDàOUTPUTàPOSTROUTING,都适用;
Nat:只适用于PREROUTING,INPUT,OUTPUT,POSTROUTING;
Filter:只适用于INPUT,FORWARD,OUTPUT;
Iptables规则的组成部分:
匹配条件:
网络层首部:source ip,destination ip;
传输层首部:source port,destination port;
扩展检查机制:
处理动做:target
ACCEPT容许, DROP丢弃, REJECT拒绝,
A请求b同步; b赞成并请求a也同步;创建链接;三次握手;
四次断开:
A请求与b的连接断开,b赞成断开;可是b不会同时请求说把我发给你的请求也断开,为何这么作呢?由于咱们的TCP协议容许半连接,也就是,a能发,b能收,可是没有b发a收这一段;所以在断开的时候能够只断开一半;这一就是为何断开须要4次;
对于iptables来说,真正能生效的是规则;规则是在用户空间编写的而后送往内核中的,那么送往内核的何处了呢?咱们的规则是在何时生效的?很显然内核若是能接受数据那必定是运行中的内核,而不是磁盘上的内核文件,那运行中的内核在哪呢?在内存中仍是磁盘上?很显然是在内存中,iptables所编写的规则是送往内存中的内核上的,那么这些规则在服务器重启以后将会消失不见,因此为了能让咱们下一次重启计算机后依然有规则可用,要将规则保存在配置文件中;
安装:
Netfilter:位于内核中的tcp/ip协议栈报文处理框架;
Iptables:
Centos5/6:iptables命令编写规则;
Iptables –t filter –F
Service iptables save
Centos7:firewalld;firewall-cmd,firewall-config
Systemctl stop firewalld
Systemctl disable firewalld 第二个视频15:00左右再听一遍
程序包:iptables;iptstatus(非必要,状态追踪器)
Iptables命令:
规则:根据制定的匹配条件来尝试匹配每一个流经此处的报文,一旦匹配成功,则规则后面指定的处理动做进行处理;
匹配条件:源地址,目标地址,传输层协议
扩展匹配条件:须要借助于扩展模块进行制定的匹配条件
处理动做:
基本动做:ACCEPT,DROP
扩展动做:须要借助于扩展模块进行,但无需显式制定,仅需指明动做;
添加规则时须要考量的问题:
Iptables命令的使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options] 扩展条件,可省略;
target = -j targetname [per-target-options] 指明处理动做;
规则管理格式:
Iptables [-t table] COMMAND chain criteria [-m matchname [per-match-options]] [-j targetname [per-target-options]]
-t 指定将规则写在哪张表上;
COMMAND 子命令
-m 指定扩展条件;
-j 指明处理动做;
-t talbe:指明要管理的表,默认为filter;
COMMANDS:
链管理:
-P iptables [-t table] -P chain target,定义链的默认策略;其target通常可以使用ACCEPT或DROP;
-N iptables [-t table] -N chain 新建一条自定义链,可是自定义链默认是不会被引用的;仅在默认链上经过某规则进行调用方可生效;所以,每一个自定义链都有其引用计数;
pkts:表示由此规则所匹配到的报文的个数;
bytes:表示由此规则所匹配到的包的大小之和;
target:表示该规则的目标;
prot:protocol,表示该规则所匹配的协议;
opt:选项
in:表示从哪一个网卡接口流进来;
out:表示报文由哪一个网卡接口流出;
source:源地址;
destination:目标地址;
(policy ACCEPT 870 packets, 131K bytes):若是报文没有被规则匹配到,则默认由默认策略所匹配(policy ACCEPT)被默认策略所匹配的包有870个,这870个包的大小之和有131个字节;
示例:CentOS 7
Yum install httpd vsftpd telnet-server samba –y
Iptables –t filter –P INPUT DROP 更改默认策略为DROP
此时,input规则链的默认规则就是DROP,因为咱们没有写任何规则,也就意味着咱们没有放行任何人的请求,因此这时候,全部的请求都会被阻断;
如何自定义链:
Iptables –t filter –N in_web
这时候就多了一个链in_web,表示放开全部跟web相关的报文,最好见名知意;这时候就没有默认规则了,而是(0 references)0此引用,表示没有被引用;
-X iptables [-t table] -X [chain],表示删除自定义链规则,若是没有加制定的自定义链,则表示将全部自定义链删除;而且只能删除自定义的空的应用计数为0的链;
-F iptables [-t table] -F [chain [rulenum]] [options...],清空制定的链或删除指定链上的规则;CentOS6和7的语法可能不一样;
-E iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;
-Z iptables [-t table] -Z [chain [rulenum]] [options...] 至零计数器;
规则:
-A:append,iptables [-t table] -A chain rule-specification,表示追加规则到指定的链;
-I:insert,iptables [-t table] -I chain [rulenum] rule-specification,插入规则,到指定的链中的指定位置,默认为链首;
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum;删除指定的链上的指定规则;方式有两种,删除时指明匹配条件也能够指明规则号码进行匹配;
-R:replace;iptables [-t table] -R chain rulenum rule-specification;表示将指定的链的指定的规则替换为为新的规则;
查看:
-L:list;iptables [-t table] -L [chain [rulenum]] [options...];表示列出规则;
-n:表示数字格式显示,若是不写,iptables则试图把每个地址反解为主机名;
-v:verbose;详细显示格式信息;
--line-numbers:显示链上的规则编号;
-x: exactly,显示计数器的精确值;
计数器:
每条规则以及链的默认策略分别有各自的两个计数器:
Iptables(2)
匹配条件:
基本匹配条件:
扩展匹配条件:
隐式扩展:
显式扩展:
注意:多重条件之间隐含逻辑为"与"操做;必需要同时知足;
基本匹配条件:
PARAMETERS
[!] -s, --source address[/mask][,...] 检查报文中的源ip地址是否符合此处制定的地址或地址范围;"!"号表示取反;一次有多个地址或地址块能够用逗号隔开;可是不要加空格,会报语法错误;
实例:
上图中,input链的默认规则是drop的,可是容许10.10.3.0/24网段的主机访问该主机的全部服务;
这时候,该规则的计数器开始有了数据;
实例2:
iptables -t filter -I INPUT -s 10.10.3.36 -j REJECT
上图的规则意思为拒绝10.10.3.0/24网段的10.10.3.36主机访问本机的任何服务;
不一样类别的规则,应该把访问比较频繁的服务对应的规则放前面;对于同一类别的服务,要把匹配范围较小的放前面,匹配范围较大的放后面;
条件替换
将以前的REJECT修改成DROP;数字1表明第一条规则;
若是动做是DROP:请求主机会等待访问主机的回应;若是动做是REJECT,则访问主机会直接拒绝请求主机的请求,并给予回应;
查看规则号码
删除规则
指明规则号
指明匹配条件
[!] -d, --destination address[/mask][,...] 检查报文中的目标ip地址是否符合此处指定的地址或地址范围;
[!] -p, --protocol protocol 检查报文中传输层的协议类型支持tcp,udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or the special keyword "all"
实例:
iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.36 -p tcp -j ACCEPT
不但指定了源地址和目标地址并且还指定了只容许tcp协议经过,这时候,能够访问该主机的web服务,可是其余的服务则没法提供,例如ping;
[!] -i, --in-interface name 检查报文进入本机时的接口是否符合本处指定的接口;仅适用于INPUT , FORWARD and PREROUTING;
[!] -o, --out-interface name 检查报文即将离开本机时经由的接口是否符合本处指定的接口;仅适用于FORWARD , OUTPUT and POSTROUTING;
-m, --match match 显式指明要使用的扩展模块;
-j, --jump target 指明要处理的动做,也能够是用户自定义的链,若是要使用的内建的链,有两种情形,能够是简单target也但是时扩展target;
扩展匹配条件
隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展,此处主要指使用-p{tcp/udp/icmp}给定协议后可直接对给定的协议所进行的扩展;
-m tcp;-m udp;-m icmp
检查tcp udp icmp首部;
在CentOS7上须要man iptables-extensions来获取;
-p tcp:可直接使用tcp协议对应的扩展选项;
[!] --source-port,--sport port[:port] 匹配报文中的传输层的源端口;可给出多个连续的端口;
[!] --destination-port,--dport port[:port] 匹配报文中的传输层的目标端口;可给出多个连续的端口;
实例:
只开放本机的ssh服务给本地网络
上图中的-m tcp 是能够省略的;
上图中,将input和output的默认策略都改成DROP就不会担忧将本身挡在外面了;
[!] --tcp-flags mask comp 标志位的检查机制
Mask 掩码
Comp 比较值
标志位:SYN ACK FIN RST URG PSH;
Mask:要检查的标志位列表,以逗号分隔;例如:--tcp-fags SYN,ACK,FIN,RST
Comp:mask给定的众标志位中,其值必须为1的标志位列表;余下的必须为0;
--tcp-flags SYN,ACK,FIN,RST,SYN;
简写格式:[!] –syn,就至关于--tcp-flags SYN,RST,ACK,FIN SYN
-p udp:可直接使用udp协议对用的扩展选项;
[!] --source-port,--sport port[:port] 匹配报文中的传输层的源端口;可给出多个连续的端口;
[!] --destination-port,--dport port[:port] 匹配报文中的传输层的目标端口;可给出多个连续的端口
-p icmp:可直接使用icmp协议对应的扩展选项;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配对ping请求的响应报文;
--icmp-type 8/0:匹配ping请求报文
开放本机的ping请求报文;容许别人ping本机;
iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.79 -p icmp --icmp-type 8/0 -j ACCEPT
开放10.10.3.0/24网段的地址能够对10.10.3.79进行ping;可是如今ping报文能进来,可是出不去;
上图中能够看见,只有10.10.3.44这台主机进来的ping报文,没有出去的,因此也是ping不通的;
开放本机的ping响应报文;
iptables -A OUTPUT -d 10.10.3.0/24 -s 10.10.3.79 -p icmp --icmp-type 0/0 -j ACCEPT
上图所示当开放了本机的ping响应报文后,经过抓包看见本机已经响应了10.10.3.44的ping报文;
这时候别人ping本机能够ping通,可是本机向外ping不通;是由于咱们仅容许响应报文出栈,没有容许请求报文出栈;
要求本机能ping任何网络
iptables -A OUTPUT -s 10.10.3.79 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT
如今报文能出去,可是进不来;
iptables -A INPUT -d 10.10.3.79 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT
如今本机向外ping的报文就能出去了;
显式扩展:必须使用-m选项给出matchname的扩展,并且有些扩展都还存在专用选项;
以离散或连续的方式定义的多端口匹配条件;Up to 15 ports can be specified最多只容许给出15个端口;A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp.指明端口匹配的条件是port:port,被记为两个端口;
[!] --source-ports,--sports port[,port|,port:port]...指定多个源端口
Port,port 表示连续
Port:port 表示离散
[!] --destination-ports,--dports port[,port|,port:port]...指定多个目标端口
[!] --ports port[,port|,port:port]... 匹配此处指定的源或目标端口
实例:
开放本机的22 23 80端口
上图中一条规则,开放3条服务;
2.Iprange
以连续的ip地址范围指明多地址匹配条件;
[!] --src-range from[-to] 匹配源地址
From to就表示从哪一个地址开始到哪一个地址结束之间的连续的地址范围;
[!] --dst-range from[-to] 匹配目标地址
3. string
对报文中的应用层数据作字符串匹配检测;
[!] --string pattern
[!] --hex-string pattern 为了在匹配时性能更好,效率更高,能够将字符串作16进制编码进行匹配;
--algo {bm|kmp} 字符串匹配检查算法;bm和kmp算法性能不相上下;
--from offset
--to offset
From和to能够指定检查报文的某段;而不用检查整个报文,不指定则检查整个请求报文;
Iptables –I OUTPUT –s 192.168.0.102 –d 0.0.0.0/0 –p tcp --dport 80 –m string --string "test"--algo bm -j REJECT
表示当主机192.168.0.102去访问web页面时,返回的报文中若是包含test字样的报文则不被放行;
4.Time
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始时间
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束时间
--timestart hh:mm[:ss] 天天的几点几分几秒开始
--timestop hh:mm[:ss] 天天的几点几分几秒结束
[!] --monthdays day[,day...] 每个月哪几天的时间段
[!] --weekdays day[,day...] 每周哪几天的时间段
拒绝该主机的telnet服务在非工做时间访问;
Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 23 –m time –timestart 16:00:01 --timestop 09:59:59 –weekdays Wed –j REJECT
拒绝其余主机在星期3的下午4点到次日9点59分使用telnet链接192.168.0.102主机;
5.connlimit
根据每客户端IP作并发链接数限制,即限制单IP可同时发起的链接请求;
--connlimit-upto n 链接数上限;
--connlimit-above n 链接数下限
Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 22 –m connlimit –connlimit-above 2 - j REJECT
外部同一台主机最多能起的ssh链接数是两个,超过两个则被阻断;
6.limit
基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
Iptables –A INPUT –d 192.168.0.102 –p icmp –icmp-type 8 –m limit –limit-burst 3 –limit 20/minute –j ACCEPT
指定ping请求是8,-m作速率限制,峰值速率为3个,速率为每分钟20个,只要在这个范围内则容许;前三个没有时间限制,后面的每3秒一个;
Iptables –A OUTPUT –s 192.168.0.102 –p icmp –icmp-type 0 –j ACCEPT
放行icmp报文的出向;
7.state
[!] --state state
状态检测:链接追踪机制(conntrack)
咱们的iptables或者netfilter可以在内核当中的某段内存上用一个哈希表记录下来每个链接的源ip,目标ip,源端口,目标端口,何时与本机创建了链接?已经持续了多长时间,这个哈希表中会记录得清清楚楚,那么记录下来之后,再有一个新的请求到达时,咱们跟该表相比较,若是这个源地址和源端口都存在了,咱们就认为这个链接此前是来过的;
每个新的请求到达时,咱们都将其记录在该表上,那也就意味着每个链接请求到达时,咱们就先检查该表,看看有没有跟这个请求的源端口,源ip,目标端口,目标ip相匹配的,若是有,就代表其此前访问过,若是没有,就将其加入该表中;
一个可以检查链接到达时是否此前访问过的功能就叫作链接追踪;很显然,链接追踪须要一段内存空间来存储,这段内存空间是有固定大小的,能存多少条也是肯定的,在该表中的每个条目都有一个计时器,一旦时间到了,将被自动删除;若是该表的空间满了,也没有超时,则新的请求进来则没法对其追踪,则该新请求会被拒绝;因此当咱们启用链接追踪功能之后,若是本机的并发访问数量很是大的话,会致使某些请求会被拒绝服务;
咱们链接追踪到的内容放在/proc/net/nf_conntrack文件当中,那么到底能存多少个追踪条目呢?取决于这个文件/proc/sys/net/nf_conntrack_max;具体能有多大,取决于服务器的内存大小,该大小是能够调整的;
链接追踪机制有这么几个状态:
New:一个新链接
ESTABLISHED:已创建的连接
RELATED:相关联的链接
INVALID:没法识别的链接
UNTRACKED:未被追踪的链接
要想完成链接追踪功能,咱们得使用一个内核模块,nf_conntrack;在CentOS6和7上可能名称不同;
若是咱们可以用lsmod |grep nf_conntrack能看到该模块,则表示链接追踪功能有效了,
Nf_conntrack模块只能追踪正常状态的链接,不能追踪那些相关联状态的链接,要想追踪那些ftp的数据链接和命令链接,咱们还须要另一个模块nf_conntrack_ftp,是专门用于实现追踪related状态的,该模块默认是不会被装载的,要想追踪related状态,须要手动装入;
相关内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
不一样的协议的连接追踪时长:
/proc/sys/net/netfilter/
好比咱们作了防火墙,屏蔽了除80之外的全部端口,那很显然,该80端口能够接收请求进来,也能够响应出去,可是有多是咱们的服务器被被别人种下一个木马,这个木马扫描了宿主机发现只有80端口是开放的,因此该木马经过80端口偷偷的出去链接它的控制端,这会从80端口真正的发起一个链接出去,但这必定是非正常状态,在咱们服务器正常工做状态下决不容许这种状况发生的,为了使咱们的服务器更加安全,咱们能够这样设置规则,咱们的80端口只容许进来为new的链接请求,出去的只能是ESTABLISHED;只要有别人请求进来,服务器给予响应,响应时它就是ESTABLISHED,可是只有第一次请求才为NEW,第二次请求也是ESTABLISHED,所以,入栈时咱们容许为NEW,ESTABLISHED,可是出去的只容许为ESTABLSHED,像这种反弹式木马就没办法作到悄悄地经过80端口去链接它的控制端;这样防火墙将变得更加安全;
咱们也能够这么认为,若是咱们的默认策略通通为DROP时,那么任何一个能进来的,咱们都应该让它出去,任何一个能进来时,当它出去为ESTABLISHED都放行有危险吗?没有危险,通常来说,状态为ESTABLISHED,必定是对某个请求的响应,假设在这种状态之下,咱们能够仅容许OUTPUT时为ESTABLISHED状态,无论是什么链接,凡是ESTABLISHED状态的通通放行,这时候一条规则就能放行全部服务了,实现了规则优化的目的,固然有了链接追踪之后,咱们还能够放行被动模式的ftp服务了,我只开放21号端口,别人请求响应都正常,可是,当数据链接来的时候,被动模式下,客户端会请求服务器的随机端口,防火墙不可能开放这些端口,可是我能判断出这个链接是RELATED,因此这个时候就检查状态,若是它请求的是个人随机端口,可是状态为RELATED,咱们就放行,而不用开放这一端口,基于状态链接就能达到数据链接的目的,而不用开放端口;
实例:默认input和output都是DROP;
本机的ssh/web/ftp服务,咱们容许别人来访问,可是咱们毫不容许别人经过22,23,80端口主动链接别人;
iptables –A INPUT –d 192.168.0.102 –p tcp –m multiport --dport 22,23,80 –m state --state NEW,ESTABLISHED –j ACCEPT
iptables –A OUTPUT –m state --state ESTABLISHED –j ACCEPT
假如我容许别人ping本机,
iptables –A INPUT –d 192.168.0.102 –p icmp --icmp-type 8 –m state --state NEW,ESTABLISHED –j ACCEPT
我对全部协议都检查状态,你只要是ESTABLISHED的都放行;这时候咱们就能够集中精力好好研究放行入栈的请求了;
那么如和开放本机的ftp服务呢?
iptables –I INPUT –m state --state ESTABLISHED –j ACCEPT
iptables –R INPUT 2 –d 192.168.0.102 –p tcp –m multiport –dports 21:23,80 –m state --state NEW –j ACCEPT
iptables –R INPUT 1 –m state --state RELATED,ESTABLISHED –j ACCEPT
systemctl start vsftpd.service 启动vsftpd.service服务
另外一台主机上:lftp 192.168.0.102
发现访问不了;
lsmod |grep ftp 追踪ftp的模块没有被装载;
modprobe nf_conntrack_ftp 装载模块;
断开lftp链接,再次请求,则成功;
如何开放被动模式的ftp服务:
装载追踪ftp协议的模块
modprobe nf_conntrack_ftp
放行入栈命令链接
iptables –A INPUT –d SERVER-IP –p tcp --dport 21 –m state --state NEW,ESTABLISHED –j ACCEPT
放行入栈数据链接
iptables –A INPUT –d SERVER-IP –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT
放行出栈链接
iptables –A OUTPUT –s SERVER-IP –m state --state ESTABLISHED –j ACCEPT
处理动做:
-j targetname [per-target-options]
简单target
ACCEPT DROP
扩展target
REJECT
--reject-with type 指明拒绝理由
icmp-net-unreachable 网络不可达
icmp-host-unreachable 主机不可达
icmp-port-unreachable 端口不可达
icmp-proto-unreachable 协议不可达
icmp-net-prohibited 网络被禁止
icmp-host-prohibited 主机被禁止
icmp-admin-prohibited 管理被禁止
默认为:icmp-port-unreachable
LOG
turn on kernel logging of matching packets.打开内核中匹配报文的日志记录功能;
--log-level level 指明日志级别
emerg, alert, crit, error, warning,notice, info or debug.
--log-prefix prefix 日志信息的前导信息;
iptables –I INPUT 2 –d 192.168.0.102 –p tcp --dport 22 –j LOG --log-prefix "openssh from kernel" 加到第2条,只记录NEW状态的信息;
而后在/var/log/messages中就能够找到其log信息;
保存和载入规则
iptables-save
在CentOS7中,要以输出重定向的方式保存规则;
iptables-save > /etc/sysconfig/iptables CentOS7中,该文件默认不存在,文件名能够自定义,能作到见名知意;
在CentOS6中,该文件默认是存在的,保存方式为service iptables save;
iptables-restore
在CentOS7中,能够将保存的各类不一样应用场景的iptables规则文件以输入重定向的方式将其重载回iptables,可是以前的就会被覆盖
iptables-restore < /etc/sysconfig/iptables
-n, --noflush 不清除原有规则
-t, --test 仅分析生成规则集,但不予提交;
CentOS 6:
保存规则:service iptables save
保存规则与/etc/sysconfig/iptables,保存操做会清除文件中原有的内容;
重载规则:service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
脚本配置文件:/etc/sysconfig/iptables-config
能够用于指明要装在的模块,好比说nt_conntrock_ftp;
CentOS 7开机自动生效规则:
规则优化思路:
iptables/netfilter
主机防火墙主要工做在呢他filter的input和output链上,由于他们主要做用在于主机内部的某一进程进行通讯,一个外来的报文要想到达本机,得先经由input链,可是在到达input链以前要先到达prerouting,可是prerouting跟过滤功能没有重叠关系,所以在到达本机的外来报文的过滤功能只能在input上实现,本地主机与外部通讯,则经由output和postrouting,可是在postrouting上没法实现过滤功能;
forword的主要做用在于,全部经由本机的一个接口进来的报文,在本地路由功能发生决策之后,发现目标地址不是本机,咱们须要帮忙转发至其余网络当中去,这种应用场景咱们称之为转发功能;而转发时的报文势必要经由forword链,可是除了这个链,它会经由3条链,分别是刚刚进入本机的preroutingà到达本机路由决策之后,发现目标非本地,若是打开本机的核心转发功能则
实验环境:
192.168.22.2 192.168.22.1 10.1.0.6 10.1.0.67
(1)打开firewall的核心转发功能;而且分别在内网和外网上配置http服务,而且能互相访问;echo 1 > /proc/sys/net/ipv4/ip_forward
(2)iptables –A FORWARD –j DROP
(3)放开由内而外的服务
iptables –I FORWARD –s 192.168.22.0/24 –p tcp --dport 80 –j ACCEPT
这只是放行了请求报文出去,因此任然内网不能访问外网;
iptables –I FORWARD –d 192.168.22.0/24 –p tcp --sport 80 –j ACCEPT
放行进来的报文,这时候内网就能访问外网了;
使用状态追踪;
iptables –D FORWARD 2 删除刚才放行进来报文的规则;
添加凡是响应报文咱们都放行;
iptables –I FORWARD –m state --state ESTABLISHED –j ACCEPT
开放内网主机ssh链接外网主机
iptables –R FORWARD 2 –s 192.168.22.0/24 –p tcp –m multiport --dport 80,22,23,21 –m state --state NEW –j ACCEPT
这时候80和ssh是正常的,可是要想让ftp服务正常服务,必须打开related服务;
装载模块:modprobe nf_conntrack_ftp;
iptables –R FORWARD 1 –m state --state ESTABLISHED,RELATED –j ACCEPT
如今由内而外请求ftp就能够正常进行了;lftp 10.1.0.67
iptables/netfilter网络防火墙:
添加规则与forward链,注意几个问题:
(1)请求和响应报文均会经由FORWARD链,要注意规则的方向性;
(2)若是能够启用conntrack机制,注意网关主机所可以追踪的链接数的最大数量要符合要求;
NAT :地址转换
当内网想访问外网的时候,源IP是1的ip,目标ip是internet的任意主机ip4,这时候源ip和目标ip不在同一个网段,则内网报文发给网关ip2;ip2经由本机路由表查询发现该报文须要经由ip3发出去,因而该报文在路由完之后就扔给ip3的消息队列了,ip3拿到这个报文向外发送的时候,得先改地址,再发送,因此这个报文立刻被外网网卡发出去以前将地址作修改,怎么改呢?当报文送达到ip3的时候,源ip是ip3,目标ip是ip4.
外网回应的时候,响应报文发送时,源ip是ip4,目标地址是ip3,当ip3收到报文以后就去查NAT表,查到此前是由某一个ip1访问了ip4的,所以该报文送达到本机的网卡以后,在路由发生以前要将目标地址修改成ip1,源ip修改成ip2,
源地址转换:SNAT POSTROUTING
静态转换:外网地址是固定的;
动态转换:外网地址是不固定的,须要临时探测外网地址是什么而后转换;
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.只能放在nat表上,仅支持POSTROUTING或INPUT;
--to-source [ipaddr[-ipaddr]]
实例:
iptables –t nat –A POSTROUTING –s 192.168.22.0/24 –j SNAT --to-source 10.1.0.6
将内网地址出去的时候转换为公网地址10.1.0.6出去;
用192.168.22.0/24段的地址ping10.1.0.67,在67上tcpdump会发现是10.1.0.6在ping;
在10.1.0.6上的内网网卡上抓包会发现是192.168.22.0/24位的地址在ping;
也能够查看日志/var/log/httpd/access_log
MASQUERADE 地址假装
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
MASQUERADE能够实现动态转换之目的,它知道当内网中的主机发出访问请求时,经过哪一块网卡出去,并且会自动找到那个网卡上已生效的ip地址,将其做为源地址,所以能够不用使用--to-source 而去自行判断用哪一个;这时候就有问题了,每一次请求到达时咱们得看看到底哪一个地址可用。所以在访问量较大时会很影响性能;
--to-ports port[-port]
目标地址转换:DNAT PREROUTING
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]]
实例
iptables –t nat –A PREROUTING –d 10.1.0.6 –p tcp --dport 80 –j DNAT --to-destination 192.168.22.2:80
后面冒号的80能够不用写,表示,目标地址是80,转换时也是80;
iptables –t NAT –A PREROUTING –d 10.1.0.6 –p tcp --dport 22022 –j DNAT --to-destination 192.168.22.3:22
当外网主机访问10.1.0.6:22022的ssh服务时,则被转换为192.168.22.3:22的ssh服务,达到隐藏内网ssh端口之目的;
REDIRECT 端口映射
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.仅在当前主机完成端口映射;
--to-ports port[-port]
在192.168.22.2这台主机上起http服务,并将默认80端口修改成8080,而后就在192.168.22.2这台主机上起iptables规则,经过REDIRECT完成端口转换;
iptables –t nat –A PREROUTING –d 192.168.22.2 –p tcp --dport 80 –j REDIRECT --to-port 8080
测试:curl http://192.168.22.2:80
自定义链的使用:
iptables –A FORWARD –m state --state ESTABLISHED –j ACCEPT
iptables –N web_in
iptables –A web_in –d 192.168.22.0/24 –p tcp --dport 80 –m state --state NEW –j ACCEPT
iptables –A FORWARD –j REJECT
这时候请求http服务是不能够的;
调用web_in
iptables –I FORWARD 2 –d 192.168.22.0/24 –p tcp --dport 80 –j web_in
再次请求就能够了;
RETURN 返回
iptables –A web_in –j RETURN 若是全部规则都不匹配时返回web_in;
注意:自定义链一旦被引用和有规则时,是不容许被删除的;