linux主机的防火墙一般有两张表  filter 和 nat, filter中含有 INPUT(数据包的目的地为本机), OUTPUT(数据包的源地址为本机), FORWAR(数据包只是通过本机) 三条链; 在 nat表中含有 PREROUTING(路有前),  POSTROUTING(路由后), OUTPUT(本机发出的数据包)三条链。

service iptables status #查看当前iptables是否开启

service iptables start , 开启iptables服务; service  iptables stop 关闭iptables服务。

iptables 语法规则:

(1)清除规则和查看规则

 iptables [-t table]  [-L]  [-n]  # -t 选择查看的是 filter表或者是nat表, 默认为filter表; - L 查看; -n 不进行ip地址和域名的转换,加快显示速度。

如果要清除规则:  使用 iptables [-t tables]  [- FXZ] 

# -F 清除所有的已设的规则, -X 杀掉所有用户建立的链, -Z 将各个链的流量统计归零

# 要注意,如果是远程联网进行设置,这三个指令必须用脚本连续执行,否则自己会被主机挡在门外。

(2) 定义策略(策略是当一条链中之前所有的rule都不满足的时候,最后对数据包的默认操作)

iptables [-t table]  [- P]  [INPOUT, OUPUT, FORWAR, PREROUTING, POSTROUTING, OUTPUT]  [ACCEPT, DROP]

参数:

-P 定义策略, P大写

INPUT, OUPUT, FORWARD,. PREROUTING, POSTROUTING, OUTPUT 为 filter或 nat表的链。 

ACCEPT, DROP 为默认的策略

(3)增加或删除规则

以设置filter表的链为例:

iptables [-t table]  [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, OUTPUT, FORWARD fitler table的 三条链

-i 设置数据包进入的网卡接口

-o 设置数据包流出的网卡接口

interface 网卡接口, 例如 ppp0, eth0, eth1.....

-p 注意小写。为数据包使用的协议

tcp: 数据包为tcp协议的数据包, udp: 数据包为udp协议的数据包; icmp: 数据包为icmp协议的数据包; all 表示为所有协议的数据包

-s :来源数据包的ip或network 网段。

--sport : 来源数据包的端口号, 也可以使用port1: port2,, 如 21:23 表示同时通过 21, 22, 23 端口。  --两个短横线

-d 目标主机的IP地址或网段

--dport 目标主机的端口号 。 两个短横线

-j 动作,可以为 ACCEPT接受, DROP 丢弃, LOG 将该数据包的信息记录下来,默认放到 /var/log/messages 文件。

例如,将来自lo接口的所有数据包都予以接受。 # iptables -A INPUT -i lo -j ACCEPT

注意,没有-d , --dport, -s, --sport 等参数都没有设置,这表示不论数据包来自何处或去哪里,只要是来自lo接口,都予以接受。即没有设置的规定,则表示该规定完全接受。

除了上述功能,iptables还可以使用网卡硬件地址mac 地址进行分析;而且ping指令响应数据包的ICMP协议也可以进行设置。此外,TCP数据包的Header上SYN 标记的功能与否也能够设置。

iptables的其他相关参数说明:

[ ! ] --syn: 这个设置仅用于-p  tcp规则,因为TCP数据包有syn标记。当TCP数据包带有syn标记,表示这个连接是对方主动发起或者对本地请求连接的响应;若在--syn 之前加上 ! 表示该数据包不带有syn标记。即对不含有syn标记的tcp数据包进行设置。

例如:将来自192.168.100.200 的主动连接的数据包丢弃。 iptables -A INPUT -p tcp -i eth0 -s 192.168.100.200 --syn -j DROP

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

例如如果不想让对方ping到自己的主机,可以使用: itpables -A INPUT -p icmp --icmp-type 8 -j DROP

当使用这个规则后,对方ping自己的主机,则本机不会响应,对方就显示无法连接您的主机。

-m 表示数据包的状态,有以下几种情况:

(a) -m  mac --mac-source aa:bb:cc:dd:ee:ff

这就是 可以控制mac地址的方法,其中aa:bb:cc:dd:ee:ff是网卡的mac地址。

(b) -m state --state<状态>

多种状态,包括 : INVALID: 无效的数据包, 例如数据破损的数据包的状态;

 ESTABLISHED: 已经连接成功的连接状态; 

NEW 想要新建连接的数据包状态; 

RELATED: 这个最常用,与我们主机发出的数据包有关,可能是响应数据包,或者是连接成功之后的传送数据包。通常情况下,启用这个状态,因为设置它之后,只要未来由本机发送出去的数据包,即使我们没有设置数据包的INPUT规则,有关他的数据包还是可以进入我们的主机。可以简化相当多的设置规则。

例如将 aa:bb:cc:dd:ee:ff 网卡无法使用我们主机的资源

iptables -A INPUT -p all -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP

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

#iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

#iptables -A INPUT -p tcp -m state --state INVALID,NEW -j DROP

注意数据包状态用逗号隔开,但是逗号两边不能有空格, 如 ESTABLISHED,RELATED.


-j 动作,除了常见的ACCEPT和DROP动作外,还有如下动作: 

(a)  REDIRECT --to-ports<port number>

这个也常见,就是进行本机端口的转换,不过,特别注意的是这个仅能在nat table的PREROUTING以及OUTPUT链上使用。

(b)  MASQUERADE 数据包伪装,这个就是NAT主机最重要的一个功能,进行数据包的伪装。

例如,将要求与80端口连接的数据包转发到8080端口。

#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

在您使用了非正规端口来启动某些well known协议,例如使用8080端口启动www,但是别人都以为你使用的是80端口,此时,您就可以使用该方式将对方连接到您主机的网连到8080.

例如,进行数据包的伪装,将来自192.168.0.0/24 的数据包的来源ip 伪装成本机ppp0 接口的ip

#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE


(4) 记录与恢复防火墙规则

记录: #iptables-save > filename, 重定向到filename文件

恢复: #iptables-restore < filename

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