使用iptables命令配置防火墙
构建防火墙的通常三步:
- 清楚所有规则
- 设置防火墙策略
- 设置防火墙规则
基本语法:
iptables [-t table] CMD [option] [chain] [matcher] [-j target]
- 表(table):可以是raw/mangle/nat/filter/security,默认是filter
- 操作命令(CMD):包括添加、删除、更新链规则、创建自定义链等
- 链(chain):针对不同用途指定要操作的链
- 规则匹配器(matcher):指定各种匹配规则,如IP地址、端口、包类型等
- 目标(target):当规则匹配一个包时,真正要执行的任务用目标标识,如接受或拒绝,每条规则只能有一个目标
注意:iptables命令严格区分大小写,所有表名用小写,所有的链名有大写,所有规则匹配用小写
清除防火墙
语法:iptables [-t table] [-FXZ] [chain]
操作命令 | 说明 |
---|---|
-F或 --flush | 清楚指定链和表中的所有规则,若没有指定链,则清空所有链 |
-X或 --delete-chain | 删除指定的用户自定义链,必须保证链中的规则都不在使用时才能删除链,没有指定链,删除所有用户自定义链 |
-Z 或 --zero | 对链中的包计数器和字节计数器清零 |
设置防火墙策略
语法:iptables [-t table] -P [chain] ACCEPT | DROP
配置链的默认策略的一般三种方法:
-
先允许所有包,然后设置规则禁止有危险的包
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT -
先禁止所有包,然后设置规则允许安全包
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP -
先允许所有包,再允许特定包,最后禁止所有包
iptables -P INPUT DROP
iptables -A INPUT -j ACCEPT
iptables -P OUTPUT DROP
iptables -A OUTPUT -j ACCEPT
iptables -P FORWARD DROP
iptables -A FORWARD -j ACCEPT
设置防火墙规则
语法:iptables [-t table] <CMD> [<option>] <chain> <rules> -j <target>
iptables链操作命令(CMD)
操作命令 | 说明 |
---|---|
-A 或 --append | 在所选链尾加入一条规则 |
-I 或 --insert [ rulenum] | 用给出的规则号在所选链中插入一条规则 |
-R 或 --replace rulenum | 用给出的规则号在所选链中替换一条规则 |
-D 或 --delete rulenum | 用给出的规则号在所选链中删除一条规则 |
-L 或 --list [–line-numbers] [-v] [-n] | 列出指定链的所有规则,若没有指定链,则列出所有链。选项–line-numbers用于显示规则编号,选项-v使输出详细化,选项-n在输出中以IP地址和端口数值形式显示,而不是默认的名字 |
-N 或 --new-chain < chain-name> | 以给定的名字创建一条新的用户自定义链,不能与已有链同名 |
-E < old-chain-name> < new-chain-name> | 改变自定义链的名字 |
iptables常用的匹配规则(rules)
参数 | 说明 |
---|---|
-s [!] address[/mask] | 匹配数据包的源地址或地址范围 如 -s 192.168.1.0/24 |
-d [!] address[/mask] | 匹配目的地址或地址范围 如 -d 192.168.1.0 |
-i [!] interface name[+] | 匹配数据包从哪个网络接口流入,默认为所有接口 |
-o [!] interface name[+] | 匹配数据包从哪个网络接口流出,默认为所有接口 |
-p [!] protocol | 指出要匹配的协议 |
-m | 实现扩展匹配 |
注意:每一条命令中的多个匹配条件是“与”关系。
协议参数(-p)的用法
协议 | 相关参数 | 说明 | 举例 |
---|---|---|---|
-p tcp 或 -p udp | –sport | 匹配规则的源端口或端口范围 | -p udp --sport 1024:65535 |
-p tcp 或 -p udp | –dport | 匹配规则的目的端口或端口范围 | -p tdp --dport 80 |
-p tcp | –tcp-flags | 匹配指定的TCP标记,该选项有两个参数,都是列表,列表内部用逗号分隔,列表之间用空格分隔,第一个列表列出需要检查的标记,第二个列表指定在第一个列表中必须被设为1的“标记” ,也就是说第一个参数提供检查范围,第二个参数提供设置条件,匹配操作可识别的标记有: URG(U:Urgent紧急); ACK(A:Acknowledgement 回应); PSH(P:Push推进); RST(R:Rest 重置); SYN(S:Synchronize 同步); FIN:(F:Final 终止); 另外还有两个,ALL和NONE | -p tcp --tcp-flags SYN,FIN,ACK SYN 匹配SYN被设置为1,而FIN和ACK没有被设置的包, -p tcp --tcp-flags !SYN,FIN,ACK SYN 匹配那些FIN和ACK被设置而SYN没被设置的包 -p tcp --tcp-flags ALL NONE 匹配所有标记未置1的包 |
-p tcp | [!] --syn | 仅仅匹配设置了SYN位,清楚了ACK、FIN位的TCP包 | -p tcp --syn |
-p icmp | –icmp-type [!] typename | 匹配ICMP信息类型 | -p icmp --icmp-type 8 |
扩展匹配(-m)的用法
扩展 | 相关参数 | 说明 | 举例 |
---|---|---|---|
iprange | –src-range | 源地址内的任意IP均可匹配 | -m iprange --src-range 10.0.0.1-10.0.0.100 |
iprange | –dst-range | 目的地址内的任意IP均可匹配 | |
multiport | –sports | 源端口范围内的任意端口均可匹配 | |
multiport | –dports | 目的端口范围内的任意端口均可匹配 | -m multiport --dports 111,2049,10001:10004 |
multiport | –ports | 端口范围内的任意端口均可匹配 | |
state | –state | 使用链接跟踪进行状态匹配 | -m state --state INVALID,NEW |
conntrack | –ctstate | 使用链接跟踪进行状态匹配 | -m conntrack --ctstate INVALID,NEW |
mac | –mac-source | 匹配包的源MAC地址,只用于INPUT、PREROUTING和FORWARD链 | -m mac --mac-source 00:21:97:30:51:2B |
limit | –limit | 指定单位时间内允许通过的数据包的个数,单位时间可以是/second、/minute、/hour、/day或首字母 | -m limit --limit 3/hour --limit burst 5 |
limit | –limit-burst | 指定单位时间内最多可匹配数据包的个数,用来匹配瞬间大量数据包的个数 |
iptables常用的规则目标(target)
目标 | 目标说明 | 参数 |
---|---|---|
-j ACCEPT | 允许数据包通过 | |
-j DROP | 简单丢弃数据包 | |
-j REJECT | 拒绝数据包并用ICMP错误信息予以回应 | –reject-with < type> |
-j DNAT | 修改数据包的目的socket | –to-destination ipaddr [-ipaddr][:prot-prot] |
-j REDIRECT | 在防火墙上将数据包重定向至本机的另一个端口 | –to-ports port[-port] |
-j SNAT | 修改数据包的源socket | –to-source ipaddr[-ipaddr][:port-port] |
-j MASQUERADE | 与SNAT功能相似,知识无须指定–to-source | –to-ports port[-port] |
-j LOG | 使用rsyslogd记录日志,默认记录在/var/log/messages中 | –log-prefix --log-ip-options –log-tcp-options |
-j < custom chain> | 跳转到用户自定义链,执行后返回调用它的链 | |
-g < custom chain> | 跳转到用户自定义链,执行后不返回调用它的链 |
设置规则实例
1.允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
2.允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
3.送出的数据包目的端口为22
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
4.接收的数据包源端口为22
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
5.允许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
6.允许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT