IPTABLES-基本原理与使用[未完成]

            <h4><strong>系统环境:</strong></h4>
  • centos 7.2.1511

从centos7 开始 由 firewalld 替换iptables 但是docker 使用的端口映射还是iptables。


基本原理:

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-设置异常问题

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注