iptables
iptables
iptables 是用户空间的命令行工具,真正实现包过滤,转发,地址转化的 netfilter 模块
主要用途
- 进出规则过滤 ,在INPUT,OUTPUT,FORWARD 的filter表
- 共享上网 ,在POSTROUTING 上进行SNAT --to-source,需要开启net.ipv4.ip_forward = 1
- 内网地址,端口映射。 在PREROUTING 上进行DNAT --to-destination
iptables 表链关系
表/链 | prerouting | input | output | forward | postrouting |
---|---|---|---|---|---|
raw | √ | √ | √ | ||
mangle | √ | √ | √ | √ | |
nat | √ | centos7 | √ | √ | |
filter | √ | √ | √ |
表功能释意
raw 取消nat表的追踪机制
mangle 拆解报文,重新封装数据包
nat 地址转换和端口映射
filter 包过滤
iptables 数据包流转流程示意图
以centos7 为例一步步学些iptables
#centos7 安装iptables
#iptables 默认已经安装,只需要安装iptables-services
yum install iptables iptables-services -y
systemctl disable firewalld
systemctl stop firewalld
systemctl start iptables
systemctl enable iptabes
iptables -t filter -I INPUT -p icmp -j REJECT
iptables -t filter --line-number -xvnL INPUT
#
[root@ecs-ali ~]# ping 172.7.200.2
PING 172.7.200.2 (172.7.200.2) 56(84) bytes of data.
From 172.7.200.2 icmp_seq=1 Destination Port Unreachable
From 172.7.200.2 icmp_seq=2 Destination Port Unreachable
查询
iptables [-t table] -L chain
# 查询 -L, --list
iptables -t filter --line-number -xvnL INPUT
修改
iptables [-t table] [-F|-P] chain
# 清空规则 -F,--flush
iptables -t filter -F INPUT DROP
# 清除计数 -Z, --zero
iptables -t filter -Z INPUT
# 修改链的默认规则-P, --policy
iptables -t filter -P INPUT DROP
# 追加链 -A, --append
iptables -t filter -A INPUT -j ACCEPT
# 插入链 -I, --insert
iptables -t filter -I INPUT -j ACCEPT
iptables -t filter -I INPUT 2 -j ACCEPT
# 替换链 -R, --replace
iptables -t filter -R INPUT 1 -s 172.7.200.1 -p icmp -j ACCEPT
# 删除 -D ,--delete
iptables -t filter -D INPUT 1
指定源地址
# 指定源地址 -s, --source address[/mask]
iptables -t filter -I INPUT 1 -s 172.7.20.1 -j ACCEPT
# 指定多个source ip
iptables -t filter -I INPUT 1 -s 192.168.0.1,192.168.0.109 -j ACCEPT
# 指定一个 ip网段
iptables -t filter -I INPUT 1 -s 192.168.0.0/24 -j ACCEPT
# 取反
iptables -t filter -I INPUT 1 ! -s 192.168.0.0/24 -j DROP
指定目标地址
# 指定目标地址 -d,--destination address[/mask]
iptables -t filter -I INPUT 1 -d 192.168.0.111 -j ACCEPT
iptables -t filter -I INPUT 1 -d 192.168.0.111,192.168.0.110 -j ACCEPT
iptables -t filter -I INPUT 1 ! -d 192.168.0.111 -j DROP
指定协议
iptables -t filter -I INPUT -p icmp -j DROP
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j DROP
指定源端口
# 指定源端口 --sport
iptables -t filter -I INPUT -m tcp -p tcp --sport 1:65535 -j DROP
指定目标端口
# 指定目标端口 --dport --destination-port
iptables -t filter -I INPUT -m tcp -p tcp ! --dport 22 -j DROP
iptables -t filter -I INPUT -p udp ! --dport 53 -j DROP
指定接口
# 指定接口 -i, --in-interface
# 指定输入网卡,只能在 prerouting input forward 链
iptables -t filter -I INPUT -s 172.7.200.0/24 -i eth0 -p ICMP -j REJECT
# 指定接口 -o --out-interface
# 指定输出网卡 只能在 output forward postrouting 链
iptables -t filter -I FORWARD -s 172.9.200.0/24 -o eth0 -p tcp -j REJECT
模块
tcp
iptables -t filter -I INPUT -m tcp -p tcp --dport 22 -j ACCEPT
udp
iptables -t filter -I INPUT -m udp -p udp --dport 53 -j ACCEPT
multiport
iprange
limit
iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 2 -j ACCEPT
connlimit
# 限制连接数
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
#
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 255.255.255.0 -j DROP
state
iptables -filter -I INPUT -p tcp --dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
tcp-flags
动作
ACCEPT
DROP
REJECT
SNAT
MASQUERADE
DNAT
REDIRET
自定义链
自定义链
创建自定义链
#创建自定义链
iptables -t filter -N IN_WEB
# 插入一条规则
iptables -t filter -I IN_WEB -s 192.168.0.0/24 -p tcp -m multiport --dport 80,443 -m state --state ELSTABLISHED,RELATED -j ACCEPT
# 引用自定义链
iptables -t filter -I INPUT -j IN_WEB
#删除自定义链
iptables -t filter -D INPUT 1
iptables -t filter -F IN_WEB
iptables -t filter -X IN_WEB
共享上网问题
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 10.0.0.1
#
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# ip的一对一映射
iptables -t nat -I PREROUTING -d 192.168.0.111 -j DNAT --to-destination 10.0.0.1
# 映射多个地址
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 10.0.0.1-10.0.0.2
共享公网ip问题
iptables -t nat -I PREROUTING -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:8080
iptables -t nat -I POSTROUTING -s 172.7.21.0/24 !-o docker0 !-d 172.7.0.0/16 -j MASQUERADE
保存规则
保存规则到/etc/sysconfig/iptables
方式一
service iptables save
systemctl restart iptables
方式二
iptables-save > /etc/sysconfig/iptables
iptables-load < /etc/sysconfig/iptables
QA
- 业务系统访问很慢 在/var/log/message 中出现
kernel:nf_conntrack:table full,dropping packet
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
解决方法:
首先将memcached的连接方法改为长链接,然后再针对nf_conntrack进行修改,主要有以下几种方式:
1.关闭防火墙
2.加大iptables跟踪表大小,调整对应的系统参数
3.使用裸表,不添加跟踪标志
4.删除连接跟踪模块