鸟哥把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 >(filename)上面的指令用于将主机上的防火墙规则保存到filename文件,该文件为ascii格式
,可以进入查阅。

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

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

https://blog.51cto.com/summervast/328615