防火墙和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)