iptable--防火墙设置

 

 

 

 
1. filter

 

2. nat

3. Mangle

常用表的流程只有filter和nat,简化如下:

 

 

===========================================================================
 
命令参数详解
table表--->chain 链--->rule 规则
policy
 
[root@lb01 ~]# iptables --help
iptables v1.4.7
 
     Usage: iptables -[ACD]          chain rule-specification [options]
       iptables -I                   chain [rulenum] rule-specification [options]
       iptables -R                 chain rulenum rule-specification [options]
       iptables -D                 chain rulenum [options]
       iptables -[LS]              [chain [rulenum]] [options]
       iptables -[FZ]              [chain] [options]
       iptables -[NX]             chain
       iptables -E                 old-chain-name new-chain-name
       iptables -P                 chain target [options]
       iptables -h                 (print this help information)
 
Commands:
Either long or short options are allowed.
  --append  -A chain              添加规则到链上--->
   [!] --proto     -p proto  指定过滤的协议-p(tcp,udp,icmp,all)--->
[!] --source    -s address[/mask][...]   指定源地址--->
[!] --destination -d address[/mask][...] 指定目的地址
[!] --in-interface -i input name[+]      进入的网络接口(eth0,eth1)
[!] --out-interface -o output name[+]    出去的网络接口(eth0,eth1)
       --dport                         指定目标端口--->
    --sport     指定源端口
            --jump -j target                对规则的具体处理方法(ACCEPT,DROP,REJECT)--->
            -p icmp --icmp-type 8
 
iptables -I INPUT -p icmp --icmp-type 8 -i eth0 -s ! 10.0.0.115 -j DROP
 
        iptables [-t table] {-A|-C|-D} chain rule-specification
==================================================================
  --delete  -D chain              删除链上的规则    --->
  --delete  -D chain rulenum      根据规则号,删除链--->
  --insert  -I chain [rulenum]    插入规则到第一行  --->
====================================================
  --list    -L [chain [rulenum]]  列表链里的所有规则(iptables -nL)--->
  --numeric -n                    以数字的形式显示规则--->
  --policy  -P chain target       指定链的默认规则--->
  --flush   -F [chain]            清除一个链或所有链上的规则--->
  --zero    -Z [chain [rulenum]]  链的记数器清零。
  --new     -N chain              用户自定义的链
  --delete-chain -X [chain]       删除用户自定义的链。
  --line-numbers                  打印规则序号--->
  --table       -t table          指定表(default: `filter')
练习:
1、禁止来自202.106.0.20ip地址访问873端口的请求,协议为tcp协议。
 
匹配端口范围:
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT 
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP
 
匹配网络状态
-m state --state
    NEW:已经或将启动新的连接
    ESTABLI
 
===========================================================================
 
 
[root@lb01 ~]# iptables -P INPUT ACCEPT
[root@lb01 ~]# iptables -P FORWARD ACCEPT
[root@lb01 ~]# iptables -P OUTPUT ACCEPT 
[root@lb01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  10.1.0.0/24          0.0.0.0/0           icmp type 8 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    
 
 [root@lb01 ~]# iptables -t filter -A INPUT -p tcp -s 10.0.0.0/24 -j DROP

 

 iptables -t filter -D INPUT -p tcp -s 10.0.1.0/24 -j DROP 
 

 

 iptables -I INPUT -p tcp --dport 3306 -j DROP  

 

 

匹配端口范围:

iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT <==次选
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP  <==最佳
iptables -I INPUT -p tcp --dport 21,22,23,24 -j ACCEPT <==错误语法
 
 匹配网络状态
 -m state --state
    NEW:已经或将启动新的连接
    ESTABLISHED:已建立的连接
    RELATED:正在启动的新连接
    INVALID:非法或无法识别的 
 
 限制指定时间包的允许通过数量及并发数
-m limit --limit n/{second/minute/hour}:
指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时
--limit-burst [n]:
在同一时间内允许通过的请求"n"为数字,不指定默认为5
[root@nginx01 ~]# iptables -I INPUT -s 10.0.1.0/24 -p icmp --icmp-type 8 -m limit --limit 5/min --limit-burst 2 -j ACCEPT 
 
 #允许IDC LAN/WAN和办公网IP的访问,及对外合作机构访问
iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT  ç办公室固定IP段。
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT   çIDC机房的内网网段。
iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT      ß其他机房的内网网段。
iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT   ßIDC机房的外网网段
iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT   ß其它IDC机房的外网网段 
 
 
 企业防火墙配置实战:
[root@lb01 ~]# iptables -F
[root@lb01 ~]# iptables -Z
[root@lb01 ~]# iptables -X
[root@lb01 ~]# iptables -P OUTPUT ACCEPT
[root@lb01 ~]# iptables -P FORWARD ACCEPT
[root@lb01 ~]# iptables -P INPUT DROP^C
[root@lb01 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@lb01 ~]# iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT          
[root@lb01 ~]# iptables -P INPUT DROP
[root@lb01 ~]# 
[root@lb01 ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  10.0.0.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@lb01 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@lb01 ~]# iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT
[root@lb01 ~]# iptables -A INPUT -p tcp  --dport 80 -j ACCEPT
[root@lb01 ~]# iptables -A INPUT -p tcp  --dport 443 -j ACCEPT
[root@lb01 ~]# iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
[root@lb01 ~]# #允许关联的状态包
[root@lb01 ~]# iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@lb01 ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  201.82.34.0/24       0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0         icmp type 255 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@lb01 ~]# iptables -D INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT 
[root@lb01 ~]# /application/nginx/sbin/nginx
[root@lb01 ~]# netstat -lntup|grep -w 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5601/nginx          
[root@lb01 ~]# /etc/init.d/iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]
[root@lb01 ~]# iptables-save > /etc/sysconfig/iptables^C
[root@lb01 ~]# /etc/init.d/iptables save  
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]
[root@lb01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Sep 25 12:49:48 2016
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [2:120]
:OUTPUT ACCEPT [2:120]
COMMIT
# Completed on Sun Sep 25 12:49:48 2016
# Generated by iptables-save v1.4.7 on Sun Sep 25 12:49:48 2016
*filter
:INPUT DROP [8675:381885]
:FORWARD ACCEPT [10:440]
:OUTPUT ACCEPT [900:59778]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -s 201.82.34.0/24 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT 
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Sun Sep 25 12:49:48 2016
[root@lb01 ~]# /etc/init.d/iptables restart
iptables:将链设置为政策 ACCEPT:nat filter                [确定]
iptables:清除防火墙规则:                                             [确定]
iptables:正在卸载模块:                                                 [确定]
iptables:应用防火墙规则:                                             [确定] 
 
 
自动封IP:分析web或应用日志或者网络连接状态封掉垃圾IP
#!/bin/sh
/bin/netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0'|awk '{if ($2!=null && $1>4) {print $2}}'>/home/shell/dropip
for i in $(cat /home/shell/dropip)
do
        /sbin/iptables -I INPUT -s $i -j DROP
#-m limit --limit 20/min --limit-burst 6
        echo "$i kill at `date`">>/var/log/ddos
done
 
#!/bin/sh
## search connection established ips
netstat -an |grep EST|awk -F " " '{print $5}' |cut -d ":" -f4 |grep "[0-9]*.[0-9]*.[0-9]*.[0-9]*" |sort  |uniq -c |sort -rn  |head -50 >/home/shell/ip_connection.log
## drop ips
cat /home/shell/ip_connection.log |egrep -v "[a-z][A-Z]*" |egrep -v "202.165|192.168|127.0"|while read line
do
    count=`echo $line|awk '{print $1}'`
    ip=`echo $line|awk '{print $2}'`
    if [ $count -ge 100 ]
      then
         echo "all establish status connection > 100 ip is : $ip"
         echo "apply rule ,drop $ip access 100 !"
         /sbin/iptables -I INPUT 6 -s $ip -p tcp --dport 80  -j  DROP
         /sbin/service iptables save
    fi
done
 
 
设置内网IP通过NAT网关上网
一 :网关机器操作
 
1.在网关机器设置
[root@lb01 ~]# vim  /etc/sysctl.conf 
[root@lb01 ~]# sysctl -p
net.ipv4.ip_forward = 1
2. sysctl.conf添加以下配置
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state 
3.查看一下配置
 [root@lb01 ~]# lsmod|egrep ^ip
iptable_filter          2793  0 
ip_tables              17831  1 iptable_filter
ipt_REJECT              2351  0 
ip_vs_rr                1420  1 
ip_vs                 126534  3 ip_vs_rr
ipv6                  335589  265 ip_vs
4. 添加网关转换命令
[root@lb01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.5
[root@lb01 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  172.16.1.0/24        0.0.0.0/0           to:10.0.0.5 
Chain OUTPUT (policy ACCEPT)
target     prot opt source                 destination      
 
二 ,内网机器设置
 
 1. 关闭eth0,禁止上网
 2.[root@lb01 ~]# vim /etc/resolv.conf     
    nameserver 10.0.0.2
    nameserver 8.8.8.8
3. route add defult gateway 10.0.0.5
4. ping 10.0.0.5
或者针对ADSL拨号上网方式增加网关命令
 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE 
2. 实现外网通过网关10.0.0.5:8080来访问10.0.0.6:22端口
[root@lb01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 8080 -j DNAT --to-destination 172.16.1.41:22
[root@lb01 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            10.0.0.5            tcp dpt:8080 to:172.16.1.41:22 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.16.1.0/24        0.0.0.0/0           
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
3. 实现外部IP 124.42.34.112一对一映射到内部server 10.0.0.8 
 -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
-A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112 
 -A POSTROUTING -s 10.0.0.0/255.255.240.0 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254 

防火墙的主要应用

TABLES  详细的参数解释 :
 

当前有三个表(哪个表是当前表取决于内核配置选项和当前模块)。 
-t table 
这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块,这时若模块没有加载,(系统)将尝试(为该表)加载适合的模块。这些表如下: filter,这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。nat, 这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由之前进入的包)和OUTPUT(修改路由之前本地的包)。 
OPTIONS 
这些可被iptables识别的选项可以区分不同的种类。

COMMANDS 
这些选项指定执行明确的动作:若指令行下没有其他规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区分出该指令就行了。 
-A -append 
在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。

-D -delete 
从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。

-R -replace 
从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。

-I -insert 
根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。

-L -list 
显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。

-F -flush 
清空所选链。这等于把所有规则一个个的删除。

--Z -zero 
把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。

-N -new-chain 
根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。

-X -delete-chain 
删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非内建的链。


-P -policy 
设置链的目标规则。

-E -rename-chain 
根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标。

-h Help. 
帮助。给出当前命令语法非常简短的说明。

PARAMETERS 
参数 
以下参数构成规则详述,如用于add、delete、replace、append 和 check命令。

-p -protocal [!]protocol 
规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在 /etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合时,all可以不被使用。 
-s -source [!] address[/mask] 
指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边"1"的个数,因此, mask值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志 --src 是这个选项的简写。

-d --destination [!] address[/mask] 
指定目标地址,要获取详细说明请参见 -s标志的说明。标志 --dst 是这个选项的简写。

-j --jump target 
-j 目标跳转 
指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标,或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。

-i -in-interface [!] [name] 
i -进入的(网络)接口 [!][名称] 
这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名前使用"!" 说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接口。

-o --out-interface [!][name] 
-o --输出接口[名称] 
这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)。当在接口名前使用"! "说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配所有任意接口。

[!] -f, --fragment 
[!] -f --分片 
这意味着在分片的包中,规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标端口(或者是ICMP类型的),这类包将不能匹配任何指定对他们进行匹配的规则。如果"!"说明用在了"-f"标志之前,表示相反的意思。

 
 
 5. dmesg里面显示 ip_conntrack: table full, dropping packet.的错误提示.如何解决。
以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。

c58:
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max=25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
################################################################
C64:
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
参考资料:
 
(1)生产环境大于254台机器网段划分及路由解决方案详解01 
http://v.youku.com/v_show/id_XNTAyMjAwMzI0.html 
(2) linux route命令深入浅出与实战案例精讲
http://oldboy.blog.51cto.com/2561410/1119453
http://oldboy.blog.51cto.com/2561410/974194
必看3遍以上。

 

posted @ 2018-03-07 11:40  秋天的风吹过原野  阅读(10034)  评论(0编辑  收藏  举报