广为人知的iptables命令行
Netfilter作为Linux内置的主机防火墙,它可以使用iptables命令处理IPv4协议,也可以使用ip6tables命令处理IPv6协议。在iptables之前,Linux 2.2中使用ipchains来配置防火墙,Linux 2.0中则使用ipfwadm,它基于BSD的ipfw命令实现。
以下命令在RHEL 6.x上执行通过,但也适用于其他Linux发行版。
1.显示防火墙的状态
以root权限运行下面的命令:
- #iptables-L-n-v
参数说明:
如果希望输出的结果中显示行号,可以运行:
- #iptables-L-n-v--line-nmubers
这样,就可以按照行号在防火墙中添加、删除规则。
要显示输入或输出链规则,可以运行:
- #iptables-LINPUT-n-v
- #iptables-LOUTPUT-n-v--line-numbers
2.停止、开启和重启防火墙
如果你使用的是RHEL/Fedora/CentOS系统,可以运行:
- #serviceiptablesstop
- #serviceiptablesstart
- #serviceiptablesrestart
我们也可以使用iptables命令停止防火墙并删除所有规则:
- #iptables-F
- #iptables-X
- #iptables-tnat-F
- #iptables-tnat-X
- #iptables-tmangle-F
- #iptables-tmangle-X
- #iptables-PINPUTACCEPT
- #iptables-POUTPUTACCEPT
- #iptables-PFORWARDACCEPT
参数说明:
3.删除防火墙规则
以带行号的形式显示已有的防火墙规则,请运行:
- #iptables-LINPUT-n--line-numbers
- #iptables-LOUTPUT-n--line-numbers
- #iptables-LOUTPUT-n--line-numbers|less
- #iptables-LOUTPUT-n--line-numbers|grep202.54.1.1
下面我们使用行号删除规则:
- #iptables-DINPUT4
将IP地址202.54.1.1从规则中删除:
- #iptables-DINPUT-s202.54.1.1-jDROP
参数说明:
4.插入防火墙规则
首先运行下面的命令:
- #iptables-LINPUT-n--line-numbers
得到运行结果:
- ChainINPUT(policyDROP)
- numtargetprotoptsourcedestination
- 1DROPall--202.54.1.10.0.0.0/0
- 2ACCEPTall--0.0.0.0/00.0.0.0/0
在行1和行2之间插入规则:
- #iptables-IINPUT2-s202.54.1.2-jDROP
查看更新后的规则,会发现插入成功,下面是示例:
- ChainINPUT(policyDROP)
- Numtargetprotoptsourcedestination
- 1DROPall--202.54.1.10.0.0.0/0
- 2DROPall--202.54.1.20.0.0.0/0
- 3ACCEPTall--0.0.0.0/00.0.0.0/0
5.保存防火墙规则
在RHEL/Fedora/CentOS Linux下,可以使用下面的命令保存防火墙规则:
- #serviceiptablessave
在其它Linux发行版(如Ubuntu)上,可以使用iptables-save命令保存防火墙规则:
- #iptables-save>/root/my.active.firewall.rules
- #cat/root/my.active.firewall.rules
6.重新加载防火墙规则
我们可以使用iptables-restore命令重新加载使用iptables-save命令保存的防火墙规则:
- #iptables-restore</root/my.active.firewall.rules
我们还可以利用这种特性来快速部署防火墙规则。
7.设置默认防火墙策略
我们首先来配置一个防火墙策略,它默认丢弃所有的网络数据包:
- #iptables-PINPUTDROP
- #iptables-POUTPUTDROP
- #iptables-PFORWARDDROP
- #iptables-L-v-n
- #连接失败,因为防火墙丢弃所有的网络数据包
- #pingcyberciti.biz
- #wgethttp://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2
在此基础上,我们只关闭入站连接:
- #iptables-PINPUTDROP
- #iptables-PFORWARDDROP
- #iptables-POUTPUTACCEPT
- #iptables-AINPUT-mstate--stateNEW,ESTABLISHED-jACCEPT
- #iptables-L-v-n
- #ping和wget可以正常工作
- #pingcyberciti.biz
- #wgethttp://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2
8.在公网网络接口上停用私有网络地址
我们可以从公网网络接口上删除私有IPv4网段,以防止IP欺骗。运行下面的命令,没有源路由地址的数据包会被丢弃:
- #iptables-AINPUT-ieth1-s192.168.0.0/24-jDROP
- #iptables-AINPUT-ieth1-s10.0.0.0/8-jDROP
下面是私有网络IPv4地址范围,请确认在公网接口予以屏蔽:
9.屏蔽IP地址访问
如果我们想屏蔽一个IP地址,比如1.2.3.4,可以运行:
- #iptables-AINPUT-s1.2.3.4-jDROP
- #iptables-AINPUT-s192.168.0.0/24-jDROP
10.屏蔽入栈端口请求
如果我们想80端口上屏蔽所有的服务请求,可以运行:
- #iptables-AINPUT-ptcp--dport80-jDROP
- #iptables-AINPUT-ieth1-ptcp--dport80-jDROP
只想屏蔽IP地址1.2.3.4对80端口的请求,可以运行:
- #iptables-AINPUT-ptcp-s1.2.3.4--dport80-jDROP
- #iptables-AINPUT-ieth1-ptcp-s192.168.1.0/24--dport80-jDROP
11.屏蔽出栈IP地址
现在我们来演示如何屏蔽对主机名和IP地址的出栈访问。
首先,我们来获取一个域名的IP地址:
- #host-tacyberciti.biz
输出示例:
- cyberciti.bizhasaddress75.126.153.206
要屏蔽访问域名cyberciti.biz的网络数据包,可以运行:
- #iptables-AOUTPUT-d75.126.153.206-jDROP
下面是使用子网掩码的示例:
- #iptables-AOUTPUT-d192.168.1.0/24-jDROP
- #iptables-AOUTPUT-oeth1-d192.168.1.0/24-jDROP
下面我们以屏蔽facebook.com为例,进行说明。首先,我们需要facebook的所有IP地址:
- #host-tawww.facebook.com
示例输出:
- www.facebook.comhasaddress69.171.228.40
找出IP地址69.171.228.40的CIDR:
- #whois69.171.228.40|grepCIDR
示例输出:
- CIDR:69.171.224.0/19
现在我们来阻止对facebook.com的访问:
- #iptables-AOUTPUT-ptcp-d69.171.224.0/19-jDROP
我们也可以直接屏蔽域名:
- #iptables-AOUTPUT-ptcp-dwww.facebook.com-jDROP
- #iptables-AOUTPUT-ptcp-dfacebook.com-jDROP
12.记录并丢弃数据包
在公网网络接口上记录并丢弃IP地址欺骗数据包:
- #iptables-AINPUT-ieth1-s10.0.0.0/8-jLOG--log-prefix"IP_SPOOFA:"
- #iptables-AINPUT-ieth1-s10.0.0.0/8-jDROP
默认情况下日志记录在/var/log/messages文件中:
- #tail-f/var/log/messages
- #grep--color'IPSPOOF'/var/log/messages
我们还可以用-m参数对日志记录进行限制,以防止日志文件过度膨胀。
- #iptables-AINPUT-ieth1-s10.0.0.0/8-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"IP_SPOOFA:"
- #iptables-AINPUT-ieth1-s10.0.0.0/8-jDROP
13.根据MAC地址允许或阻止数据包的传入
我们可以根据MAC地址允许或阻止数据包的传入:
- #iptables-AINPUT-mmac--mac-source00:0F:EA:91:04:08-jDROP
14.屏蔽ICMP ping请求
我们可以通过允许下面的命令屏蔽ping请求:
- #iptables-AINPUT-picmp--icmp-typeecho-request-jDROP
- #iptables-AINPUT-ieth1-picmp--icmp-typeecho-request-jDROP
也可以按照特定的网段和主机限制ping请求:
- #iptables-AINPUT-s192.168.1.0/24-picmp--icmp-typeecho-request-jACCEPT
以下命令只接受受限制的ping请求:
- #假定默认INPUT策略为丢弃数据包
- #iptables-AINPUT-picmp--icmp-typeecho-reply-jACCEPT
- #iptables-AINPUT-picmp--icmp-typedestination-unreachable-jACCEPT
- #iptables-AINPUT-picmp--icmp-typetime-exceeded-jACCEPT
- #所有的服务器都对ping请求作出应答
- #iptables-AINPUT-picmp--icmp-typeecho-request-jACCEPT
15.开启端口序列
下面的命令可以允许7000到7010范围内的TCP端口访问:
- #iptables-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7000:7010-jACCEPT
16.允许一系列IP地址访问
下面的命令可以允许IP地址范围
- #运行IP地址范围192.168.1.100到192.168.1.200访问80端口
- #iptables-AINPUT-ptcp--destination-port80-miprange--src-range192.168.1.100-192.168.1.200-jACCEPT
- #NAT示例
- #iptables-tnat-APOSTROUTING-jSNAT--to-source192.168.1.20-192.168.1.25
17.建立连接并重启防火墙
当重启iptables服务时,它会断开所有已建立的连接。这是因为在重启防火墙时,会卸载IPTABLES_MODULES_UNLOAD模块。
要解决这个问题,可以编辑/etc/sysconfig/iptables-config
- IPTABLES_MODULES_UNLOAD=no
18.使用Crit日志级别
- #iptables-AINPUT-s1.2.3.4-ptcp--destination-port80-jLOG--log-levelcrit
19.屏蔽或开启常见端口
屏蔽或开启常用的TCP、UDP端口:
- #可以使用DROP替换ACCEPT,实现端口屏蔽。
- #打开22端口(SSH)
- #iptables-AINPUT-mstate--stateNEW-mtcp-ptcp--dport22-jACCEPT
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport22-jACCEPT
- #打开TCP/UDP631端口(打印服务)
- #iptables-AINPUT-s192.168.1.0/24-pudp-mudp--dport631-jACCEPT
- #iptables-AINPUT-s192.168.1.0/24-ptcp-mtcp--dport631-jACCEPT
- #打开123端口,允许局域网用户进行NTP时间同步
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-pudp--dport123-jACCEPT
- #打开25端口(SMTP)
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport25-jACCEPT
- #打开DNS端口
- #iptables-AINPUT-mstate--stateNEW-pudp--dport53-jACCEPT
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport53-jACCEPT
- #打开http/https端口
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport80-jACCEPT
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport443-jACCEPT
- #打开TCP110端口(POP3)
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport110-jACCEPT
- #打开TCP143端口
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport143-jACCEPT
- #为局域网用户开启Samba访问
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport137-jACCEPT
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport138-jACCEPT
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport139-jACCEPT
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport445-jACCEPT
- #为局域网用户开启代理服务器访问
- #iptables-AINPUT-s192.168.1.0/24-mstate--stateNEW-ptcp--dport3128-jACCEPT
- #为局域网用户开启MySQL访问
- #iptables-IINPUT-ptcp--dport3306-jACCEPT
20.限制客户端IP的并发连接数
我们可以使用connlimit模块限制客户端IP的并发连接数。下面的命令允许每个客户端只能并发3个ssh连接:
- #iptables-AINPUT-ptcp--syn--dport22-mconnlimit--connlimit-above3-jREJECT
设置HTTP并发连接为20个:
- #iptables-ptcp--syn--dport80-mconnlimit--connlimit-above20--connlimit-mask24-jDROP
参数说明:
更好的使用iptables
首先,我们要学会查看man手册:
- $maniptables
我们还可以这样查看帮助:
- #iptables-h
我们还可以查看特定命令的帮助:
- #iptables-jDROP-h
测试防火墙
测试端口是否开放:
- #netstat-tulpn
测试TCP80端口是否开放:
- #netstat-tulpn|grep:80
如果80端口未开放,请确保启动Apache服务器:
- #servicehttpdstart
并确保打开iptables防火墙80端口:
- #iptables-LINPUT-v-n|grep80
如果80端口没有开放,可以运行下面的命令:
- #iptables-AINPUT-mstate--stateNEW-ptcp--dport80-jACCEPT
- #serviceiptablessave
下面使用telnet命令测试是否可以连接到80端口:
- $telnetwww.cyberciti.biz80
下面是示例输出:
- Trying75.126.153.206...
- Connectedtowww.cyberciti.biz.
- Escapecharacteris'^]'.
- ^]
- telnet>quit
- Connectionclosed.
最后,我们也推荐使用嗅探工具(如tcpdump、ngrep)对防火墙设置进行测试。
以上只是一些基本的防火墙配置策略,如果你想构造更复杂的防火墙策略,需要对TCP/IP和Linux内核配置文件sysctl.conf进行更深入的学习。(张志平/编译)