iptables的安装与配置
iptables默认已经安装好了,可以使用rpm -qa命令查看默认安装了哪些软件
自动加载iptables服务
也可以使用ntsysv命令,利用文本图形对iptables自动加载进行配置
iptables命令
如果想灵活运用iptables来加固系统安全,就必须熟练掌握iptables的语法格式。格式如下:
iptables 【-t表】 -命令 -匹配 -j动作/目标
1.表选项
-t参数用来指定规则表。内置规则表有三个,分别是:nat、mangle和filter。如果没有指定规则表,则默认使用filter表。各个规则表的功能上已在上节详细讲述过,这里小编就不再重复。
2.命令选项
命令选项用于指定iptables的执行方式,即提交的规则要做什么操作,包括插入规则、删除规则和添加规则等
命令 说明
-A,--append 添加一条规则到某个规则链中,并且该规则将会成为规则链中的最后一条规则。例如,iptables -A INPUT...
-D,--delete 从某个规则中删除一条规则。例如,iptables -D INPUT --dport 80 -j DROP iptables -D INPUT 1
-R,--replace 取代现行的规则,规则被取代后不改变其顺序。例如,iptables -R INPUT1 -s 192.168.0.1 -j DROP
-I,--insert 插入一条规则,原本该位置上的规则将会往后移动一个顺位。例如,iptables -I INPUT 1 --dport 80 -j ACCEPT
-L,list 列出某规则中的所有规则,例如,iptables -L INPUT
-F,--flush 删除某规则中的所有规则。例如,iptables -F INPUT
-Z,--zero 将封包计数器归零。例如,iptables -Z INPUT
-N,--new-chain 定义新的规则链。例如,iptables -N tcp_allowed
-X,--delete-chain 删除某个规则链。例如,iptables -X tcp_allowed
-P,--policy 定义过滤策略。例如,iptables -P INPUT DROP
-E,--rename-chain 修改自定义规则链的名称。例如,iptables -E tcp_allowed disallowed
-P或--policy
作用:定义过滤策略,所有不符合规则的包都被强制使用这个策略
iptables -t filter -P INPUT DROP
说明:只有内建的链才可以使用规则
-A或--append
作用:在选择的链的最后添加一条规则
iptables -A OUTPUT --sport 22 DROP
-D或--delete
作用:从所选链中删除规则
iptables -D OUTPUT
说明:删除规则的时候可以把规则完整写出来进行删除,就像创建规则时一样,但是更快的方法是指定规则在所选链中的序号。
3.匹配选项
匹配选项指定需要过滤的数据包所具备的条件。即在过滤数据包的时候,iptables根据什么来判断是否允许数据包通过。与规则匹配所应具有的特征包括源地址、目的地址、传输协议和端口号等。
在TCP/IP的网络环境里,大多数数据包所使用的协议不是TCP类型就是UDP类型或ICMP类型。例如ping所使用的就是ICMP协议。匹配选项如下:
匹配 说明
-p --protocol 匹配数据包通信的协议类型。如果要匹配所有类型,则可以使用all关键词。例如,-p all
-s,--src,--source 匹配数据包的源ip地址。例如:-s 192.168.0.0/24,也可以使用“!”运算字进行反向比对,例如,-s ! 192.168.0.0/24
-d,--dst, --destination 匹配数据包的目的ip地址。例如,iptables -A INPUT -d 192.168.1.1
-i,--in --interface 匹配数据包是从哪片网卡进入的,可以使用通配字符+来做大范围比对,例如:-i eth+表示所有的Ethernet网卡。也可以使用!运算字符进行反向比对,例如,-i ! eth0
-o,--out -interface 匹配数据包要从哪片网卡发送。例如,iptables -A FORWARD -o eth0
--sport,--source-port 匹配数据包的源端口,可以设置一个端口,或是一个范围,例如:--sport22:80,表示22~80端口都算符合条件,如果要比对不连续的多个端口,则必须使用--multiport参数
--dport,--destination-port 匹配数据包的目的端口号。例如,iptables -A INPUT -p tcp --dport 22
--tcp-flags 匹配TCP数据包的状态标志位。例如,iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
--syn 匹配是否为要求联机的tcp数据包,与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN的作用完全相同。例如,iptables -p tcp --syn
-mmultiport--source-port 匹配不连续的多个源端口号,一次最多可以匹配15个端口。例如,iptables -A INPUT -p tcp -m mutiport --source-port 22,53,80,110
-mmultiport--destination-port 匹配不连续的多个目的源端口号。例如,iptables -A INPUT -p tcp -m multiport -destination-port 22,53,80,110
-m multiport --port 匹配源端口号和目的端口号相同的数据包。例如,iptables -A INPUT -p tcp -m multiport --port 22,56,80,110
--icmp-type 匹配icmp的类型编号,可以使用代码或数字编号来进行比对。例如,iptables -A INPUT -p imcp -icmp-type 8
-m limit --limit 匹配某些时间内数据包的平均流量(单位时间为秒)。例如,iptables -A INPUT -m limit --limit 3/hour
--limit-burst 匹配瞬间大量数据包的数量。例如,iptables -A INPUT -m limit--limit-burst5
-m mac --mac-source 匹配数据包源网络接口的硬件地址,这个参数不能用在OUTPUT和Postrouting规则链上,这是因为数据包要送出网卡后,才能由网卡驱动程序通过ARP协议查出目的地的Mac地址。例如,iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
--mark 匹配数据包是否被表示某个号码,当数据包被匹配成功时,可以通过mark处理动作,将该数据包标识一个号码,不能超过4294967296.例如,iptables -t mangle -A INPUT -m mark --mark 1
-m owner --uid -owener 匹配来自本机的数据包,是否为某些特定使用者产生的,这样可以避免服务器使用root或其它身份将敏感数据传送出去。例如,iptables -A OUTPUT -m owner --uid-owner 500
-m owner --gid-owner 匹配来自本机的数据包,是否为某特定使用者群组所产生的,这样可以避免服务器使用root或其它身份将敏感数据传送出去。例如,iptables -A OUTPUT -m owner --gid-owner 0
-m owner --pid-owner 匹配来自本机的数据包,是否为某些特定行程所产生的。例如,iptables -A OUTPUT -m owner --pid-owner 78
-m owner --sid-owner 匹配来自本机的数据包,是否为某特定联机(Session ID)的响应封包,例如,iptables -A OUTPUT -m owner --sid-owner 100
-m state --state 匹配联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW和RELATED。INVALID表示该数据包的联机编号(Session ID)无法辨识或编号不正确。ESTABLISHED表示该数据包属于某个已经建立的联机。NEW表示该数据包要起始一个联机。RELATED表示该数据包属于某个已经建立的联机所建立的新联机。例如,iptables -A INPUT -mstate--state RELATED,ESTABLISHED
-p或--protocol
作用:匹配指定的协议
iptables -A INPUT -p udp -j DROP
说明:设置协议对应的整数值。如,ICMP的值是1,TCP是6,UDP是17.默认设置为ALL,相应数是0,仅代表匹配TCP、UDP和ICMP协议。
-sport或--source-port
作用:基于TCP包的源端口进行匹配,即通过检测数据包的源端口是否所指定的端口来判断数据包的去留。
iptables -A INPUT -sport 80 j ACCEPT
说明:如果不指定此项,则表示针对所有端口。
-s或--src或-source
作用:以IP地址匹配包
iptables -A INPUT -s 1.1.1.1 -j DROP
说明:在地址前加英文感叹号表示取反,要注意空格。如-s! 192.168.0.0/24表示除此以外的所有地址。
4.动作选项
动作选项确定将如何处理符合条件的数据包,其中最为基本的选项有:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK。
(1)ACCEPT
作用:允许符合条件的数据包通过。即接收这个数据包,允许它去往目的地。
(2)DROP
作用:拒绝符合条件的数据包通过,即丢弃该数据包
(3)REJECT
作用:REJECT和DROP都会将数据包丢弃,区别在于REJECT除了丢弃数据包外,还向发送者返回错误信息。
(4)SNAT
作用:进行源网络地址转换,即更换数据包的源IP地址。网络地址转换是一个常用的功能,后面会详细说明。
说明:SNAT只能用在nat表的POSTROUTING链里,只要连接中有一个符合条件的包被执行了此动作,那么这个链接的其他数据包都会自动执行此动作。
(5)DNAT
作用:与SNAT对应,将目的网络地址进行转换,也就是更换数据包的目的IP地址。
说明:DNAT只能用在nat表的PREROUTING和OUTPUT链中,或者用在被这两条链调用的链中,包含DANT的链不能被除此之外的其它链调用,如POSTROUTING。
(6)LOG
作用:用来记录数据包的相关信息,用来帮助排除错误。LOG会返回数据包的有关细节,如IP地址等。
(7)MASQUERADE
作用:和SNAT的作用基本相同,区别在于它不需要指定“--to-source”。MASQUERADE是专门设计用于需要动态获取IP地址的连接的。比如,拨号上网、DHCP等。
防火墙的配置
设置默认策略
在iptables中,所有的内置链都会有一个默认策略。当通过iptables的数据包不符合链中的任何一条规则时,则按默认策略来处理数据包。
定义默认策略的格式如下:
iptables [-t表名] -P 链名 动作
将filter 表中INPUT链的默认策略定义为DROP(丢弃数据包)
iptables -P INPUT -j DROP
将nat表中OUTPUT链的默认策略定义为ACCEPT(接收数据包)
iptables -t nat -P OUTPUT -j ACCEPT
查看iptables规则
查看iptables规则的格式如下:
iptables [-t 表名]- L 链名
查看nat表中所有链的规则
#iptables -t nat -L
chain PREOUTING (policy ACCEPT)
target prot opt source destination
chain PREOUTING (policy ACCEPT)
target prot opt source destination
chain OUTPUT (policy ACCEPT)
target prot opt source destination
查看filter表中FORWARD链的规则
#iptables -L FORWARD
chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-l-INPUT all-- anywhere anywhere
添加、删除、修改规则
为filter表的INPUT链添加一条规则,拒绝所有使用ICMP协议的数据包
#iptables -A INPUT -p icmp -j DROP
查看规则表:
#iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-l-INPUT all -- anywhere anywhere
DROP icmp -- anywhere anywhere
为filter表的INPUT链添加一条规则,允许访问TCP协议的80端口的数据包通过,并查看规则列表:
#iptables -A INPUT -p tcp -- dport 80 -j ACCEPT
#iptables -L INPUT
Chain INPUT(policy ACCEPT)
target prot opt source destination
RH-Firewall-l-INPUT all -- anywhere anywhere
DROP icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:http
在filter表中INPUT链的第2条规则前插入一条新规则,不允许访问TCP协议的53端口的数据包通过。
#iptables -l INPUT 2 -p tcp -- dport 53 -j DROP
#iptables -L INPUT
Chain INPUT(policy ACCEPT)
target prot opt source destination
RH-Firewall-l-INPUT all -- anywhere anywhere
DROP tcp -- anywhere anywhere tcp dpt:domain
DROP icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:http
在filter表中INPUT链的第一条规则前插入一条新规则,允许访问IP地址172.16.0.0/16网段的数据包通过。
#iptables -I INPUT -s 172.16.0.0/16 -j ACCEPT
#iptables -L INPUT
Chain INPUT(policy ACCEPT)
target prot opt source destination
ACCEPT all -- 172.16.0.0/16 anywhere
RH-Firewall-l-INPUT all -- anywhere anywhere
DROP tcp -- anywhere anywhere tcp dpt:domain
DROP icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:http
删除filter表中INPUT链的第二条规则
#iptables -D INPUT -p icmp -j DROP
#iptables -L INPUT
Chain INPUT(policy ACCEPT)
target prot opt source destination
ACCEPT all -- 172.16.0.0/16 anywhere
RH-Firewall-l-INPUT all -- anywhere anywhere
DROP tcp --anywhere anywhere tcp dpt :domain
ACCEPT tcp -- anywhere anywhere tcp dpt:http
清除filter表内INPUT链的所有规则
#iptables -F INPUT
#iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
保存规则与恢复
iptables-save用来保存规则,它的用法比较简单,格式如下:
iptables-save [-c] [-t 表名]
其中:
-c:保存包和字节计数器的值,使得在重启防火墙后不丢失对包的字节的统计。
-t:选择保存那张表的规则,如果没有-t参数则保存所有的表。
#iptables-save
其中:“*”是表的名字,它后面是该表中的规则集。可以使用重定向命令来保存这些规则集,如下所示。
#iptables-save > /etc/iptables-save
Iptables-restore用来装载由iptables保存的规则集。格式如下:
Iptables-restore [-c] [-n]
其中:
-c:装入包和字节计数器
-n:不覆盖已有的表或表内的规则。默认情况是清除所有已存在的规则。
使用重定向来恢复由iptables-save保存的规则集,如下所示
#iptables-restore >/etc/iptables-save
说明:所有的添加、删除、修改都是临时生效,重新启动系统后,将恢复成原有的配置。如果想使所做的修改在重启系统后生效,则可以使用以下命令来保存。
#iptables-restore > /etc/iptables-save
#service iptables save
禁止客户机访问某些网站
由于网络上有很多不安全的站点,为了使网络更为安全,有必要禁止客户机访问某些网站。通过iptables可以使用域名或IP地址来禁止访问指定的网站。
禁止所有学生访问IP地址为192.1.2.3的网站。
#iptables -A FORWARD -d 192.1.2.3 -j DROP
#iptables -L FORWARD
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-l-INPUT all -- anywhere anywhere
DROP all -- anywhere 192.1.2.3
禁止所有学生访问域名为www.xxx.com的网站
#iptables -A FORWARD -d www.xxx.com -j DROP
禁止客户机使用QQ
有时,需要禁止客户机使用QQ。如在上班时间禁止公司员工上QQ聊天,或在学校上课时间禁止学生上QQ等。要封锁QQ,只要知道QQ使用的服务器地址和端口号就可以了。QQ使用的服务器地址和端口可以从QQ的安装目录下找到。进入QQ安装目录,使用记事本或其它编辑器打开以QQ号码命名子目录下的config.db文件,在该文件中即可看到QQ使用的服务器的地址和端口号。
在config.db文件中找到QQ服务所使用的地址和端口号。QQ通常使用的TCP或UDP协议的8000端口,有些新版的QQ可能使用TCP的的80端口服务器的IP地址,这些服务所对应域名分别为tcpconn.tencent.com、tcpconn2.tencent.com、tcpconn3.tencent.com和tcpconn4.tencent.com。此外,还有VIP会员使用的服务器http.tencent.com和http2.tencent.com。输入的具体命令如下所示。
#iptables -I FORWARD -p tcp -- dport 8000 -j DROP
#iptables -I FORWARD -p udp -- dport 8000 -j DROP
#iptables -I FORWARD -d tcpconn.tencent.com -j DROP
#iptables -I FORWARD -d tcpconn2.tencent.com -j DROP
#iptables -I FORWARD -d tcpconn3.tencent.com -j DROP
#iptables -I FORWARD -d tcpconn4.tencent.com -j DROP
#iptables -I FORWARD -d http.tencent.com -j DROP
#iptables -I FORWARD -d http2.tencent.com -j DROP
网络地址转换
iptables利用nat表,将内网地址与外网地址进行转换,可完成内外网的通信。nat表支持以下3中操作。
(1)SNAT:改变数据包的源地址,防火墙会使用外部地址,替换数据包的本地网络地址,是网络内部主机能够与网络外部通信。
(2)DNAT:改变数据包的目的地址。防火墙接收到数据包后,会将该包目的地址进行替换,重新转发到网络内部的主机。当应用服务器处于网络内部时,防火墙接收到外部的请求,会按照规则设定,将访问重定向到指定的主机上,使外部的主机能够正常访问内部的主机。
(3)MASQUERADE:与SNAT一样,但主要用于ISP随机分配的接入外网的地址是不固定的地址的情况。
配置SNAT
SNAT的功能是进行源IP地址转换,也就是重写数据包的源IP地址。若网络内部主机采用共享方式,访问Internet连接时,就需要用到SNAT的功能,将本地IP地址,替换为公网的合法IP地址。
SNAT只能在nat表的POSTROUTING链,并且只要连接的第一个符合条件的包被SNAT进行地址转换,那么这个链接的其他所有的包都会自动地完成地址替换工作,而且这个规则还会应用于这个链接的其它数据包。格式如下:
iptables -t nat -A POSTROUTING -o 网络节后 -j SNAT --to-source IP地址
指定替换的IP地址和端口有以下几种方式:
(1)指定单独的地址。如:202.3.2.1
(2)一段连续的地址范围。如202.3.2.1~202.3.2.11,这样会为数据包随机分配一个IP地址,以实现负载均衡。
(3)端口范围。在指定-p tcp或-p udp 的前提下,可以指定源端口的范围,如202.3.2.11:1024-10000,这样包的源端口就被限制在1024~10000之内了。
学院内部主机使用10.0.0.0/8网段的IP地址,并且使用linux主机作为服务器连接网络,外网为固定地址192.168.1.3.现在需要修改相关设置保证内网用户能够正常访问Internet
1.开启内核路由转发功能
在内核里打开IP转发功能,如下所示
#echo 1 >/proc/sys/net/ipv4/ip_forward
2.添加SNAT规则
设置规则,将数据包的源地址改为公网地址,如下所示。
#iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to -source 192.168.1.3
#service iptables save
将当前规则保存到 /etc/sysconfig/iptables: [确定]
防火墙配置完成后,还要对网络内部客户机添加网关以及DNS服务器地址,才可以正常访问Internet。
配置DNAT
DNAT能够完成目的网络地址的转换。如,企业web服务器在网络内部,其使用私有网络地址,不能在Internet上使用合法IP地址,互联网的其它主机是无法与其直接通信的。使用DNAT,防火墙的80端口接收数据包后,通过转换数据包的目的地址,信息就会转发给内部网络的web服务器
DNAT需要在nat表的PREROUTING链中设置,参数为--to-destination.格式如下:
iptables -t nat -A PREROUTING -i 网络接口 -p 协议 -dport 端口 -j DNAT -- to-destination IP地址
DNAT能够完成以下功能
1.发布内网服务器
DNAT接收外部的请求数据包,并转发至内部的应用服务器。这个过程是透明的,访问者感觉像直接在内网服务器进行通信一样。
web服务器的IP地址为192.168.1.3,防火墙外部IP地址为202.200.200.10.先需要调整防火墙设置,保证外网用户能够正常访问该服务器。
使用DNAT将发送至202.200.200.10且端口为80的数据包转发至192.168.1.3,如下所示。
#iptables -t nat -A PREROUTING -d 202.200.200.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.3
2.实现负载均衡
如果内部网络存在多台相同应用类型的服务器,就可以使用DNAT,将外部的访问流量分配到多台服务器上,实现负载均衡,减轻服务器的负担。
学院有两台数据相同的web服务器,IP地址分别为10.0.0.10/10.0.0.11,防火墙外部IP地址为202.200.200.10.为了提高页面的响应速度,需要对web服务进行优化。
#iptables -t nat -A PREROUTING -d 202.200.200.10 -p tcp -- dport 80 -j DNAT --to 10.0.0.10-10.0.0.11
MASQUERADE
MASQUERADE和SNAT的作用相同,也是提供源地址转换的操作,但它是针对外部接口为动态IP地址的情况而设计的,不需要使用--to-source指定转换的IP地址。如果网络采用拨号方式接入Internet,而没有对外的表态IP地址,那么,建议使用MASQUERADE.
假设,公司内部网络有200台计算机,网段为192.168.1.0/24,并配有一台拨号主机,使用接口ppp0接入Internet,所有客户端通过该主机访问互联网。这时,需要在拨号主机进行设置,将192.168.1.0/24的内部地址,转换为ppp0的公网地址,如下所示。
#iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE
说明:MASQUERADE是特殊的过滤规则,他只能伪装从一个接口到另一个接口的数据