iptables

iptables

iptables 是用户空间的命令行工具,真正实现包过滤,转发,地址转化的 netfilter 模块

主要用途

  1. 进出规则过滤 ,在INPUT,OUTPUT,FORWARD 的filter表
  2. 共享上网 ,在POSTROUTING 上进行SNAT --to-source,需要开启net.ipv4.ip_forward = 1
  3. 内网地址,端口映射。 在PREROUTING 上进行DNAT --to-destination

iptables 表链关系

表/链 prerouting input output forward postrouting
raw
mangle
nat centos7
filter

表功能释意

raw 	取消nat表的追踪机制
mangle 	拆解报文,重新封装数据包
nat		地址转换和端口映射
filter 	包过滤

iptables 数据包流转流程示意图
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.删除连接跟踪模块
posted @ 2021-04-09 23:46  mingtian是吧  阅读(109)  评论(0编辑  收藏  举报