IPtables分为2部分,一部分位于内核中,用来存放规则,称为NetFilter。还有一段在用户空间中,用来定义规则,并将规则传递到内核中,这段在用户空间中的程序就叫做iptables。
所以对于用户空间来说,就是按照需要生成一条条规则,然后向内核中提交,存放到NetFilter,让这些规则在数据传输与处理的过程中起作用。
1 iptable命令
iptable的整体命令规则如下:
- 所有表名必须小写
filter/nat/mangle - 所有链名必须大写
INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING - 所有匹配必须小写
-s/-d/-m <module_name>/-p - 所有动作必须大写
ACCEPT/DROP/SNAT/DNAT/MASQUERADE
1.1 表的介绍
- filter
主要用来过滤数据包,在这里根据包的内容与规则匹配,然后对包做DROP或ACCEPT等操作,大部分的target都可以在这儿使用。
默认的标准链有三条,分别是INPUT、FORWARD、OUTPUT,其他链(如br0_in、common)是根据需求新创建的。
- nat( Network Address Translation )
主要用于网络地址转换,做过NAT操作的数据包,地址将会根据设定的规则被改变。
- mangle
通过修改IP报头中的服务类型TOS,以获得更好的传输服务可以设为:最小时延、最大吞吐量、最高可靠性和最小费用 。
- raw
只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。RAW表可以应用在那些不需要做nat的情况下,以提高性能。
1.2 默认规则链的介绍
- PREROUTING:对数据包进行路由选择前(nat表中,DNAT)
- INPUT:路由选择之后,发现数据包目的地址是本机,入站时(filter表中)
- FORWARD:路由选择之后接收到需要通过防火墙发送给其它主机(转发时)(filter表)
- POSTROUTING:对数据包进行路由选择后,数据包到路由器进行路由判断之后经过的链(nat表,SNAT)
- OUTPUT:出站时(nat,filter表)
1.3 iptables对数据包的处理流程
- 数据包进入系统,经过IP校验后经过PREROUTING链中的Mangle和Nat的处理;
- kernel根据路由表决定包的目的地址,决定该数据包需要转发还是发给本机;
- 如果该数据包是发给本机的,则经过INPUT链的Mangle和Filter处理后再传递给上层协议;如果需要转发,则发给FORWARD链的Mangle和Filter进行处理;
- 本机网络层以上各层产生的数据包通过OUTPUT链的Mangle、Nat、Filter处理后,再进行路由选择;
- 所有需要发送到网络中的数据包,都必须经过POSTROUTING链的Mangle和Nat进行处理。
1.4 iptables匹配条件
1.5 iptables主要有以下动作:
- ACCEPT:接收数据包
- DROP:丢弃数据包
- REJECT:丢弃数据包并返回一个错误包
- SNAT:做源地址转化
- DNAT:做目的地址转化
- MASQUERADE:地址伪装,用于动态IP
- LOG:将这条匹配消息保存到系统日志中
- REDIRECT:在防火墙所在的机子内部转发包或流到另一个端口
- 用户自定义的链名(net2all):跳转到这条链下,进行匹配
2 具体应用
1.打开linux转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward
2.1 限速
注意:限速的包跟iptable的单位是不一样的,2/3
如max_speed:100kb/s,则为100*2/3=66
iptables -I FORWARD -s 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -m limit --limit 66/s --limit-burst 66 -j ACCEPT
iptables -I FORWARD -s 192.168.1.0/24 -m limit --limit 66/s --limit-burst 66 -j ACCEPT
如原本已经有了限速规则,要设置新的规则,则需要把原先的规则删除,再添加新的规则
原本max_speed:100kb/s,要设置max_speed:300kb/s;成则为300*2/3=200
iptables -D FORWARD -d 192.168.1.0/24 -m limit --limit 66/s --limit-burst 66 -j ACCEPT
iptables -D FORWARD -s 192.168.1.0/24 -m limit --limit 66/s --limit-burst 66 -j ACCEPT
iptables -D FORWARD -s 192.168.1.0/24 -j DROP
iptables -D FORWARD -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -s 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -m limit --limit 200/s --limit-burst 200 -j ACCEPT
iptables -I FORWARD -s 192.168.1.0/24 -m limit --limit 200/s --limit-burst 200 -j ACCEPT
原本max_speed:300kb/s,要设置max_speed:400kb/s;成则为400*2/3=266
iptables -D FORWARD -d 192.168.1.0/24 -m limit --limit 200/s --limit-burst 200 -j ACCEPT
iptables -D FORWARD -s 192.168.1.0/24 -m limit --limit 200/s --limit-burst 200 -j ACCEPT
iptables -D FORWARD -s 192.168.1.0/24 -j DROP
iptables -D FORWARD -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -s 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -m limit --limit 266/s --limit-burst 266 -j ACCEPT
iptables -I FORWARD -s 192.168.1.0/24 -m limit --limit 266/s --limit-burst 266 -j ACCEPT
去掉限制
iptables -D FORWARD -d 192.168.1.0/24 -m limit --limit 266/s --limit-burst 266 -j ACCEPT
iptables -D FORWARD -s 192.168.1.0/24 -m limit --limit 266/s --limit-burst 266 -j ACCEPT
iptables -D FORWARD -s 192.168.1.0/24 -j DROP
iptables -D FORWARD -d 192.168.1.0/24 -j DROP
2.2 MAC过滤/黑白名单
wifi过滤器,只允许某些mac链接
config wifi-iface
option device 'radio0'
option mode 'ap'
option ssid 'OpenWrt'
option network 'lan'
option encryption 'psk'
option key '12345678'
option macfilter 'allow'
list maclist '20:AB:37:8D:C2:F6'
list maclist 'A8:02:C4:00:75:3D'
不允许某些mac链接
config wifi-iface
option device 'radio0'
option mode 'ap'
option ssid 'OpenWrt'
option network 'lan'
option encryption 'psk'
option key '12345678'
option macfilter 'deny'
list maclist '00:05:15:0B:02:11'
list maclist 'A8:02:C4:00:75:3D'
vi /etc/firewall.user,然后按照这个格式添加,mac地址替换为实际地址。
添加黑名单,将mac为11:22:33:44:55:66的设备的包全部DROP
iptables -I FORWARD -m mac --mac-source 11:22:33:44:55:66 -j DROP
添加白名单,将所有的设备都丢弃,然后再只允许某一个mac通过
iptables -I FORWARD -s 192.168.1.0/24 -j DROP
iptables -I FORWARD -d 192.168.1.0/24 -j DROP
iptables -I FORWARD -m mac --mac-source 78:d7:5f:20:e2:9c -j ACCEPT
2.3 nat表的操作
Nat表有三条标准链(重点介绍):
- PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地(DNAT)
- OUTPUT链改变本地产生的包的目的地址(DNAT)
- POSTROUTING链在包就要离开防火墙之前转换包的源地址(SNAT)
(注:只有流的第一个包会被这个链匹配,其后的包会自动被做相同的处理)
实际的操作分为DNAT、SNAT和MASQUERADE
2.3.1 SNAT:源IP地址转换(POSTROUTING)(wan-lan通讯)
链接:https://pan.baidu.com/s/1MTvA46lD7eKNKZcdEgnqgw
提取码:9elj
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
这里要注意:地址伪装并不适用于所有的地方。
这个功能其实在路由器手机上默认都已经添加了,不然就都访问不了外网了。
2.3.2 DNAT:目的IP地址转换 (PREROUTING)
出口网关再将目的地址替换为私网的源主机地址,发回内部主机。
DNAT主要有两大用处
- 发布内部服务器,让外面的internet用户能访问到内网的服务器
- 网络重定向
典型的应用是,有个web服务器放在内网配置内网IP,前端有个防火墙配置公网IP,互联 网上的访问者使用公网IP来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网IP,防火墙会把这个 数据包的报头改写一次,将目标地址改写web服务器的内网IP,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网 IP变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。
如何做目标地址转换呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 8011 -j DNAT --to-destination 172.16.100.2:8011
目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
控制规则的存放以及开启
注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
2.4 protal认证(重定向)
https://blog.csdn.net/umitor/article/details/8622841
iptables -I FORWARD -p tcp -s 192.168.0.1/24 -j DROP 2>&1
iptables -t nat -I PREROUTING -p tcp -s 192.168.0.1/24 --dport 80 -j DNAT --to 192.168.0.1:8090 2>&1
iptables -t nat -I PREROUTING -p tcp -s 192.168.0.1/24 --dport 443 -j DNAT --to 192.168.0.1:1443 2>&1
iptables -t nat -I PREROUTING -p tcp -d 192.168.0.1 --dport 443 -j DNAT --to 192.168.0.1:2443 2>&1
iptables -D FORWARD -p tcp -s 192.168.0.1/24 -j DROP 2>&1
iptables -t nat -D PREROUTING -p tcp -s 192.168.0.1/24 --dport 80 -j DNAT --to 192.168.0.1:8090 2>&1
iptables -t nat -D PREROUTING -p tcp -s 192.168.0.1/24 --dport 443 -j DNAT --to 192.168.0.1:1443 2>&1
iptables -t nat -D PREROUTING -p tcp -d 192.168.0.1 --dport 443 -j DNAT --to 192.168.0.1:2443 2>&1
2.5 conntrack记录
2.cat /proc/net/ip_conntrack 记录
3.设置默认路由
拨上号后会有两个route
admin@TgT:/data/dropbear # netcfg
ppp0 UP 10.57.216.229/32 0x000010d1 00:00:00:00:00:00
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
rmnet_usb0 DOWN 0.0.0.0/0 0x00001002 b6:bd:b2:b4:51:56
wlan0 UP 192.168.1.1/24 0x00001043 10:65:cf:09:36:2b
...
rmnet7 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet0 UP 10.38.194.54/30 0x00000041 00:00:00:00:00:00
rmnet1 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
admin@TgT:/data/dropbear # ip route show
default via 10.38.194.53 dev rmnet0
default via 10.64.64.64 dev ppp0
10.38.194.52/30 dev rmnet0 proto kernel scope link src 10.38.194.54
10.38.194.53 dev rmnet0 scope link
10.64.64.64 dev ppp0 proto kernel scope link src 10.57.216.229
74.125.204.100 via 10.38.194.53 dev rmnet0
74.125.204.139 via 10.38.194.53 dev rmnet0
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.1
218.2.2.2 via 10.38.194.53 dev rmnet0
218.2.2.2 via 10.38.194.53 dev rmnet0 src 10.38.194.54
218.4.4.4 via 10.38.194.53 dev rmnet0
218.4.4.4 via 10.38.194.53 dev rmnet0 src 10.38.194.54
拨上号后,将rmnet0设置为默认路由,删除ppp0的默认路由
admin@TgT:/data/dropbear # ip route del default dev ppp0
admin@TgT:/data/dropbear # ip route add default dev rmnet0
admin@TgT:/data/dropbear # ip route show
default via 10.38.194.53 dev rmnet0
10.38.194.52/30 dev rmnet0 proto kernel scope link src 10.38.194.54
10.38.194.53 dev rmnet0 scope link
10.64.64.64 dev ppp0 proto kernel scope link src 10.57.216.229
74.125.204.100 via 10.38.194.53 dev rmnet0
74.125.204.101 via 10.38.194.53 dev rmnet0
74.125.204.139 via 10.38.194.53 dev rmnet0
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.1
218.2.2.2 via 10.38.194.53 dev rmnet0 src 10.38.194.54
218.4.4.4 via 10.38.194.53 dev rmnet0 src 10.38.194.54
掉线时,将ppp0设置为默认路由,删除rmnet0的默认路由
admin@TgT:/data/dropbear # ip route show
default dev ppp0 scope link
10.64.64.64 dev ppp0 proto kernel scope link src 10.57.216.229
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.1
iptables -nvL
iptables -nvL ACL_RULES