文章摘要:本文描述了linux防火墙的命令规则说明,及简单实例。


防火墙的策略
防火墙策略一般分为两种:
一种叫“通”策略,默认大门是关着的,要定义谁能进;
一种叫“堵”策略,默认大门是开着的,要定义谁不能进;

当我们定义的策略的时候,要分别定义多条功能表,现在用的比较多个功能表有3个:

filter:过滤的功能,定义允许或者不允许的策略,一般只能做在3个链上:INPUT, FORWARD, OUTPUT;
nat:定义地址转换的策略,一般也只能做在3个链上:PREROUTING,OUTPUT,POSTROUTING;
mangle:修改报文原数据的功能,5个链都可以做:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING;

注意事项:
规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。


规则的写法:

#iptables [-t table] command [chain] [rules] [-j ACTION]

-t table:指定表名,如果省略则默认为filter表;
command:定义如何对规则进行管理(P/F/N/X/E/Z,A/I/R/D,L);
chain:指定规则链,当定义策略的时候,可以省略;
rules: 匹配标准;
-j ACTION :处理动作;


规则链 chain:

NetFilter规定了五个规则链:
1.PREROUTING (路由前);
2.INPUT (数据包流入口);
3.FORWARD (转发关卡);
4.OUTPUT(数据包出口);
5.POSTROUTING(路由后);
任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。


链管理命令(command)

-P :设置默认策略
默认策略一般只有两种 (DROP|ACCEPT)

#iptables -P INPUT DROP 

默认规则拒绝,关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。

-F: FLUSH,
清空规则链;

#iptables -t nat -F PREROUTING

清空nat表的所有链

#iptables -t nat -F 

注意事项:
清除操作会将本机防火墙的所有规则都清除,但却不会改变预设策略 (policy) ,如果你不是在本机下达清除指令时,而且默认策略为堵策略时,很可能会被挡在家门外;

-N:NEW 新建一个用户链

#iptables -N inbound_tcp_web 

-X: 用于删除用户自定义的空链;

-E:重命名用户自定义链;

#iptables -E oldname newname

-Z:将指定表中的数据包计数器和流量计数器归零;

# iptables -Z

规则管理命令(command)
-A:追加,在当前链的最后新增一个规则;
-I num : 插入,把当前规则插入为第几条;
-R num:Replays替换/修改第几条规则;
-D num:删除,明确指定删除第几条规则;
-L: 查看当前防火墙规则


规则查看命令

#iptables -L   

附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名;
-v:显示详细信息,越多越详细;
-x:在计数器上显示精确值,不做单位换算;
--line-numbers : 显示规则的行号;

-t nat:查看指定表名的规则;


匹配标准(rules)
[-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP和ICMP等以及all。
[-s 源IP地址 | 源子网]:源主机的IP地址或子网地址。
[--sport 源端口号]:数据包的IP的源端口号。
[-d目标IP地址 | 目标子网]:目标主机的IP地址或子网地址。
[--dport目标端口号]:数据包的IP的目标端口号。

-i:封包所进入的那个网络接口,例如 eth0, lo 等接口,需与 INPUT 链配合;
-o:封包所传出的那个网络接口,需与 OUTPUT 链配合;


指定动作:-j ACTION

DROP:悄悄丢弃,一般我们多用DROP来隐藏我们的身份以及链表;
REJECT:明确拒绝;
ACCEPT:明确接受;
DNAT:目标地址转换,改变数据包的目的地址;
SNAT:源地址转换,改变数据包的源地址;

custom_chain:转向一个自定义的链;
MASQUERADE:源地址伪装;
REDIRECT:重定向:主要用于实现端口重定向;
MARK:打防火墙标记的;
RETURN: 在自定义链执行完毕后使用返回,来返回原规则链。
LOG:日志记录

比如:不允许172.16.0.0/24的主机UDP协议访问

# iptables -t filter -A INPUT -s 172.16.0.0/24 -p udp --dport 53 -j DROP

-t filter 指定filter;
-A 追加规则
INPUT 指定规则链(输入)
-s 指定源地址0/24(0表示网段,24表示掩码为24个1,即255.255.255.0)
-p UDP,指定协议(不指定时为所有协议)
--dport 53 指定端口
-j DROP 执行动作丢弃;

显式拒绝:

# iptables -t filter -R INPUT 1 -s 172.16.0.0/24 -p udp --dport 53 -j REJECT

保存规则

#service iptables save 

规则将保存在/etc/sysconfig/iptables文件中,开机的时候,系统自动加载;

保存规则至文件

#iptables-save > /etc/sysconfig/iptables

从文件加载规则

#iptables-restore < /etc/sysconfig/iptables

注意事项:
通过iptables命令产生的规则会立即生效;
更新规则后必须调用保存命令,否则重启失效.


练习测试:

1.端口映射:将服务器的某个端口(8888),直接转发至LAN的某一主机上(6666)

# iptables -t nat -A PREROUTING -p all --dport 8888  -j DNAT --to 192.168.6.166:6666

2.将路由后的源地址修改为173.213.119.103

#iptables -t nat -A POSTROUTING -j SNAT --to 173.213.119.103 

3.将来自64.137.222.219的所有请求丢弃

# iptables -A INPUT -s 64.137.222.219 -j DROP

4.删除INPUT链中的第2条规则

# iptable -D INPUT 2

5.指定IP来的数据包,全部记录至日志/var/log/messages

# iptables -A INPUT -s 192.168.2.200 -j LOG

参考文档
http://www.linuxso.com/linuxpeixun/10332.html