iptables服务器主机防火墙
iptables参数说明:
Commands: Either long or short options are allowed. --append -A chain 链尾部追加一条规则 --delete -D chain 从链中删除能匹配到的规则 --delete -D chain rulenum 从链中删除第几条链,从1开始计算 --insert -I chain [rulenum] 向链中插入一条规则使其成为第rulenum条规则,从1开始计算 --replace -R chain rulenum 替换链中的地rulenum条规则,从1开始计算 --list -L [chain [rulenum]] 列出某条链或所有链中的规则 --list-rules -S [chain [rulenum]] 打印出链中或所有链中的规则 --flush -F [chain] 删除指定链或所有链中的所有规则 --zero -Z [chain [rulenum]] 置零指定链或所有链的规则计数器 --new -N chain 创建一条用户自定义的链 --delete-chain -X [chain] 删除用户自定义的链 --policy -P chain target 设置指定链的默认策略(policy)为指定的target --rename-chain -E old new 重命名链名称,从old到new Options: [!] --proto -p proto 指定要检查哪个协议的数据包:可以是协议代码也可以是协议名称, 如tcp,udp,icmp等。协议名和代码对应关系存放在/etc/protocols中 省略该选项时默认检查所有协议的数据包,等价于all和协议代码0 [!] --source -s address[/mask][...] 指定检查数据包的源地址,或者使用"--src" [!] --destination -d address[/mask][...] 指定检查数据包的目标地址,或者使用"--dst" [!] --in-interface -i input name[+] 指定数据包流入接口,若接口名后加"+",表示匹配该接口开头的所有接口 [!] --out-interface -o output name[+] 指定数据包流出接口,若接口名后加"+",表示匹配该接口开头的所有接口 --jump -j target 为规则指定要做的target动作,例如数据包匹配上规则时将要如何处理 --goto -g chain 直接跳转到自定义链上 --match -m match 指定扩展模块 --numeric -n 输出数值格式的ip地址和端口号。默认会尝试反解为主机名和端口号对应的服务名 --table -t table 指定要操作的table,默认table为filter --verbose -v 输出更详细的信息 --line-numbers 当list规则时,同时输出行号 --exact -x 默认统计流量时是以1000为单位的,使用此选项则使用1024为单位 -p tcp 子选项 子选项: [!] --source-port,--sport port[:port] 指定源端口号或源端口范围。指定端口范围时格式为"range_start:range_end",最大范围为0:65535。 [!] --destination-port,--dport port[:port] 指定目标端口号或目标端口号范围。 [!] --tcp-flags mask comp 匹配已指定的tcp flags。mask指定的是需要检查的flag列表,comp指定的是必须设置的flag。 有效的flag值为:SYN ACK FIN RST URG PSH ALL NONE。 如果以0和1来表示,意味着mask中comp指定的flag必须为1其余的必须为0。 例如:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN 表示只匹配设置了SYN=1而ACK、FIN和RST都为0数据包,也即只匹配TCP三次握手的第一次握手。 [!] --syn 是"--tcp-flags SYN,ACK,FIN,RST SYN"的简写格式。 -p udp 子选项 子选项: [!] --source-port,--sport port[:port] 指定源端口号或源端口范围。指定端口范围时格式为"range_start:range_end",最大范围为0:65535。 [!] --destination-port,--dport port[:port] 指定目标端口号或目标端口号范围。 -p icmp 子选项 子选项: [!] --icmp-type {type[/code]|typename} 用于指定ICMP类型,可以是ICMP类型的数值代码或类型名称。有效的ICMP类型 可由iptables -p icmp -h获取。常用的是"echo-request"和"echo-reply",分别 表示ping和pong,数值代号分别是8和0 ping时先请求后响应:ping别人先出去8后进来0;别人ping自己,先进来8后出去0
注意:
"-m"选项指定的是显式扩展。其实隐式扩展也是要指定扩展名的,只不过默认已经知道所使用的扩展,于是可以省略。例如:-p tcp --dport = -p tcp -m tcp --dport。
常用的扩展和它们常用的选项如下:
(1).iprange:匹配给定的IP地址范围。
[!] --src-range from[-to]:匹配给定的源地址范围 [!] --dst-range from[-to]:匹配给定的目标地址范围
(2).multiport:离散的多端口匹配模块,如将21、22、80三个端口的规则合并成一条。
最多支持写15个端口,其中"555:999"算2个端口。只有指定了-p tcp或-p udp时该选项才生效。
[!] --source-ports,--sports port[,port|,port:port]... [!] --destination-ports,--dports port[,port|,port:port]... [!] --ports port[,port|,port:port]... :不区分源和目标,只要是端口就行
(3).state:状态扩展。结合ip_conntrack追踪会话的状态。
[!] --state state
其中state有如下4种:
INVALID:非法连接(如syn=1 fin=1) ESTABLISHED:数据包处于已建立的连接中,它和连接的两端都相关联 NEW:新建连接请求的数据包,且该数据包没有和任何已有连接相关联 RELATED:表示数据包正在新建连接, 但它和已有连接是相关联的(如被动模式的ftp的命令连接和数据连接)
例如:-m state --state NEW,ESTABLISHED -j ACCEPT
关于这4个状态,在下文还有更详细的描述。
(4).string:匹配报文中的字符串。
--algo {kmp|bm}:两种算法,随便指定一种 --string "string_pattern"
如:
iptables -A OUTPUT -m string --algo bm --sting "taobao.com" -j DROP
(5).mac:匹配MAC地址,格式必须为XX:XX:XX:XX:XX:XX。
[!] --mac-source address
(6).limit:使用令牌桶(token bucket)来限制过滤连接请求数。
--limit RATE[/second/minute/hour/day]:允许的平均数量。如每分钟允许10次ping,即6秒一次ping。默认为3/hour。 --limit-burst:允许第一次涌进的并发数量。第一次涌进超出后就按RATE指定数来给出响应。默认值为5。
例如:允许每分钟6次ping,但第一次可以ping 10次。10次之后按照RATE计算。所以,前10个ping包每秒能正常返回,从第11个ping包开始,每10秒允许一次ping:iptables -A INPUT -d ServerIP -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 10 -j ACCEPT
(7).connlimit:限制每个客户端的连接上限。
--connlimit-above n:连接数量高于上限n个时就执行TARGET
如最多只允许某ssh客户端建立3个ssh连接,超出就拒绝。两种写法:
iptables -A INPUT -d ServerIP -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP iptables -A INPUT -d ServerIP -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT
这个模块虽然限制能力不错,但要根据环境计算出网页正常访问时需要建立的连接数,另外还要考虑使用NAT转换地址时连接数会翻倍的问题。
"-j"是指定的target,target表示对匹配到的数据包要做什么处理,比如丢弃DROP、拒绝REJECT、接受ACCEPT等,除这3个target外,还支持很多种target。以下是其中几种:
DNAT:目标地址转换 SNAT:源地址转换 REDIRECT:端口重定向 MASQUERADE:地址伪装(其实也是源地址转换) RETURN:用于自定义链,自定义链中匹配完毕后返回到自定义的前一个链中继续向下匹配
iptables命令实战:
企业服务器主机配置防火墙(filter表:INPUT,OUTPUT,FORWARD链)步骤:
1.置零所有规则和计数器:
iptables -F iptables -X iptables -Z
2.根据企业实际情况配置好允许规则,并允许回环接口 lo(-i/-o),如下:
iptables -t filter -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT
3.设置默认的防火墙允许和禁止规则(使用-P或--policy参数设置默认规则):
iptables -P INPUT DROP #<== -P参数是添加默认规则至最后 iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP
4.使用 iptables-save命令将内存中配置写入配置文件(直接编辑配置文件/etc/sysconfig/iptables也可以)
iptables-save #<==保存规则 /etc/init.d/iptables restart iptables-restore #<==恢复规则,后面可以用文件标准输入 <文件 iptables -L -n --line-number
提示:更好的方法是,第一次使用iptables时,将脚本所有需要用到的规则添加至文件 /etc/sysconfig/iptables,以后就直接编辑文件修改使用即可。
iptables脚本参考,生产环境根据实际调整使用(来自老男孩老师QQ49000448):
#!/bin/bash #this is a server firewall created by oldboy 17:03 2006-7-26 #updated by oldboy on 10:30 2009-6-23 #http://blog.etiantian.org #qq:49000448 #define variable PATH IPT=/sbin/iptables #Remove any existing rules $IPT -F $IPT -X $IPT -Z #setting default firewall policy $IPT --policy OUTPUT ACCEPT $IPT --policy FORWARD DROP $IPT -P INPUT DROP #setting for loopback interface $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Source Address Spoofing and Other Bad Addresses $IPT -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP $IPT -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP $IPT -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP $IPT -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP # prevent all Stealth Scans and TCP State Flags $IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # All of the bits are cleared $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP #SYN and RST are both set $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # SYN and FIN are both set $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # FIN and RST are both set $IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP # FIN is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP # PSH is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP # URG is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP #setting access rules #one,ip access rules,allow all the ips of $IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT #second,port access rules #nagios $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p tcp --dport 5666 -j ACCEPT #db $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3307 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3308 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 1521 -j ACCEPT #ssh difference from other servers here.>> $IPT -A INPUT -s 202.81.17.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -j ACCEPT #ftp #$IPT -A INPUT -p tcp --dport 21 -j ACCEPT #http $IPT -A INPUT -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT #snmp $IPT -A INPUT -s 192.168.1.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p UDP --dport 161 -j ACCEPT #rsync $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p tcp -m tcp --dport 873 -j ACCEPT #nfs 2049,portmap 111 $IPT -A INPUT -s 192.168.1.0/24 -p udp -m multiport --dport 111,892,2049 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 111,892,2049 -j ACCEPT #icmp #$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p icmp -m icmp --icmp-type any -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT #others RELATED $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
注意:ftp服务器配置防火墙需允许关联的状态包通过.,并且需安装模块 nf_conntrack_ftp(写入配置文件/etc/rc.local 中最好,开机就自动加载)
modprobe nf_conntrack_ftp #<==此模块与state状态相关 iptables -A INPUT -d 10.0.0.2 -p tcp --dport 21 -m state --state=NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 10.0.0.2 -m state --state=ESTABLISHED -j ACCEPT
更多iptables知识,原理以及TCP协议三次握手,四次挥手,如需深入了解,可参考博客
http://www.cnblogs.com/f-ck-need-u/p/7397146.html
https://www.cnblogs.com/kevingrace/p/6265113.html