(一)IPtables
是Linux系统自带的防火墙,支持数据包过滤、数据包转发、地址转换、基于MAC地址过滤、基于状态过滤、包速率限制等安全功能。
(1)Linux系统防火墙
netfilter是Linux防火墙框架
iptables是Linux防火墙管理工具,基于netfilter
firewalld是Redhat、CentOS等对iptables的包装
ufw 是Debian、Ubuntu等对iptables的包装
(二)作用
- 构建Linux主机防火墙
- 搭建网络防火墙
(三)IPtables规则
(1)数据包流程图
(2)4表5链(防火墙策略规则)
优先级:raw>mangle>nat>filter
4表 | 说明 | 作用 | 功能 |
filter表 | 包过滤(默认) | 过滤数据包,即根据规则决定是否允许数据包通过 | 实现基本网络安全功能,如阻止特定IP地址访问、允许特定端口访问等 |
nat表 | 网络地址转换 | 修改数据包的源或目标地址,实现网络地址转换 | 实现内网访问外网的功能,或者实现端口映射等 |
mangle表 | 包重构 | 对数据包进行特定修改,如修改TTL字段、标记数据包等 | 实现一些高级网络功能,如负载均衡、QoS等 |
raw表 | 数据跟踪处理 | 特殊表,在数据包进入连接追踪之前进行处理 | 特定的场景和需求 |
链附属于某表
5链 | 说明 | 描述 |
PREROUTING | 路由之前规则链 | 对数据包做路由选择之前 |
INPUT | 数据包入口规则链 | 收到访问本机地址的数据包时 |
FORWARD | 转发规则链 | 收到需要转发给其他地址的数据包时(需开启Linux内核ip_forward功能) |
OUTPUT | 数据包出口规则链 | 本机向外发送数据包时 |
POSTROUTING | 路由之后规则链 | 对数据包做路由选择之后 |
表链关系
工作流程:从上到下逐个匹配规则,匹配上则停止。默认规则在链上所有规则均未匹配上后执行。
(四)语法规则
iptables [OPTIONS] -t table -A chain [MATCH] -j target
表>链>规则
语法:iptables [-t table] command [chain] criteria –j action
table表 | command | chain链 | criteria规则 | action | ||
-t filter/nat/mangle/raw | -A(添尾) -D(删除) -I(插头) -R(替换) -L(列出) | -F(清空) -Z(清数) -N(新链) -X(删链) -P(默认) | PREROUTING INPUT FORWARD OUTPUT POSTROUTING | -p(协议) 默认all -s(源) -d(目标) -i(入网卡) -o(出网卡) --sport(源端) 等价--source-port --dport(目端) 等价--destination-port | --limit(速率) --mac-source(源) --state (INVALID、ESTABLISHED、NEW、RELATED)针对ICMP/TCP/UDP !(取反) | ACCEPT DROP REJECT LOG DNAT SNAT MASQUERADE (地址欺骗) REDIRECT |
-A = --append -Z = --zero -P = --policy | ||||||
--dport 8080:9090 -m multiport(离散端口) --dports 22,80 |
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回复信息。超时后才会反应。
REJECT:拒绝数据包通过,必要时响应信息。客户端请求后就会收到拒绝信息。
LOG:在/var/log/message文件中记录日志,然后将数据包传递给下一规则
(五)常见语法
(1)查询规则
-t:表名
-n:不解析IP地址
-v:显示出计数器信息,数据包数量和大小
-x:显示计数器精确值
--line-numbers:显示规则的序号(简写为--line)
-L:链名
iptables -t filter -nvxL --line
(2)增加规则
位置 | 语法 | 示例 | |
1 | 尾部添加 | iptables -t 表名 -A 链名 匹配条件 -j 动作 | iptables -t filter -A INPUT -s 192.168.1.146 -j DROP |
2 | 首部添加 | iptables -t 表名 -I 链名 匹配条件 -j 动作 | iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT |
3 | 指定位置添加 | iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作 | iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT |
(3)删除规则
规则 | 语法 | 示例 | |
1 | 按规则序号 | iptables -t 表名 -D 链名 规则序号 | iptables -t filter -D INPUT 3 |
2 | 按具体的匹配条件与动作 | iptables -t 表名 -D 链名 匹配条件 -j 动作 | iptables -t filter -D INPUT -s 192.168.1.146 -j DROP |
3 | 指定表链所有规则 | iptables -t 表名 -F 链名 | iptables -t filter -F INPUT |
(4)修改规则
规则 | 语法 | 示例 | |
1 | 修改指定表中指定链的指定规则 | iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作 | iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT |
2 | 设置指定表的指定链的默认策略 | iptables -t 表名 -P 链名 动作 | iptables -t filter -P FORWARD ACCEPT |
(5)保存&恢复
语法 | 说明 | 示例 | |
1 | iptables-save | 保存iptables规则,将当前配置的防火墙规则保存到一个文件中 | iptables-save > /etc/sysconfig/iptables |
2 | iptables-restore | 还原iptables规则,从一个文件中加载之前保存的防火墙规则 | iptables-restore < /etc/sysconfig/iptables |
(六)转发
方向 | 描述 | |
1 | 源NAT(SNAT) | 更改所有来自192.168.1.0/24的数据包的源IP地址为123.4.5.100 |
iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –o eth0 –j SNAT –to 123.4.5.100 | ||
2 | 目的NAT(DNAT) | 更改所有来自192.168.1.0/24的数据包的目的IP地址为123.4.5.100 |
iptables –t nat –A PREROUTING –s 192.168.1.0/24 –i eth1 –j DNAT –to 123.4.5.100 | ||
3 | 端口映射 | 将访问公网123.4.5.100:2222的数据包转发到内网10.0.0.20:22 |
iptables –t nat –A PREROUTING -p tcp –d 123.4.5.100 –dport 2222 –j DNAT –to-destination 10.0.0.20:22 | ||
iptables –t nat –A POSTROUTING -p tcp –d 10.0.0.20 –dport 22 –j SNAT –to-source 123.4.5.100 |
(七)配置案例
说明 | 命令 | |
1 | 清空已存在策略 | iptables -F或 iptables --flush |
2 | 设置默认策略 | 默认链策略是ACCEPT,改变所有链策略为DROP |
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP | ||
3 | 阻止某个指定IP | BLOCK_THIS_IP="x.x.x.x" iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP |
4 | 允许SSH | 允许所有通过eth0接口使用ssh协议连接本机 |
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT | ||
5 | 允许某个网段通过ssh连接 | iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
6 | 允许http和https | 允许http协议80端口 |
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT | ||
允许https协议443端口 | ||
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT | ||
7 | 多个策略联合 | 允许ssh、http、https iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT |
8 | 允许SSH连接其他主机 | iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
9 | 允许SSH连接指定网段 | iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
10 | 允许https出去 | iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT |
11 | 对web请求做负载均衡 | 每三个包均衡到指定服务器,需要扩展iptables |
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443 | ||
12 | 允许ping | iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT |
13 | 允许ping远程 | iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT |
14 | 允许本地回环 | 如果没有此规则,将不能通过127.0.0.1访问本地服务,例如ping 127.0.0.1 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT |
15 | 允许内网访问外部网络 | eth1连接外部网络,eth0连接内部网络 iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT |
16 | 允许DNS出去 | iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT |
17 | 允许NIS连接 | NIS端口是动态的,当ypbind启动时它分配端口,首先运行 rpcinfo -p 显示得到端口号 |
iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A INPUT -p tcp --dport 853 -j ACCEPT iptables -A INPUT -p udp --dport 853 -j ACCEPT iptables -A INPUT -p tcp --dport 850 -j ACCEPT iptables -A INPUT -p udp --dport 850 -j ACCEPT | ||
18 | 允许指定网段连接Rsync | iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT |
19 | 允许mysql从指定网段连接 | iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT |
20 | 允许sendmail或者postfix | iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT |
21 | 允许IMAP和IMAPS | iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT |
22 | 允许POP3和POP3S | iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT |
23 | 预防DOS攻击 | iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT |
24 | 端口转发 | iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22 iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT |
25 | 包丢弃日志 | iptables -N LOGGING#创建新链 iptables -A INPUT -j LOGGING#确保所有连接跳到新链 iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix “IPTables Packet Dropped:” --log-level 7 #自定义名 iptables -A LOGGING -j DROP #丢弃数据包 |