名词
容器:Netfilter\iptables
Netfilter\iptables是表的容器,包含filter、NAT、MANGLE、RAW
表(TABLE)是链(CHAINS)的容器,包含INPUT、OUTPUT、FORWORD、PREROUTING、POSTROUTING
链是规则(POLICY)的容器,规则是一条条过滤的语句
filter表
默认表 : 包含INPUT、OUTPUT、FORWARD链
iptables -L -n 显示默认表filter的规则信息
-L (list) -n(number 以数字形式显示)
NAT表
地址转换表:包含OUTPUT、PREROUTING、POSTROUTING链
公网IP配置在防火墙上
内到外:POSTROUTING链,源地址转换,连接互联网
外到内:PREROUTING链,目标地址转换,连接内网
链(CHAINS)
规则链名包括(也被称为五个钩子函数(hook functions)):
- INPUT链 :处理输入数据包。
- OUTPUT链 :处理输出数据包。
- FORWARD链 :处理转发数据包。
- PREROUTING链 :用于目标地址转换(DNAT)。
- POSTOUTING链 :用于源地址转换(SNAT)。
流程
包过滤,根据规则一条一条来匹配,通过则接受,不通过则丢弃
默认规则:都匹配不上,按默认规则来操作,最后匹配的规则
指令
加载模块
modprobe ip_tablesmodprobe iptable_filtermodprobe iptable_natmodprobe ip_conntrackmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpmodprobe ipt_state
lsmod #显示内核的模块
iptables常用指令
参数 | 作用 |
---|---|
-P | 设置默认策略:iptables -P INPUT (DROP |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | num 在规则链的头部加入新规则 |
-D | num 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
--dport num | 匹配目标端口号 |
--sport num | 匹配来源端口号 |
-j | operation 执行某一操作 |
-j SNAT | 源地址转换 |
-j DNAT | 目的地址转换 |
命令选项输入顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
示例
查看特定表的规则
iptables -L -n -v -t <表名>
允许192.168.1.0/24网段访问自己的ssh服务
iptables -t filter -A INPUT -p ssh -s 192.168.1.0/24 -dport 22 -j ACCEPT
允许本地回环地址正常使用
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
配置IP白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT 允许192.168.1.0/24的所有机器访问
iptables -A INPUT -p tcp -s 114.114.114.114 --dport 80 -j ACCEPT 允许114.114.114.114访问80端口
放行icmp
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
允许已建立的连接和与它相关的连接的数据包进入防火墙
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
将以写入的规则保存到配置文件中,防止重启清除
cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak 备份
iptables-save > /etc/iptables/rules.v4 写入
cat /etc/iptables/rules.v4 查看
将规则用序号标记
iptables -L -n --line-numbers
删除规则
iptables -D INPUT <序号>
允许本地回环端口
iptables -t filter -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
封禁IP
iptables -t filter -I INPUT -s 114.114.114.0/24 -j DROP
内网访问互联网的地址转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 114.114.114.114
端口转发
iptables -t nat -A PREROUTING -p tcp -d 114.114.114.114 --dport 80 -j DNAT --to 192.168.0.1:80
将访问公网ip80端口的tcp报文转发到内网ip的80端口
场景
注意事项:规则需要保存到配置文件 /etc/iptables/rules.v4
场景1
开放 tcp 10-22/80 端口 开放 icmp 其他未被允许的端口禁止访问
iptables -t filter -A INPUT -p tcp --dport 10:22 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -P INPUT DROP
存在的问题: 本机无法访问本机; 本机无法访问其他主机
优化:
iptables -A INPUT -i lo -j ACCEPT 允许本机访问
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许已建立连接的服务相关的数据进入
场景2
允许外网访问: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
内部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp
iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,443,25,465,110,995,143 -j ACCEPT
iptables -A INPUT -p all -m multiport --dport 123,137,138,139,445,20,21,22,3306,1521 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
本文作者为A9bot,转载请注明。