系统环境:
- centos 7.2.1511
从centos7 开始 由 firewalld 替换iptables 但是docker 使用的端口映射还是iptables。
基本原理:
iptables 是采用数据包过滤机制工作的,所以它会对请求的数据包的包头进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
iptables 规则是按照归的顺寻自上而下进行规律的。如果明确匹配上规则是否通过,数据包就不再继续匹配了。如果规则中没有明确的表明是否通过或没有匹配规则,由定义的默认规则来判断是否通过。
Iptables包括的表与链:
- FILTER:IPTABLES默认表
- INPUT
- OUTPUT
- FORWARD
- NAT:对进出主机的IP或端口进行转发
- PREROUTING
- OUTPUT
- POSTROUTING
- MANGLE:此表用于特殊的数据包更改
- PREROUTING
- OUTPUT
- INPUT
- FORWARD
- POSTROUTING
- RAW:
- PREROUTING
- OUTPUT
- SECURITY:由Linux安全模块(如SELinux)管理
- INPUT
- OUTPUT
- FORWARD
Chain链包括:
- INPUT:
- OUTPUT:
- FORWARD:
- PREROUTING:修改数据包的目的地址、目的端口等 常用于端口映射
- POSTROUTING:修改源地址、源端口 常用于共享上网
查看IPTABLES的内核模块:
lsmod |egrep 'nat|filter'
加载IPTABLES内核模块:
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
内核优化相关:
- centos 7-x
net.netfilter.nf_conntrack_acct = 0
net.netfilter.nf_conntrack_buckets = 16384
net.netfilter.nf_conntrack_checksum = 1
net.netfilter.nf_conntrack_count = 1
net.netfilter.nf_conntrack_events = 1
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_expect_max = 256
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_helper = 1
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_log_invalid = 0
net.netfilter.nf_conntrack_max = 65536
net.netfilter.nf_conntrack_tcp_be_liberal = 0
net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.nf_conntrack_tcp_max_retrans = 3
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_timestamp = 0
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.nf_conntrack_max = 65536
# net.netfilter.nf_conntrack_buckets 不能直接改(报错)
# 需要修改模块的设置:
echo 262144 > /sys/module/nf_conntrack/parameters/hashsize
- centos 6-x
net.nf_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 150
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 12
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
et.ipv4.tcp_fin_timeout = 1
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 60
# 再查看,bucket已经变成设置的大小
sudo sysctl net.netfilter.nf_conntrack_buckets
# max设为桶的4倍
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
suod sysctl -w net.nf_conntrack_max=1048576
参数详解:
IPTABLES 常用的命令参数
查看参数:
-L #列出规则以及链
-n #以数字显示地址
-v #详细模式
--line-number #显示序号
添加参数:
-A #添加规则:以append 追加方式添加
-I #添加规则:以insert 插入方式添加 可指定插入顺序
-N #创建一个新用户定义的链
删除参数:
-D #删除制定链的规则
-F #--flush 逐一清除所以规则
-X #删除一个用户定义的链
-Z #链的计数器清零
其它参数:
-i #指定进入的网卡接口(in-interface)
-o #制定出去的网卡接口(out-interface)
-s #指定源IP地址
-P #设置一个默认策略
#根据速率进行限制
-m limit
--limit #指定参数 second/minute/hour 秒、分、时
--limit-burst #指定并发
操作示例:
保存规则:
iptbales save
iptables-save >/etc/sysconfig/iptables
IPTABLE 行为处理:
ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)
添加端口规则:
#添加规则允许访问3306端口到规则最尾
iptables -t filter -A INPUT -p tcp --dport=3306 -j ACCEPT
#添加规则允许80端口到最顶部
iptables -t filter -A INPUT -p tcp --dport=80 -j ACCEPT
#添加规则拒绝443端口到第二行
iptables -t filter -A INPUT -p tcp --dport=443 -j DROP
删除规则:
iptables -t filter -D INPUT -p tcp --dport=3306 -j DROP
指定进入的网卡接口非10.0.0.1的IP不做DROP处理
iptables -t filter -A INPUT -i eth0 ! -s 10.0.0.1 -j DROP
封ICMP协议:
#指定除了10.0.0.5不能做PING
iptables -t filter -I INPUT -p icmp --icmp-type 8 -i eth0 ! -s 10.0.0.5 -j DROP
#指定不能做PING操作
iptables -t filter -I INPUT -p icmp --icmp-type any -j DROP
指定端口范围:
#指定封1~65535的端口
iptable -I INPUT -p tcp --dport 1:65535 -j DROP
#指定封1,2,3,4的端口
iptable -I INPUT -p tcp -m multiport --dport 1,2,3,4 -j DROP
根据连接状态(常用于封FTP):
连接状态参数:
NEW:已经或者启动新的连接
ESTABLISHED:已经建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
根据速率配置规则:
每分钟 不能请求超过20个 每次并非不能超过6个
iptables -A INPUT -s 172.16.0.0/16 -d 172.17.14.1 -p icmp --icmp-type 8 \
-m limit --limit 20/min --limit-burst 6 -j ACCEPT
默认规则设置:
iptables -P OUTPUT ACCEPT
iptables --policy FORWARD DROP
iptables --policy INPUT DROP
实现网关功能:
net.ipv4.ip_forward = 1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.0.0.17
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
映射多个外网地址
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j SNAT \
--to-source 124.42.60.11-124.42.60.16
实现端口映射:
iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.8:900
设置本机回环地址可以访问:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
其它:
iptable -A OUTPUT -s 172.17.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
相关网站:
Linux防火墙–iptables学习
iptables 深度详解
不要盲目增加ip_conntrack_max-理解Linux内核内存
通过调参解决:table full,dropping packet
nf_conntrack:table full,dropping packet
关于linux中的CONNTRACK_MAX和HASHSIZE要注意的地方
iptables高性能前端优化-无压力配置1w+条规则
net-nf-conntrack-max-设置异常问题