iptables笔记

简介:

iptables的前身叫ipfirewall (内核1.x时代,当内核发展到2.x系列的时候,软件更名为ipchains,现在更名iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,让在内核空间当中的netfilter来读取,并且实现让防火墙工作。

内核空间中共有5个位置,用以执行用户空间的规则:

1.内核空间中:从一个网络接口进来,到另一个网络接口去的

2.数据包从内核流入用户空间的

3.数据包从用户空间流出的

4.进入/离开本机的外网接口

5.进入/离开本机的内网接口

这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链:

PREROUTING (路由前):

    在进入 IP 路由之前触发,就意味着只要接收到的数据包,无论是否真的发往本机,也都会触发这个钩子。它一般是用于目标网络地址转换(Destination NAT,DNAT)。

INPUT (数据包流入口):

    报文经过 IP 路由后,如果确定是发往本机的,将会触发这个钩子,它一般用于加工发往本地进程的数据包。

FORWARD (转发管卡):

    报文经过 IP 路由后,如果确定不是发往本机的,将会触发这个钩子,它一般用于处理转发到其他机器的数据包。

OUTPUT (数据包出口):

    从本机程序发出的数据包,在经过 IP 路由前,将会触发这个钩子,它一般用于加工本地进程的输出数据包。

POSTROUTIN (路由后):

    从本机网卡出去的数据包,无论是本机的程序所发出的,还是由本机转发给其他机器的,都会触发这个钩子,它一般是用于源网络地址转换(Source NAT,SNAT)

将使用场景和功能类似的规则组合在一起,通称为表:(security表不常用,所以一般都说4表5链)

raw表:

        用于去除数据包上的连接追踪机制(Connection Tracking)。

mangle表:

        修改报文原数据,修改数据包的报文头信息,比如服务类型(Type Of Service,ToS)、生存周期(Time to Live,TTL)。

nat表:

        定义地址转换的,用于修改数据包的源或者目的地址等信息,典型的应用是网络地址转换(Network Address Translation)。

filter表:

        定义允许或者不允许的,用于对数据包进行过滤,控制到达某条链上的数据包是继续放行、直接丢弃或拒绝(ACCEPT、DROP、REJECT),典型的应用是防火墙。

security表:

        用于在数据包上应用SELinux,这张表并不常用

表优先级:raw→mangle→nat→filter→security

其中

raw表 可作用在:PREROUTING、OUTPUT链

mangle表 可作用在:PREROUTING、FORWARD、INPUT、OUTPUT、POSTROUTING

nat表需要分情况:

        SNAT 可作用在: INPUT、POSTROUTING

        DNAT 可作用在: OUTPUT、PREROUTING

filter表 可作用在:INPUT、FORWARD、OUTPUT

写法:

格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

其中:

-t table :filter nat mangle等

COMMAND chain:定义如何对规则进行管理

-n 不进行反向解析,直接使用IP

-L 列出规则

    iptables -t filter -nL

-A 追加

    iptables -t filter -A INPUT -j ACCEPT

-I 插入

    iptables -t filter -I OUTPUT 3 -j ACCEPT 插入后作为第三条规则

-D 删除

    iptables -t filter -D INPUT 3 删除第三条

-R 替换

    iptables -t filter -R INPUT 3 -p tcp --dport 22 -j ACCEPT 将第3条规则替换成接下来的规则

-S 打印

    iptables -t filter -S [OUTPUT] 打印OUTPUT的链

-F 清空

    iptables -t filter -F [OUTPUT] 清空OUTPUT链的规则,如果不加链,则并清空表的规则

-Z 清空并置零

    iptables -t filter -Z [INPUT] 清空规则并将统计计数置零

-N 创建自定义链

    iptables -t filter -N docker-user

-X 删除自定义链

    iptables -t filter -X docker-user 要求先清空规则

-P 设置默认规则

    iptables -t filter -P INPUT ACCEPT

CRETIRIA:指定匹配标准

根据IP地址匹配:-s xxx.xxx.xxx.xxx/xx -d xxx.xxx.xxx.xxx/xx

根据端口匹配:-p tcp --dport 80 --sport 8888

根据协议匹配:-p icmp/http/tcp/udp

根据进出网口:-i ethX -o ethX

-j ACTION :指定如何进行处理,匹配到规则之后,需要做什么动作

DROP:

        直接将数据包丢弃。

REJECT:

        跟DROP类似,但会给请求方返回一些拒绝信息,给客户端返回 Connection Refused 或 Destination Unreachable 报文。

RETURN:

        跳出当前链,该链里后续的规则不再执行。一般用以自定义链

ACCEPT:

        同意数据包通过,继续执行后续的规则。

JUMP:

        跳转到其他用户自定义的链继续执行。

REDIRECT:

        在本机做端口映射。

        iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 6666

MASQUERADE:

        地址伪装,自动用修改源或目标的 IP 地址来做 NAT。

        iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

LOG :

        跟RETURN不同,LOG只是记录日志,并不会改变数据包的处理流程或导致数据包跳出当前链,系统日志路径为:/var/log/syslog or /var/log/messages

        iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH connection: "

-m 显示扩展

multiport 模块 :可以在一条规则中匹配多端口,指定多个端口用逗号分隔,连续端口用冒号

iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443 -j ACCEPT 

iprange 模块可以指定一段连续ip地址范围:

iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT 

string 模块:匹配数据包内容

    数据包中包含Hellworld 的数据不允许通过

iptables -t filter -A INPUT -p TCP -m string --string "Hellworld" --alog kmp -j DROP

time 模块:可以指定可访问的时间

    每天1 到 3 时之间不允许访问

iptables -t filter -A INPUT -p TCP -m time --timestart 1:00 --timestop 3:00 -j DROP

icmp 模块:可以限制icmp的包类型

iptables -t filter -A INPUT -p icmp -m icmp --icmp-type "echo-request" -j DROP

connlimit 模块:可以限制同时连接数

iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit 模块:可以限制速率

    每秒限制333个连接

   

iptables -t filter -A INPUt -p TCP -m limit 333/s -j ACCEPT

    每分钟只允许 5 个新的连接尝试,防止暴力破解攻击   

iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

示例:

本地端口转发:

        通过PREROUTING链,将外网访问4444端口转发到本机6666端口,此时本机访问4444并不进行转发

iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 6666

通过OUTPUT链,将本机访问4444端口转发到本机6666端口,此时外网访问4444并不进行转发

iptables -t nat -A OUTPUT -p tcp --dport 4444 -j REDIRECT --to-ports 6666

分流:通过PREROUTING链,将192.168.10.0/24网段访问4444端口的包转发到本机6666端口,其他网段则正常访问4444端口

iptables -t nat -A PREROUTING -p tcp -s 192.168.10.0/24 --dport 4444 -j REDIRECT --to-ports 6666

远程端口转发

1.开启Linux内核的转发功能,编辑 /etc/sysctl.conf文件

将net.ipv4.ip_forward = 0

修改为:net.ipv4.ip_forward = 1

2.修改完成后执行:

sysctl -p 使配置修改生效

DNAT模式:

        是用来做目的网络地址转换, 可以做某种类型地负载平衡。只能用在nat表的PREROUTING和OUTPUT链,并且有一个--to-destination选项指定要写入IP头的地址,可以是一个ip范围192.168.10.141-192.168.10.151

SNAT模式:

        用来源网络地址转换的,就是重写包的源IP地址。如果直接转发包的话,网络响应包上就不知道往哪儿发送应答,所以需要改为防火墙的地址。只能用在nat表的POSTROUTING链,且有一个--to-source选项

1、单独的地址。

2、一段连续的地址,如194.236.50.155-194.236.50.160,这样可以实现负载平衡。

iptables -t nat -A PREROUTING --dst 192.168.10.142 -p tcp --dport 4444 -j DNAT --to-destination 192.168.10.6:6666

iptables -t nat -A POSTROUTING --dst 192.168.10.6 -p tcp --dport 6666 -j SNAT --to-source 192.168.10.142

MASQUERADE模式:

        和SNAT模式作用一样,区别就是它不需要指定--to-source ,而是动态获取IP地址的连接的。比如,拨号上网、DHCP连接时我们ip是会变的。只能用于nat表的POSTROUTING链 ,有一个非必须--to-ports选项

iptables -t nat -A POSTROUTING --dst 192.168.10.6 -p tcp --dport 6666 -j MASQUERADE

iptables -t nat -A PREROUTING --source 172.16.250.1 -p tcp --dport 4444 -j DNAT --to-destination 172.16.250.3:22

iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999

iptables -t nat -A POSTROUTING --dst 172.16.250.3 -p tcp --dport 22 -j MASQUERADE

iptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139

自定义链的使用

定义一个名为ssh-rules的链来管理ssh登录的一些规则:

iptables -t filter -N ssh-rules1

在这个链中添加具体的规则:

iptables -t filter -A ssh-rules -s 18.130.0.0/16 -j ACCEPT
iptables -t filter -A ssh-rules -s 18.11.0.0/16 -j ACCEPT
iptables -t filter -A ssh-rules -j DROP1

然后将该链作为一个规则出口,挂在到iptable内置的链上:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ssh-rules

删除自定义链,需要先清空规则,然后再删除:

iptables -t filter -F ssh-rules
iptables -t filter -X ssh-rules

保存:

iptables-save > /etc/iptables.rules

恢复:

iptables-restore < /etc/iptables.rules



 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值