防火墙和iptables


iptables的基本语法格式

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

注意:-t 表名 不指定的话 默认为filter表。

 iptables命令选项

-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加

-i 指定数据包流入接口,若接口名后加"+",表示匹配该接口开头的所有接口

-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)

Options:
[!] --proto  -p proto                      指定要检查哪个协议的数据包:可以是协议代码也可以是协议名称,
                                           如tcp,udp,icmp等。协议名和代码对应关系存放在/etc/protocols中
                                           省略该选项时默认检查所有协议的数据包,等价于all和协议代码0
[!] --source -s address[/mask][...]        指定检查数据包的源地址,或者使用"--src"
[!] --destination -d address[/mask][...]   指定检查数据包的目标地址,或者使用"--dst"
[!] --in-interface  -i input name[+]       指定数据包流入接口,若接口名后加"+",表示匹配该接口开头的所有接口
[!] --out-interface -o output name[+]      指定数据包流出接口,若接口名后加"+",表示匹配该接口开头的所有接口
  --jump        -j target                  为规则指定要做的target动作,例如数据包匹配上规则时将要如何处理
  --goto        -g chain                   直接跳转到自定义链上
  --match       -m match                   指定扩展模块
  --numeric     -n                         输出数值格式的ip地址和端口号。默认会尝试反解为主机名和端口号对应的服务名
  --table       -t table                   指定要操作的table,默认table为filter
  --verbose     -v                         输出更详细的信息
  --line-numbers                           当list规则时,同时输出行号
  --exact       -x                         默认统计流量时是以1000为单位的,使用此选项则使用1024为单位

防火墙处理数据包的四种方式

ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

添加规则

#iptables -I INPUT -p icmp -j REJECT  //向链中插入一条规则(默认插入在第一条),对流入的所有icmp数据包,进行拒绝通过。

#iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP  //向链的尾部插入一条规则,对流入eth1网卡的所有源地址为192.168.0.0/16的数据包,进行丢弃。

封堵网段

# iptables -I INPUT -s 10.20.30.0/24 -j DROP   //对流入的 源地址属于10.20.30.0/24网段的所有数据包,进行丢弃。

# iptables -I FORWARD -s 10.20.30.0/24 -j DROP  //对转发链 源地址属于10.20.30.0/24网段的所有数据包,进行丢弃。

#iptables -I INPUT -s 192.168.1.3 -j DROP  //丢弃指定IP的数据包。

#iptables -A INPUT -i eth2 -s 192.168.1.2 -j  

限制ssh远程登录

#iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT  //入方向,对属于202.13.0.0/16网段的SSH数据包,允许通过。

#iptables -A INPUT -p tcp --dport 22 -j DROP  //入方向,拒绝所有ssh数据包通过。

限制端口开放

#iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT   //入方向,允许TCP开启20到1024提供服务。
#iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEP  //出方向,允许TCP开启20到1024提供服务。

#iptables -A INPUT -i eth1 -p tcp --dport 21 -j DROP  //丢弃所有通过 tcp 协议访问本机 21 端口的数据包

#iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP //丢弃来自192.168.1.0/24网段的1024:65535 端口的访问本机 ssh 端口的数据包

允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包

#iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT 
#iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

限制ping 

iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP  //禁止所有主机ping本机

iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT 
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT   //允许本机ping其他主机

查看iptables的链和规则

#iptables -L  //列出filter表中所有链的规则(默认为filter表)

#iptables -L  INPUT //列出filter表中INPUT链的规则

#iptables -L -V  //查看更详细的信息

 红框中的内容为链的名称及其默认策略,filter 表中所有链的默认策略都是 ACCEPT。红框下面的行代表什么呢?
target:代表进行的动作,ACCEPT 是放行,REJECT 是拒绝,DROP 则是丢弃数据包。
port:代表使用的协议,主要有 tcp、udp 和 icmp 三种。
opt:额外的选项说明。
source:规则针对的来源 IP。
destination:规则针对的目标 IP。
因为默认情况下没有添加自定义的规则,所以上图中这些行下面都是空的。

 清除本机防火墙规则

#iptables -F  //清空所有制定的规则

#iptables -X  //删除指定表中用户自定义的规则链(delete-chain)

#iptables -Z  //将所有表的所有链的字节和数据包计数器清零

保存iptables规则

#iptables-save > /etc/sysconfig/iptables

 或者

#service iptables save

参考资料:

1.iptables详解 - 永志 - 博客园 (cnblogs.com)

2.防火墙和iptables - 骏马金龙 - 博客园 (cnblogs.com)

相关