这是很久之前的草稿,写的时候大概是2015年,现在(2020年8月),还有三个月centos 6系列就停止维护了,标志着iptables已经快入土了,简单整理了一下格式,还是发出来吧

1. iptables 开启日志

新建一个LOGGIN链:

iptables -N  LOGGING

将需要记录日志的规则跳转到LOGGING链:

iptables -A INPUT -s 192.168.100.0/24 -j LOGGING --log-level 4

也可以指定日志的前缀:

iptables -A INPUT -s 192.168.100.0/24 -j LOGGING --log-level 4 --log-prefix "IPTables-Dropped: "

日志记录在: /var/log/message ,如果想记录在不同的文件,需要配置syslog服务

2. 使用iptables进行单ip限速

创建一个新链:

iptables --new-chain RATE-LIMIT

按源IP进行限速,每秒中最多30个并发,突发20个:

iptables --append RATE-LIMIT \
    --match hashlimit \
    --hashlimit-mode srcip \
    --hashlimit-upto 30/sec \
    --hashlimit-burst 20 \
    --hashlimit-name conn_rate_limit \
    --jump ACCEPT

超过的ip直接DROP掉:

iptables --append RATE-LIMIT --jump DROP

记录日志:

iptables --append RATE-LIMIT --jump LOG --log-prefix "IPTables-Rejected: "
iptables --append RATE-LIMIT --jump REJECT

3. iptables 配合ipset 高效拉黑IP

iptables 拉黑大量ip时性能很差,更效的方式是使用ipset + iptables,先安装 ipset:

yum  install ipset

创建一个集合blackip,通过maxelem指定大小:

ipset create blackip hash:ip hashsize 4096 maxelem 10000000

集合有很多类型,hash:ip/hash:net/hash:ip,port,net 等等,可以满足各种类型的集合需求

使用iptables拒绝blackip集合中所有ip:

iptables -I INPUT -m set --match-set attack src -j DROP

也可以创建带超时时间的集合,ip拉黑后达到超时时间自动解封:

ipset create blackip hash:net hashsize 4096 maxelem 10000000000 timeout 7200

4. iptables 进行端口转发

先要开启服务器的IP转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

允许FORWARD:

iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

到本机eth0 8000端口的流量转发到192.168.1.200:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT --to-destination 192.168.1.200:8080

如果服务器上有多网卡,如一块公网网卡eth0(192.168.1.100),一块内网网卡eth1,还需做snat:

iptables -A POSTROUTING -d 192.168.1.100 -o eth1 -p tcp --dport 8000 -j SNAT --to-source 192.168.1.200:8080

或者使用:

iptables -t nat -A POSTROUTING -s 192.168.1.100 -o eth1 -j MASQUERADE

这样就实现了访问本机8000端口的流量转发到192.168.1.200:8080

参考文章:

https://making.pusher.com/per-ip-rate-limiting-with-iptables/
https://tecadmin.net/enable-logging-in-iptables-on-linux/