iptables应用大全_tcp/ip


iptables应用大全_服务器_02

iptables四表五链:
1、“四表”是指 iptables 的功能
——filter 表(过滤规则表):控制数据包是否允许进出及转发
——nat 表(地址转换规则表):控制数据包中地址转换
——mangle(修改数据标记位规则表):修改数据包中的原数据
——raw(跟踪数据表规则表):控制 nat 表中连接追踪机制的启用状况

2、“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含 多个数据链,防火墙规则需要写入到这些具体的数据链中。
——INPUT(入站数据过滤) :处理来自外部的数据
——OUTPUT(出站数据过滤):处理向外发送的数据。
——FORWARD(转发数据过滤):将数据转发到本机的其他网卡设备上
——PREROUTING(路由前过滤) :– 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
——POSTROUTING(路由后过滤): – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。

filter表有三个链:forward 、input、output
nat表有三个链:prerouting、postrouting、output
mangle表有五个链:prerouting、forward、input、output、postrouting

iptables规划:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

-i eht0 从哪个口进
-o eth0 从哪个网卡出

处理动作大全:accept、reject、drop、redirect、log、masquerade、dnat、snat、mirror、queue、return、mark

filter表使用的主要动作:accept、reject、drop、log

drop和reject区别是:如果是drop直接超时,不回发任何信息
如果是reject就会返回信息回来提示(目标端口不可达)Destination port unreachable

首先先来翻译一下dport和sport的意思:
dport:目的端口
sport:来源端口
初学iptables比较容易迷糊,但是我尽量用通俗的语言给你讲解。
dport 和sport字面意思来说很好理解,一个是数据要到达的目的端口,一个是数据来源的端口。
但是在使用的时候要分具体情况来对待,这个具体情况就是你的数据包的流动行为方式。(INPUT还是OUTPUT)
比如你的例子:/sbin/iptables -A INPUT -p tcp –dport 80 -j ACCEPT
注意里面的INPUT参数,这个代表你的这条数据包的进行的 “进入” 操作!
那么你的这条数据包可以这么描述:
1.这是一条从外部进入内部本地服务器的数据。
2.数据包的目的(dport)地址是80,就是要访问我本地的80端口。
3.允许以上的数据行为通过。
总和:允许外部数据访问我的本地服务器80端口。

再看第2条列子:/sbin/iptables -A INPUT -p tcp –sport 80 -j ACCEPT
1.这是一条从外部进入内部本地服务器的数据。
2.数据包的来源端口是(sport)80,就是对方的数据包是80端口发送过来的。
3.允许以上数据行为。
总结:允许外部的来自80端口的数据访问我的本地服务器。
input方式总结: dport指本地,sport指外部。

如果你的数据包是(OUTPUT)行为,那么就是另外一种理解方式:
比如:
/sbin/iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
1.这是一条从内部出去的数据。
2.出去的目的(dport)端口是80。
3.允许以上数据行为。
output行为总结:dport指外部,sport指本地。

iptables -nvL
查看规划所有

iptables -nvL --line-number
查看规则带编号

iptables -R INPUT 3 -j ACCEPT
修改第三条规则

iptables -F 规则清空
iptables -X
iptables -Z 清空记数器

iptables -R 替换规则

/etc/sysconfig/iptables-config
配置文件
例如增加ftp主和备动访问等模块:
IPTABLES_MODULES=“ip_conntrack_ftp ip_nat_ftp”

/etc/rc.d/init.d/iptables save
centos6保存重启不丢失

/etc/sysconfig/iptables
保存在这个文件里

[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ 确定 ]
centos7保存重启不丢失

iptables -A INPUT -j REJECT
默认放在最后拒绝所有

iptables -I INPUT -p tcp --dport 22 ACCEPT
放行22端口

iptables -I INPUT -s 192.168.1.5 -j DROP
在前面新增拒绝这个ip的所有通信,不写哪行就默认第1行

iptables -I INPUT 3 -s 192.168.1.3 -j DROP
插入一条规则到第3行

iptables -D INPUT -s 192.168.1.5 -j DROP
删除这条规则

iptables -L -n --line-number
看序号,直接删除序号对应的也可以
iptables -t filter -D INPUT 1

直接拒绝icmp 的请求包
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT
这时候尝试ping这台主机的话会出现
Reply from 192.168.50.131: Destination port unreachable.

iptables -t filter -P INPUT ACCEPT
input链默认全部允许

如果centos7 做为防火墙或路由网关,那就要两块网卡,内网卡不能设置网关,
只在里面填IP地址和子网掩码,如果再加一块网卡的话,如果从第一个配置文件
ifcfg-eth0复制的话,要注销掉uuid和mac地址,其它名称也要改成对应的。

开启centos7路由转发功能:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

马上生效:
sysctl -p

查看路由:
route -n

添加静态路由(放入脚本开机启动):
route add -net 192.168.100.0/24 gw 192.168.90.20

另一种方法加静态路由:
改配置文件(如果没有就增加这个文件,route-eth?要和出口网关对应上):
vi /etc/sysconfig/network-scripts/route-eth1
ADDRESS0=192.168.100.0
NETMASK0=255.255.255.0
GATEWAY0=192.168.90.20
如果有多个下一跳就把上面的0依次改为1…n
重启网卡服务

只允许22连接centos7路由器,把input链改为默认禁止所有连接,只开22:
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -P INPUT DROP

iptables在中间以路由模式对其它网段进行过滤全部用FORWARD链
禁止两个网段互ping
iptables -t filter -I FORWARD -p icmp -s 192.168.80.0/24 -d 192.168.100.0/24 -j DROP

禁止80段访问100的远程桌面,但是他可以反向连接
iptables -t filter -I FORWARD -p tcp -s 192.168.80.0/24 -d 192.168.100.0/24 --dport 3389 -j DROP

禁止80段访问100段的123主机的远程桌面,但是他可以反向连接
iptables -t filter -I FORWARD -p tcp -s 192.168.80.0/24 -d 192.168.100.123/32 --dport 3389 -j DROP

基于状态包过滤规则:
–state(NEW,ESTABLISHED,INVALID,RELATED)
new 表示该包属于一个新连接
related表示属于已建立的连接,类似于防火墙上的server-map表(ftp连接要用这个)
iptables -t filter -A INPUT -m state --state RELATED -j ACCEPT

禁止单个方向不能拼通
iptables -I FORWARD -p icmp -m icmp --icmp-type echo-request -s 192.168.80.123/32 -d 192.168.100.123/32 -j DROP

禁止多个端口连接
iptables -A FORWARD -p tcp -m multiport --dports 1:1024,3389 -s 192.168.80.123/32 -d 192.168.100.123/32 -j DROP

iptables -A FORWARD -p tcp -m iprange --src-range 192.168.80.1-192.168.80.10 -j DROP
限制IP范围段访问

iptables -A FORWARD -p tcp -m limit --limit 3000/second -s 192.168.80.123/32 -d 192.168.100.123/32 -j DROP
两个IP地址之间限速(一秒不能超过3000个)

对每个用户限速(每秒只允许最多300个数据包通过限制):
写个脚本生成:
vi /etc/sysconfig/limit.sh
for (i=2;i<254;i++)
do
iptables -I FORWARD -s 192.168.10.iptables应用大全_服务器_03i -m limit --limit 300/sec --limit-burst 400 -j ACCEPT
done

瞬间流量控制(5为数量包的数量):
-m limit --limit-burst 5

限制最大连接数(最多2个连接上去远程桌面):
iptables -A FORWARD -p tcp --dprot 3389 -m connlimit --connlimit-above 2 -s 192.168.80.0/24 -d 192.168.100.0/24 -j DROP

限制MAC地址访问:
iptables -A INPUt -m mac --mac-source C0-9F-8D-5F-6D

限制这个主机的MAC地址访问80网段:
iptables -A FORWARD -d 192.168.80.0/24 -m mac --mac-source C0-9F-8D-5F-6D

LOG动作日志设置在/etc/syslog.conf中,日志记录在:/var/log/message里面
添加iptabls-icmp标记,方便在message里查找
iptables -t filter -I FORWARD -p icmp -d 192.168.100.0/24 -j LOG --log-prefix “iptables-icmp”
iptables -t filter -A FORWARD -p icmp -d 192.168.100.0/24 -j REJECT
先记录日志,再阻止连接

centos7做为web服务器,用iptables保护,只允许123地址远程过来:
iptables -t filter -P INPUT DROP
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 22 -s 192.168.10.123/32 -j ACCEPT

recent模块实现服务器安全:
–seconds 指定时间
–set 将地址添加到列表,并更新信息,包含地址加入时间戳。
–rcheck 检查地址是否在列表,以第一个匹配开始计时。
–name 设定列表名,默认DEFAULT
–rsource 源地址,此为默认
–rdest目的地址
–remove列表中删除相应地址
–update和rcheck类似,以最后一个匹配开始计算时间
–hitcount命中次数

SSH连接一个客户端60秒只能连接2回,防穷举攻击,表名定义为SSHPOOL表
iptables -t filter -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 60 --hitcount 2 -j DROP //负责读表中的记录是否过了2个
iptables -t filter -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT //负责记录连接客户端数量
iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT //当已建立了,就允许进入。

保护网站防ddos攻击,每秒建立连接数限制:
iptables -t filter -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix “DDOS” --log-ip-options //先进行日志记录
iptables -t filter -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP //连接数量限制
iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT //已建立的连接不阻止。

设置打开端口钥匙(指定ping这个开启22服务的服务器,来打开允许ssh连接,完了再ping一个包就自动关闭连接):
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -j LOG --log-prefix “SSHOPEN” //先记录连接日志
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -m recent --set --name sshopen --rsource -j ACCEPT
//指定ping过来包为1078大小,包含IP头20和icmp头8,所以应该ping -l 1050
iptables -t filter -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 60 --name sshopen --rsource -j ACCEPT //看sshopen表中60秒内的记录如果有源地址就允许访问tcp22端口
iptables -t filter -AINPUT -p icmp --icmp-type echo-request -m length --length 1178 -m recent --name sshopen --remove -j ACCEP //ping个1178包大小就删除22端口连接了
iptables -A INPUT -m state --state ESTABLISHED -j ACCEP //已建立的就允许连接

保护网段安全,先改forward默认drop
从ens34网卡进来的,只可以访问此目标网段内的所有主机3389,其它禁止
iptables -t filter -I FORWARD -p tcp --dport 3389 -d 192.168.80.0/24 -i ens34 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEP //已建立的就允许连接,不然回不了包,建立不起来

NAT地址转换上网(外网ip是192.168.90.10):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens34 -j SNAT --to-source 192.168.90.10
如果有多个外线IP就:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens34 -j SNAT --to-source 192.168.90.10-192.168.90.12

端口映射(端口映射前必须先做好上面的nat地址转换):
iptables -t nat -A PREROUTING -i ens34 -d 192.168.90.10/32 -p tcp --dport 4000 -j DNAT --to 192.168.80.123:3389

修改通过iptables路由的TTL值,来迷惑攻击者
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 2 //经过就增加2个TTL值
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 3 //经过就删除3个TTL值
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 30 //改TTL回显为30开始递减