一、iptables命令帮助信息

1.1 实际测试iptables规则
1.1.1启动和查看iptables状态
  /etc/init.d/iptables start
  iptables -L -n或iptables -L -n -v -x
实例演示1:

[root@xiaorui ~]# iptables -V
iptables v1.4.7
[root@xiaorui ~]# iptables -h
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            Append to chain
  --check   -C chain            Check for the existence of a rule
  --delete  -D chain            Delete matching rule from chain
  --delete  -D chain rulenum
                                Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
                                Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
                                Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
                                List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
                                Print the rules in a chain or all chains
  --flush   -F [chain]          Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
                                Zero counters in chain or all chains
  --new     -N chain            Create a new user-defined chain
  --delete-chain
            -X [chain]          Delete a user-defined chain
  --policy  -P chain target
                                Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
                                Change chain name, (moving any references)
Options:
[!] --proto     -p proto        protocol: by number or name, eg. `tcp'
[!] --source    -s address[/mask][...]
                                source specification
[!] --destination -d address[/mask][...]
                                destination specification
[!] --in-interface -i input name[+]
                                network interface name ([+] for wildcard)
 --jump -j target
                                target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match       -m match
                                extended match (may load extension)
  --numeric     -n              numeric output of addresses and ports
[!] --out-interface -o output name[+]
                                network interface name ([+] for wildcard)
  --table       -t table        table to manipulate (default: `filter')
  --verbose     -v              verbose mode
  --line-numbers                print line numbers when listing
  --exact       -x              expand numbers (display exact values)
[!] --fragment  -f              match second or further fragments only
  --modprobe=<command>          try to insert modules using this command
  --set-counters PKTS BYTES     set the counter during insert/append
[!] --version   -V              print package version.

  iptables -F  //清除所有规则,不会处理默认的规则。
  iptables -X  //删除用户自定义的链。
  iptables -Z  //链的记数器清零。
实例演示2:

[root@xiaorui ~]# iptables -F
[root@xiaorui ~]# iptables --flush
提示:以上两条命令等价
[root@xiaorui ~]# iptables -X
[root@xiaorui ~]# iptables --delete-chain
提示:以上两条命令等价
[root@xiaorui ~]# iptables -Z
[root@xiaorui ~]# iptables --zero
提示:以上两条命令等价
[root@xiaorui ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

1.1.3禁止规则
       #禁止ssh端口

(1)找出当前机器的SSH端口

[root@xiaorui ~]# netstat -lntup|grep ssh
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2073/sshd           
tcp        0      0 :::22                       :::*                        LISTEN      2073/sshd

(2)禁止当前的SSH端口,这里是22

语法:
Usage: iptables -t [table] -[AD] chain rule-specification [options]
具体命令:
[root@xiaorui ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
[root@xiaorui ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
注:
1、iptables默认用的就是filter表,因此,以上两条命令等价
2、其中的INPUT DROP要大写
3、--jump  -j target
   target for rule(may load target extension)
   基本的处理行为:ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)
   比较:DROP好于REJECT
4、命令行执行的规则,仅仅在内存里临时生效

(3)恢复刚才断掉的SSH连接
      1)去机房重启系统或者登录删除刚才的禁止规则
      2)让机房人员重启服务器或者让机房人员拿用户名密码登录进去
      3)通过服务器的远程管理卡管理
      4)先写一个定时任务,每5分钟就停止防火墙
      5)测试环境测试好,写成脚本,批量执行

(4)使用-I和-A的顺序,防火墙的过滤根据规则顺序的。
  -A是添加规则到指定链的结尾,最后一条。
  -I是添加规则到指定链的开头,第一条。也可以指定插入位置。

  插入到第二行:
  [root@xiaorui ~]# iptables -I INPUT 2 -p tcp --dport 8080 -j DROP

(5)总结下删除规则的方法:
  1)iptables -D INPUT -p tcp --dport 8080 -j DROP
  2)iptables -F 删除所有规则
  3)iptables -D INPUT 规则序号
  4)/etc/init.d/iptables restart (用iptables命令行配置的命令都是临时生效)

二、知识点整理
1、禁止10.0.0.0网段连入:
  iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP

2、源地址不是10.0.0.101单个ip的禁止连接
  iptables -t filter -I INPUT -i eth0 ! -s 10.0.0.101 -j DROP

3、源地址不是10.0.0.0/24的网段禁止连接
  iptables -t filter -I INPUT -i eth0 ! -s 10.0.0.0/24 -j DROP

4、源地址不是10.0.0.0/24禁ping
  iptables -t filter  -I INPUT -p icmp --icmp-type 8 -i eth0 ! -s 10.0.0.0/24 -j DROP

5、封掉3306端口
  iptables -A INPUT -p tcp  --dport 3306 -j DROP

6、匹配规则
  匹配指定协议外的所有协议
  iptables -A INPUT -p ! tcp

  匹配主机源IP
  iptables -A INPUT -s 10.0.0.14
  iptables -A INPUT -s ! 10.0.0.14

  匹配网段
  iptables -A INPUT -s 10.0.0.0/24
  iptables -A INPUT -s ! 10.0.0.0/24

  匹配单一端口
  iptables -A INPUT -p tcp --sport 53
  iptables -A INPUT -p udp --dport 53

  匹配指定端口之外的端口
  iptables -A INPUT -p tcp --dport ! 22
  iptables -I INPUT -p tcp ! --dport 22  -s 10.0.0.123 -j DROP

  匹配端口范围
  iptables -A INPUT -p tcp --sport 22:80
  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

  匹配ICMP类型
  iptables -A INPUT -p icmp --icmp-type 8
  iptables -A INPUT -p icmp --icmp-type 8 -j DROP
  iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

  匹配指定的网络接口
  iptables -A INPUT -i eth0
  iptables -A FORWARD -o eth0
  记忆方法:
  --in-interface -i [!] input name[+]
                                network interface name ([+] for wildcard)
  --out-interface -o [!] output name[+]
                                network interface name ([+] for wildcard)
  匹配网络状态
  -m state --state
      NEW:已经或将启动新的连接
      ESTABLISHED:已建立的连接
      RELATED:正在启动新连接
      INVALID:非法或无法识别的

7、配置一个企业防火墙

[root@ipt ~]# iptables -F
[root@ipt ~]# iptables -X
[root@ipt ~]# iptables -Z
[root@ipt ~]# iptables -A INPUT -p tcp  --dport 22 -s 10.0.0.0/24  -j ACCEPT
[root@ipt ~]# iptables -A INPUT -i lo -j ACCEPT
[root@ipt ~]# iptables -A INPUT -o lo -j ACCEPT  
[root@ipt ~]# iptables -A OUTPUT -o lo -j ACCEPT

  允许合法的进入:

iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
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
iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT

iptables -A INPUT -p icmp --icmp-type 8  -j ACCEPT

#others RELATED ftp协议
#允许关联的状态包
iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

8、企业iptables面试题:自定义链处理syn攻击
  iptables -N syn-flood
  iptables -A INPUT -i eth0 -syn -j syn-flood
  iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN
  iptables -A syn-flood -j DROP

9、局域网共享的两条命令方法:
  方法1:适合于有固定外网地址的:
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7
    (1)-s 192.168.1.0/24 办公室或IDC内网网段。
    (2)-o eth0 为网关的外网卡接口。
    (3)-j SNAT --to-source 10.0.0.19 是网关外网卡IP地址。
  方法2:适合变化外网地址(ADSL):
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE 伪装。

10、映射多个外网IP上网
  iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16
  iptables -t nat -A POSTROUTING -s 172.16.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.103-124.42.60.106

11、将访问10.0.0.7的80端口转到192.168.1.8的9000端口
  iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.8:9000

12、保存iptables规则
  iptables-save >/etc/sysconfig/iptables
  
13、允许关联的状态包通过(FTP服务是特殊的,需要配状态连接。)

  #允许关联的状态包
  iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
  iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  比喻:看电影出去WC或者接个电话,回来也得允许进去。

  -m limit
  --limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时    
  --limit-burst [n]:在同一时间内允许通过的请求"n"为数字,不指定默认为5

  fg:本机地址:172.16.14.1,允许172.16.0.0/16网络ping本机,但限制每分钟请求不能超过20,每次并发不能超过6个
  iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT
  iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT

14、Linux上配置zebra路由:

client(config)#int eth0
client(config-if)#ip add 10.1.34.81 255.255.255.0
client(config-if)#int eth1
client(config-if)#ip add 110.233.24.96 255.255.255.224
client(config)#ip route 0.0.0.0 0.0.0.0 10.1.32.1
client(config)#ip route 110.233.24.96/27 eth1

15、iptables的生产常用场景:
  1)实现服务器本身防火墙功能,使用filter表。
  2)实现局域网上网网关,使用nat表,网关上也可以同时用filter表做防火墙。
  3)实现NAT功能,如:由外部IP映射到内部服务器IP(包括端口),使用nat表。
  4)其他。。。略。

16、相关知识参看
  (1)生产环境大于254台机器网段划分及路由解决方案详解01
  http://v.youku.com/v_show/id_XNTAyMjAwMzI0.html  (2) linux route命令深入浅出与实战案例精讲
  http://oldboy.blog.51cto.com/2561410/1119453
17、查看是否加载相应的模块

lsmod |egrep "nat|filter"
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state