前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iptables防火墙与端口转发

iptables防火墙与端口转发

作者头像
yichen
发布2023-01-31 18:21:58
1.7K0
发布2023-01-31 18:21:58
举报

iptables 的结构:iptables -> Tables -> Chains -> Rules

规则、表和链

规则就是我们设置的那些个过滤的条件,一般规则是:如果数据包头满足这样的条件就这样处理数据包。规则指定了源地址、目的地址、传输协议(TCP\UDP\ICMP)等,当数据包与规则匹配的时候,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 端口,正常情况下是可以访问的

使用以下命令设置一个丢弃从 80 端口进来的流量规则,其中-t filter 是指定 filter 表,-A 表示添加,INPUT 是添加的链,-j DROP 表示丢弃,-p 表示协议(TCP\UDP\ICMP\...),--dport 表示端口

代码语言:javascript
复制
 iptables -t filter -A INPUT -j DROP -p tcp --dport 80

这时候再访问就不行了

使用以下命令删除规则 -D 表示删除,INPUT 表示删除的链,1 表示链上第一条规则(如果不知道是第几条,使用 iptables -L --line-numbers)

代码语言:javascript
复制
 iptables -t filter -D INPUT 1

当然也可以指定某个 IP 不能访问 80 端口:

代码语言:javascript
复制
iptables -t filter -A INPUT -s 192.168.127.128 -j DROP -p tcp --dport 80

指定某个 IP 能访问,其他 IP 不能访问

代码语言:javascript
复制
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 看的不全,比如如果看到有一条

代码语言:javascript
复制
ACCEPT     all  --  0.0.0.0/0        0.0.0.0/0

结果怎么都访问不到,可能是你有个参数没看到,使用 iptables -L -nv 看的仔细一点会发现,in 上有个 lo 表示本地回环,所以白搭

代码语言:javascript
复制
 pkts bytes target     prot opt in     out     source               destination         
   28  4801 ACCEPT     all  --  lo      *       0.0.0.0/0            0.0.0.0/0

比如下面这个场景

代码语言:javascript
复制
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 效果如下:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

再试一下,换台电脑,win7,IP 是 192.168.47.130 ,尝试通过端口转发,使用 192.168.127.170 连一下远程桌面

代码语言:javascript
复制
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

参考:

代码语言:javascript
复制
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/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档