Iptables
iptables
iptables 的结构:iptables -> Tables -> Chains -> Rules
规则、表和链
规则
规则就是我们设置的那些个过滤的条件,一般规则是:如果数据包头满足这样的条件就这样处理数据包
规则指定了源地址、目的地址、传输协议(TCP\UDP\ICMP)、服务类型(HTTP\FTP\SMTP)等,昂数据包与规则匹配的时候,iptables 就根据定义的方法处理这些数据包,如:放行 accept、拒绝 reject、丢弃 drop 等
链
链就是数据包传播的路径,每一条链中有一条或多条规则,数据包到达一条链时,iptables 就会从该链中的第一条规则开始检查,如果满足规则就根据这个规则定义的方法处理数据包,否则继续检查下一条规则,如果数据包不符合链中任何一条规则,iptables 就根据这条链预先定义的默认策略处理数据包
表
默认有四个表 filter、NAT、Mangle、Raw
(1) 一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转发出去
(2) 如果数据包就是进入本机的,它就会沿着图向下移动,到达 INPUT 链。数据包到了 INPUT 链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达POSTROUTING 链输出
(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD 链,然后到达 POSTROUTING 链输出
使用方法
iptables -F 删除所有规则
iptables -L -v -n 查看规则,其中还有个 -t 表示看哪个表,不指定默认是 filter
防火墙
在虚拟机使用 python 启动一个 http 的服务器,监听在 80 端口,正常情况下是可以访问的
使用 iptables -t filter -A INPUT -j DROP -p tcp --dport 80
-t filter 是指定 filter 表,-A 表示添加,INPUT 是添加的链,-j 表示规则,-p 表示协议(TCP\UDP\ICMP...),--dport 表示端口,整条规则表示丢弃从 80 端口进来的流量
使用 iptables -t filter -D INPUT 1
-D 表示删除,INPUT 表示删除的链,1 表示链上第一条规则(如果不知道规则,使用 iptables -L --line-numbers)
当然也可以指定某个 IP 不能访问 80 端口:
iptables -t filter -A INPUT -s 192.168.127.128 -j DROP -p tcp --dport 80
指定某个 IP 能访问,其他 IP 不能访问
iptables -t filter -A INPUT -s 192.168.127.128 -j ACCEPT -p tcp --dport 80
iptables -t filter -A INPUT -j DROP -p tcp --dport 80
因为匹配顺序是从上往下的,所以如果这个顺序反过来就先匹配到了全都 DROP,直接就给丢弃了,哪怕是 192.168.127.128 也不行
有的时候使用 iptables -L -n 看的不全,比如如果看到有一条
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
结果怎么都访问不到,可能是你有个参数没看到,使用 iptables -L -nv 看的仔细一点会发现,in 上有个 lo 表示本地回环,所以白搭
pkts bytes target prot opt in out source destination
28 4801 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
比如下面这个场景
iptables -t filter -I INPUT -s 192.168.127.128 -j ACCEPT -p tcp --dport 80
iptables -t filter -A INPUT -i lo -j ACCEPT -p all
iptables -t filter -A INPUT -j REJECT --reject-with icmp-net-unreachable
这种情况下第一条说的是 192.168.127.128 能访问到我们的 80 端口,第二条表示本地回环的随便访问,第三条表示其他主机一律回应 icmp-net-unreachable
此时查看 iptables 效果如下
root@research:~# iptables -L -vn
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
11 1281 ACCEPT tcp -- * * 192.168.127.128 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-net-unreachable
----------------------------------------------------------------------------------------------------------------
root@research:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.127.128 0.0.0.0/0 tcp dpt:80
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-net-unreachable
流量转发
网络情况如下,我们的电脑是 PC,可以访问 A 设备,但是访问不到 B 设备
在 A 设备上使用 iptables 进行流量的转发,使得 PC 可以通过 A 设备登录到 B 设备的 SSH
这里转发的时候要使用 nat 这个表,PREROUTING 链是流量首先进入的链,经过这个链的处理再干别的,所以我么在这条链上新建了一个规则,把去 192.168.127.170 的 6666 端口的流量修改目的地址为 192.168.47.131:22
iptables -t nat -A PREROUTING -d 192.168.127.170 -p tcp --dport 6666 -j DNAT --to-destination 192.168.47.131:22
然后通过 nat 表 POSTROUTING 链把去往 192.168.47.131:22 的源地址改为 192.168.47.129
iptables -t nat -A POSTROUTING -d 192.168.47.131 -p tcp --dport 22 -j SNAT --to-source 192.168.47.129
上面两条规则实际上就是把流量包里面的源地址和目的地址全都改了,这样来看就成了 192.168.47.129 在和 192.168.47.131 通信了
另外我们把流量包都给改了,数据包出了 PREROUTING 链之后是根据目标地址选择去向的,如果是本机地址那就进入 INPUT 链,如果是其他地址就进入 FORWARD 链,因为我们改了目标地址,所以会进入到 FORWARD 链,而这个链默认会拒绝所有的地址,所以我们得加上一个 192.168.47.131 的 ACCEPT
iptables -I FORWARD 1 -d 192.168.47.131 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD 2 -s 192.168.47.131 -p tcp --sport 22 -j ACCEPT
话说,只是规定了从 A 到 B 没规定从 B 到 A 之后再咋到 PC 啊?
再试一下,换台电脑,win7,IP 是 192.168.47.130 ,尝试通过端口转发,使用 192.168.127.170 连一下远程桌面
iptables -t nat -A PREROUTING -d 192.168.127.170 -p tcp --dport 9999 -j DNAT --to-destination 192.168.47.130:3389
iptables -t nat -A POSTROUTING -d 192.168.47.130 -p tcp --dport 3389 -j SNAT --to-source 192.168.47.129
iptables -I FORWARD 1 -d 192.168.47.130 -p tcp --dport 3389 -j ACCEPT
iptables -I FORWARD 2 -s 192.168.47.130 -p tcp --sport 3389 -j ACCEPT
参考:
https://www.cnblogs.com/Dicky-Zhang/p/5904429.html
https://wooyun.js.org/drops/Iptables%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B.html
https://macdfree.cc/post/iptables%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/