鸟哥把Iptables 语法分成规则清除、定义策略及增加与插入规则三部分:

一、清除规则与观察规则;
1、查看当前本机的防火墙规则

#iptables [-t tables] [-L ][-n]

-t :后面接iptables 的table,列入nat 或 filter ,如果没有-t table,默认就是-t filter;
-L :列出当前的table的规则
-n :不进行IP 与HOSTNAME的转换,屏幕显示信息的速度会快很多。

[root@jiankong ~]# iptables -L -n
Chain INPUT   (policy ACCEPT) /默认动作
target     prot opt source                         destination
RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)/默认动作
target     prot opt source                       destination
RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)/默认动作
target     prot opt source               destination


[root@jiankong ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

/与filter类似,nat表格里有prerouting 、postrouting及 output三条链;

2、清除规则

#iptables [-t tables][-FXZ]
参数说明:
-F:清除所有的已设置的规则;
●-X:杀掉所有用户建立的链;
●-Z将所有链的技术与流量统计清零


一般来说 在重新定义防火墙的时候要首先清除规则,防火墙的规则顺序是有特殊意义的,所以先清除规则,然后在设置;

二、定义策略
清除规则之后,接下来就是设置规则的策略。还记得策略指的是什么么吗,当您的数据包不在设置规则之内时,则该数据包通过与否,以pollicy的设置为准。通常这个策略在filter这个table的INPUT链定义,其定义严格一点教好,而FORWARD、OUTPUT则可定的轻松一点。
鸟哥的做法通常是将INPUT的policy定义为 DROP,全部档掉在说。

语法
[root@jiankong~]#iptables [-t table][-P][INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING、OUTPUT][ACCEPT 、DROP]

-t :指定表;
-P : 定义策略policy(为大写);
●INPUT :数据包输入主机的方向;
●OUTPUT:数据包输出主机的方向;
●FORWARD:数据包为不进入主机而向外在传输出去的方向;
●PREROUTING:在进入路由之前进行的工作;
●POSTROUTING:在进入路由器之后进行的工作;
OUTPUT:数据包为输出主机的方向;
[root@jiankong~]#/sbin/iptables -P INPUT DROP
[root@jiankong~]#/sbin/iptables -P OUTPUT ACCEPT
[root@jiankong~]#/sbin/iptables -P FORWARD ACCEPT
[root@jiankong~]#/sbin/iptables -t nat -P PREROUTING ACCEPT
....
如果没有加载net模块 会提示错误信息,提示你去家族模块:

除了INPUT之外,其他项都设置为接受,这样的设置,我们的主机的数据包可以出去,但是任何数据包无法进入,包括送去数据包的响应数据包(ACK).

1、增加与插入规则

下面所记录的内容完全针对LINUX主机进行设置,仅针对filter表,至于NAT后面的主机,以后在练习;

iptables 规则的基本语法

[root@jiankong~]#iptables [-t filter]
[-AI INPUT 、OUTPUT、FORWARD]
[-io interface][-p tcp、udp、icmp、all][-s IP/network][--sport ports][-d IP/network][--dport ports] -j [ACCEPT、DROP]


  
-A:新增加一条规则,该规则增加在最后面;
-I:插入一条规则,如果没有设置规则顺序,默认是插入变成第一条规则,后面的规则一次递减;
INPUT :规则设置为filter table的INPUT链;
OUTPUT:规则设置为filter table的OUTPUT链;
FORWARD:规则设置为filter table的FORWARD链;
-i : 设置数据包进入网卡的接口;
-O : 设置数据包流出网卡的接口;
interface :网络接口卡,eth0、eth1....
-p : 数据包使用的协议;
-s :来源数据包的IP地址或网段;
--sport :来源数据包的端口号,也可以使用单个端口port1或者多个端口port1:port3;如:21:23 表示同时通过21、22、23号端口;
-d :目标主机的IP地址或者网段;
--dport :目标主机的端口号
-j : 动作,可以接下面的动作;

※ACCEPT :接受该数据包;
※DROP   :丢弃该数据包;
※LOG    :将该数据包的信息记录下来(默认记录到/var/log/messages文件);


范例一:将来自lo的所有数据包都授予接受
[root@jiankong ~]#iptables -A INPUT -i lo  -j ACCEPT
“没有设置的规定,则表示该规定完全接受”

范例二:将来自192.168.0.1这个IP 数据包都授予接受;
[root@jiankong ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1  -j ACCEPT

范例三:来自192.168.1.0这个C class网段的任何一台计算机的数据包予以接受;

[root@jiankong ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT

范例4:来自192.168.1.25的数据包都丢弃
[root@jiankong ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j DROP

范例五:只要是想进入本机端口21 的数据包就丢弃
[root@jiankong ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

范例六:来自192.168.0.24的数据包,想要到我的137、138、139端口时都接受
[root@jiankong ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24 --dport 137:139 -j ACCEPT
范例七:只要是接触到我主机的端口25,就将该数据包记录下来

[root@jiankong ~]# iptables -A INPUT -p tcp --dport 25 -j LOG


对icmp协议进行设置此外TCP数据包header上的SYN标记功能与否也能设置,下面举例子:
[!]--syn这个设置仅用于-p tcp规则,因为只有TCP包有SYN标记;当TCP数据包带有SYN标记,表示这个连接是对方主动发起的,若在--syn 之前加上!表示该数据包不带有syn(刚好意思相反)

范例一:将来自192.168.100.200的主动连接的数据包丢弃
[root@jiankong ~]# iptables -A INPUT  -p tcp -i et0 -s 192.168.100.200 --syn -j DROP

--icmp-type:可以管制ICMP数据包的某些类型,



类型代号   类型名称                   意义


0         echo replay                响应应答(ECHO-REPLY)
3         distination unreachable    表示目的不可到达
4         source quench              当route的负载过大,这个类型吗用来
让发送方停止继续发送信息(源抑制)
5 redirect 用来重定向路由路径的信息
8 echo request 响应请求(ECHO-REQUEST)
11 time exeeded for a dataram 当数据包在某些路由传送过程中超时时
,次类型代码可以告知发送方数据包
已被忽略;
12 parameter problem on a datagram 当一个ICMP数据包重复之前的
错误时,会回复来源主机参数错误的信息
13 timestamp request 时间戳请求;要求对方提供时间信息,
用以计算路由时间的差异以满足同步协议
的要求;
14 timestamp replay 时间戳应答;次信息纯粹是相应13类型;
15 information request 信息请求(*已作废)
16 information replay 信息应答(*已作废)
17 address mask request 地址掩码请求;用来查询子网mask
设置信息;
18 address mask replay 地址掩码应答;相应子网掩码查询信息;
范例二:别的主机ping 我们主机时,我们的主机不予以响应;

[root@jiankong ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP

当使用这个指令后,表示未来别人ping我们的主机时,主机将不会响应,所以对方主机就会显示无法连接到我们的主机;

-m :表示数据包的状态,有一下几种:
-m mac --mac-source aa:bb:cc:dd:ee:ff
-m state --state <状态>
状态有多种,包括:
INVALID:无效的数据包,例如已经破损的数据包状态;
ESTABLISHED :已经成功连接的数据包;
NEW:想要新建连接的数据包状态;
RELATED:这个最常用,表示这个数据包时与我们主机发送出去的数据包有关,可能是响应的数据包也可能是连接成功之后的传送数据包。通常情况下启用这个状态,因为设置它之后,只要未来本主机发送出去的数据包,即使我们没有设置数据包的INPUT规则,有关的数据包还是可以进入我们的主机,可以简化相当多的设置规则;

范例三:让aa:bb:cc:dd:ee:ff网卡无法使用我们主机的资源;

[root@jiankong ~]# iptalbes -A INPUT -p all -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP

范例四、让已经建立或与我们主机有关的响应的数据包通过,但是让不合法的,以及向要尝试新建的数据包阻塞;

[root@jiankong ~]#iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@jiankong ~]#iptables -A INPUT -p tcp -m state --state
INVALID,NEW -j DROP

-j :<动作>:除了比较常见的ACCEPT 与DROP之外,还有如下动作:
REDIRECT --to-port<port number>
这个也比较常见,这就是进行本机端口的转换,不过特别注意的是,这个动作仅够在
nat table 的PREROUTING及OUTPUT链上使用
MASQUERADE:数据包伪装,这个就是NAT主机最重要的功能,进行数据包伪装;

范例五:将要求与80端口连接的数据包转发到8080端口;

[root@jiankong ~]#iptables -t nat -A PREROUTING -p tcp --dport 80
-j REDIRECT --to-ports 8080

范例六:进行数据包的伪装,将来在192.168.0.0/24的数据包的来源IP伪装成
本机的ppp0接口;
 [root@jiankong ~]#iptables -t nat -A POSTROUTING -s 192.168.0.0/24
-o ppp0 -j MASQUERADE

三、记录与恢复防火墙规则

如何观察当前主机上的防火墙规则?可以使用iptables -L -n 命令来观察,不过,
该指令所显示的信息还是不足够,这时我们可以使用下面的两天命令,将当前主机上的
防火墙机制记录下来,下次想将这个规则恢复时,鞥直接利用指令将其恢复;

[root@jiankong ~]# iptables-save >/home/iptalbes.text(filename)

上面的指令用于将主机上的防火墙规则保存到filename文件,该文件为ascii格式
,可以进入查阅。

[root@jiankong ~]# iptables-restore < filename

上面的指令用于将filename防火墙规则文件,(注意,不是shell scripts)的格式
读入当前Linux主机环境中