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:离散的多端口匹配模块,如将212280三个端口的规则合并成一条。

最多支持写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

原文地址:https://www.cnblogs.com/blog-tim/p/10274124.html