iptables 使用.docx
《iptables 使用.docx》由会员分享,可在线阅读,更多相关《iptables 使用.docx(24页珍藏版)》请在冰豆网上搜索。
iptables使用
一、iptables:
从这里开始
删除现有规则
iptables-F
(OR)
iptables--flush
设置默认链策略
iptables的filter表中有三种链:
INPUT,FORWARD和OUTPUT。
默认的链策略是ACCEPT,你可以将它们设置成DROP。
iptables-PINPUTDROP
iptables-PFORWARDDROP
iptables-POUTPUTDROP
你需要明白,这样做会屏蔽所有输入、输出网卡的数据包,除非你明确指定哪些数据包可以通过网卡。
屏蔽指定的IP地址
以下规则将屏蔽BLOCK_THIS_IP所指定的IP地址访问本地主机:
BLOCK_THIS_IP="x.x.x.x"
iptables-AINPUT-ieth0-s"$BLOCK_THIS_IP"-jDROP
(或者仅屏蔽来自该IP的TCP数据包)
iptables-AINPUT-ieth0-ptcp-s"$BLOCK_THIS_IP"-jDROP
允许来自外部的ping测试
iptables-AINPUT-picmp--icmp-typeecho-request-jACCEPT
iptables-AOUTPUT-picmp--icmp-typeecho-reply-jACCEPT
允许从本机ping外部主机
iptables-AOUTPUT-picmp--icmp-typeecho-request-jACCEPT
iptables-AINPUT-picmp--icmp-typeecho-reply-jACCEPT
允许环回(loopback)访问
iptables-AINPUT-ilo-jACCEPT
iptables-AOUTPUT-olo-jACCEPT
二、iptables:
协议与端口设定
允许所有SSH连接请求
本规则允许所有来自外部的SSH连接请求,也就是说,只允许进入eth0接口,并且目的端口为22的数据包
iptables-AINPUT-ieth0-ptcp--dport22-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport22-mstate--stateESTABLISHED-jACCEPT
允许从本地发起的SSH连接
本规则和上述规则有所不同,本规则意在允许本机发起SSH连接,上面的规则与此正好相反。
iptables-AOUTPUT-oeth0-ptcp--dport22-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AINPUT-ieth0-ptcp--sport22-mstate--stateESTABLISHED-jACCEPT
仅允许来自指定网络的SSH连接请求
以下规则仅允许来自192.168.100.0/24的网络:
iptables-AINPUT-ieth0-ptcp-s192.168.100.0/24--dport22-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport22-mstate--stateESTABLISHED-jACCEPT
上例中,你也可以使用-s192.168.100.0/255.255.255.0作为网络地址。
当然使用上面的CIDR地址更容易让人明白。
仅允许从本地发起到指定网络的SSH连接请求
以下规则仅允许从本地主机连接到192.168.100.0/24的网络:
iptables-AOUTPUT-oeth0-ptcp-d192.168.100.0/24--dport22-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AINPUT-ieth0-ptcp--sport22-mstate--stateESTABLISHED-jACCEPT
允许HTTP/HTTPS连接请求
#1.允许HTTP连接:
80端口
iptables-AINPUT-ieth0-ptcp--dport80-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport80-mstate--stateESTABLISHED-jACCEPT
#2.允许HTTPS连接:
443端口
iptables-AINPUT-ieth0-ptcp--dport443-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport443-mstate--stateESTABLISHED-jACCEPT
允许从本地发起HTTPS连接
本规则可以允许用户从本地主机发起HTTPS连接,从而访问Internet。
iptables-AOUTPUT-oeth0-ptcp--dport443-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AINPUT-ieth0-ptcp--sport443-mstate--stateESTABLISHED-jACCEPT
类似的,你可以设置允许HTTP协议(80端口)。
-mmultiport:
指定多个端口
通过指定-mmultiport选项,可以在一条规则中同时允许SSH、HTTP、HTTPS连接:
iptables-AINPUT-ieth0-ptcp-mmultiport--dports22,80,443-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp-mmultiport--sports22,80,443-mstate--stateESTABLISHED-jACCEPT
允许出站DNS连接
iptables-AOUTPUT-pudp-oeth0--dport53-jACCEPT
iptables-AINPUT-pudp-ieth0--sport53-jACCEPT
允许NIS连接
如果你在使用NIS管理你的用户账户,你需要允许NIS连接。
即使你已允许SSH连接,你仍需允许NIS相关的ypbind连接,否则用户将无法登陆。
NIS端口是动态的,当ypbind启动的时候,它会自动分配端口。
因此,首先我们需要获取端口号,本例中使用的端口是853和850:
rpcinfo-p|grepypbind
然后,允许连接到111端口的请求数据包,以及ypbind使用到的端口:
iptables-AINPUT-ptcp--dport111-jACCEPT
iptables-AINPUT-pudp--dport111-jACCEPT
iptables-AINPUT-ptcp--dport853-jACCEPT
iptables-AINPUT-pudp--dport853-jACCEPT
iptables-AINPUT-ptcp--dport850-jACCEPT
iptables-AINPUT-pudp--dport850-jACCEPT
以上做法在你重启系统后将失效,因为ypbind会重新指派端口。
我们有两种解决方法:
1.为NIS使用静态IP地址
2.每次系统启动时调用脚本获得NIS相关端口,并根据上述iptables规则添加到filter表中去。
允许来自指定网络的rsync连接请求
你可能启用了rsync服务,但是又不想让rsync暴露在外,只希望能够从内部网络(192.168.101.0/24)访问即可:
iptables-AINPUT-ieth0-ptcp-s192.168.101.0/24--dport873-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport873-mstate--stateESTABLISHED-jACCEPT
允许来自指定网络的MySQL连接请求
你可能启用了MySQL服务,但只希望DBA与相关开发人员能够从内部网络(192.168.100.0/24)直接登录数据库:
iptables-AINPUT-ieth0-ptcp-s192.168.100.0/24--dport3306-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport3306-mstate--stateESTABLISHED-jACCEPT
允许Sendmail,Postfix邮件服务
邮件服务都使用了25端口,我们只需要允许来自25端口的连接请求即可。
iptables-AINPUT-ieth0-ptcp--dport25-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport25-mstate--stateESTABLISHED-jACCEPT
允许IMAP与IMAPS
#IMAP:
143
iptables-AINPUT-ieth0-ptcp--dport143-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport143-mstate--stateESTABLISHED-jACCEPT
#IMAPS:
993
iptables-AINPUT-ieth0-ptcp--dport993-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport993-mstate--stateESTABLISHED-jACCEPT
允许POP3与POP3S
#POP3:
110
iptables-AINPUT-ieth0-ptcp--dport110-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport110-mstate--stateESTABLISHED-jACCEPT
#POP3S:
995
iptables-AINPUT-ieth0-ptcp--dport995-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport995-mstate--stateESTABLISHED-jACCEPT
防止DoS攻击
iptables-AINPUT-ptcp--dport80-mlimit--limit25/minute--limit-burst100-jACCEPT
∙-mlimit:
启用limit扩展
∙–limit25/minute:
允许最多每分钟25个连接
∙–limit-burst100:
当达到100个连接后,才启用上述25/minute限制
三、转发与NAT
允许路由
如果本地主机有两块网卡,一块连接内网(eth0),一块连接外网(eth1),那么可以使用下面的规则将eth0的数据路由到eht1:
iptables-AFORWARD-ieth0-oeth1-jACCEPT
DNAT与端口转发
以下规则将会把来自422端口的流量转发到22端口。
这意味着来自422端口的SSH连接请求与来自22端口的请求等效。
#1.启用DNAT转发
iptables-tnat-APREROUTING-ptcp-d192.168.102.37--dport422-jDNAT--to-destination192.168.102.37:
22
#2.允许连接到422端口的请求
iptables-AINPUT-ieth0-ptcp--dport422-mstate--stateNEW,ESTABLISHED-jACCEPT
iptables-AOUTPUT-oeth0-ptcp--sport422-mstate--stateESTABLISHED-jACCEPT
假设现在外网网关是xxx.xxx.xxx.xxx,那么如果我们希望把HTTP请求转发到内部的某一台计算机,应该怎么做呢?
iptables-tnat-APREROUTING-ptcp-ieth0-dxxx.xxx.xxx.xxx--dport8888-jDNAT--to192.168.0.2:
80
iptables-AFORWARD-ptcp-ieth0-d192.168.0.2--dport80-jACCEPT
当该数据包到达xxx.xxx.xxx.xxx后,需要将该数据包转发给192.168.0.2的80端口,事实上NAT所做的是修改该数据包的目的地址和目的端口号。
然后再将该数据包路由给对应的主机。
但是iptables会接受这样的需要路由的包么?
这就由FORWARD链决定。
我们通过第二条命令告诉iptables可以转发目的地址为192.168.0.2:
80的数据包。
再看一下上例中422端口转22端口,这是同一IP,因此不需要设置FORWARD链。
SNAT与MASQUERADE
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去:
iptables-tnat-APOSTROUTING-s10.8.0.0/24-oeth0-jsnat--to-source192.168.5.3
对于snat,不管是几个地址,必须明确的指定要snat的IP。
假如我们的计算机使用ADSL拨号方式上网,那么外网IP是动态的,这时候我们可以考虑使用MASQUERADE
iptables-tnat-APOSTROUTING-s10.8.0.0/255.255.255.0-oeth0-jMASQUERADE
负载平衡
可以利用iptables的-mnth扩展,及其参数(–counter0–every3–packetx),进行DNAT路由设置(-APREROUTING-jDNAT–to-destination),从而将负载平均分配给3台服务器:
iptables-APREROUTING-ieth0-ptcp--dport443-mstate--stateNEW-mnth--counter0--every3--packet0-jDNAT--to-destination192.168.1.101:
443
iptables-APREROUTING-ieth0-ptcp--dport443-mstate--stateNEW-mnth--counter0--every3--packet1-jDNAT--to-destination192.168.1.102:
443
iptables-APREROUTING-ieth0-ptcp--dport443-mstate--stateNEW-mnth--counter0--every3--packet2-jDNAT--to-destination192.168.1.103:
443
自定义的链
记录丢弃的数据包
#1.新建名为LOGGING的链
iptables-NLOGGING
#2.将所有来自INPUT链中的数据包跳转到LOGGING链中
iptables-AINPUT-jLOGGING
#3.指定自定义的日志前缀"IPTablesPacketDropped:
"
iptables-ALOGGING-mlimit--limit2/min-jLOG--log-prefix"IPTablesPacketDropped:
"--log-level7
#4.丢弃这些数据包
iptables-ALOGGING-jDROP
References:
[1] 25MostFrequentlyUsedLinuxIPTablesRulesExamples
[2] iptables:
SNAT,DNAT,MASQUERADE的联系与区别
一、iptables的表与链
iptables具有Filter,NAT,Mangle,Raw四种内建表:
1.Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
∙INPUT链 –处理来自外部的数据。
∙OUTPUT链 –处理向外发送的数据。
∙FORWARD链 –将数据转发到本机的其他网卡设备上。
2.NAT表
NAT表有三种内建链:
∙PREROUTING链 –处理刚到达本机并在路由转发前的数据包。
它会转换数据包中的目标IP地址(destinationipaddress),通常用于DNAT(destinationNAT)。
∙POSTROUTING链 –处理即将离开本机的数据包。
它会转换数据包中的源IP地址(sourceipaddress),通常用于SNAT(sourceNAT)。
∙OUTPUT链 –处理本机产生的数据包。
3.Mangle表
Mangle表用于指定如何处理数据包。
它能改变TCP头中的QoS位。
Mangle表具有5个内建链:
∙PREROUTING
∙OUTPUT
∙FORWARD
∙INPUT
∙POSTROUTING
4.Raw表
Raw表用于处理异常,它具有2个内建链:
∙PREROUTINGchain
∙OUTPUTchain
5.小结
下图展示了iptables的三个内建表:
图:
IPTables内建表
二、IPTABLES规则(Rules)
牢记以下三点式理解iptables规则的关键:
∙Rules包括一个条件和一个目标(target)
∙如果满足条件,就执行目标(target)中的规则或者特定值。
∙如果不满足条件,就判断下一条Rules。
目标值(TargetValues)
下面是你可以在target里指定的特殊值:
∙ACCEPT –允许防火墙接收数据包
∙DROP –防火墙丢弃包
∙QUEUE –防火墙将数据包移交到用户空间
∙RETURN –防火墙停止执行当前链中的后续Rules,并返回到调用链(thecallingchain)中。
如果你执行iptables--list你将看到防火墙上的可用规则。
下例说明当前系统没有定义防火墙,你可以看到,它显示了默认的filter表,以及表内默认的input链,forward链,output链。
#iptables-tfilter--list
ChainINPUT(policyACCEPT)
targetprotoptsourcedestination
ChainFORWARD(policyACCEPT)
targetprotoptsourcedestination
ChainOUTPUT(policyACCEPT)
targetprotoptsourcedestination
查看mangle表:
#iptables-tmangle--list
查看NAT表:
#iptables-tnat--list
查看RAW表:
#iptables-traw--list
/!
\注意:
如果不指定-t选项,就只会显示默认的filter表。
因此,以下两种命令形式是一个意思:
#iptables-tfilter--list
(or)
#iptables--list
以下例子表明在filter表的input链,forward链,output链中存在规则:
#iptables--list
ChainINPUT(policyACCEPT)
numtargetprotoptsourcedestination
1RH-Firewall-1-INPUTall--0.0.0.0/00.0.0.0/0
ChainFORWARD(policyACCEPT)
numtargetprotoptsourcedestination
1RH-Firewall-1-INPUTall--0.0.0.0/00.0.0.0/0
ChainOUTPUT(policyACCEPT)
numtargetprotoptsourcedestination
ChainRH-Firewall-1-INPUT(2references)
numtargetprotoptsourcedestination
1ACCEPTall--0.0.0.0/00.0.0.0/0
2ACCEPTicmp--0.0.0.0/00.0.0.0/0icmptype255
3ACCEPTesp--0.0.0.0/00.0.0.0/0
4ACCEPTah--0.0.0.0/00.0.0.0/0
5ACCEPTudp--0.0.0.0/0224.0.0.251udpdpt:
5353
6ACCEPTudp--0.0.0.0/00.0.0.0/0udpdpt:
631
7ACCEPTtcp--0.0.0.0/00.0.0.0/0tcp