这里学习下iptables,用的是树莓派,树莓派用的系统Raspbian是基于Debian的,Ubuntu也源自Debian,而Ubuntu更多人知道,所以标题写的是Ubuntu。
简单来说,iptables是用来设置、维护和检查Linux内核的IP包过滤规则的,更多的解释反而让人迷惑,看实际使用来学习,参考:
https://www.cnblogs.com/jiu0821/p/5982070.html
最简单的一条命令:
sudo iptables -L
如下:
这里查看当前iptables规则,有3个常用的默认链,也就是Chain,分别为INPUT/FORWARD/OUTPUT,每个链的缺省策略为接受,即ACCEPT。
接着用下面的命令查看规则编号:
sudo iptables -L --line-numbers
如下:
这里num下面就是该规则的编号,如果没有添加过规则,可能就是空的输出,这里之所以有一条是因为我为了测试,添加了一条,如下:
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
这里-A参数意思是append,也就是将新规则追加到指定链的尾部,后面的INPUT就是指定的链。
-p参数意思是protocol,比如上面就指定为tcp协议。
--dport则是目的端口,3306是典型的mysql端口。
-j指定动作,这里是ACCEPT,除此之外还有DROP/REJECT/REDIRECT等。
iptables规则会立即生效,但是重启后则会丢失,因此需要设置iptables-persistent
sudo apt install iptables-persistent
sudo netfilter-persistent save
iptables-save这个命令我没用过,好像可以存储规则到文件,然后重启的时候恢复,不过系统有区别,直接用了iptables-persistent挺好用。
接着就是如何删除一条规则,如:
sudo iptables -L --line-number
得到输出为:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:mysql
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
删除第一条规则,命令为:
sudo iptables -D INPUT 1
这里-D参数意思是删除,后面跟的是链的名字,这里链为INPUT,链后面是该链下的规则序号,这里是1。
后面要学习一些别的较高级的内容,比如-t参数指定规则表。前面的命令没有加这个参数,则视为filter规则表。内建的规则表有三个,分别为nat/mangle/filter。这部分参考:
https://www.jianshu.com/p/58148d2d8416
nat规则表有prerouting和postrouting两个链,主要进行一对一、一对多和多对多等网址转译工作,如SNAT和DNAT。
filter规则表是预设规则表,有INPUT/FORWARD/OUTPUT三个规则链,用来进行封包过滤,如DROP/ACCEPT/REJECT等,基本规则建立在此。
既然说到了表,那么前面罗列规则的时候实际上是限于某个表的,所以如果查看别的,如我的nat表,命令如下:
sudo iptables -L -t nat --line-number
输出为:
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT tcp -- anywhere anywhere tcp dpt:50001 to:149.8.28.5
2 DNAT tcp -- anywhere anywhere tcp dpt:50001 to:149.8.28.5
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE tcp -- anywhere anywhere tcp dpt:50001
2 MASQUERADE tcp -- anywhere anywhere tcp dpt:50001
这里是我做端口转发的时候添加的规则,具体可以参考我的博客:
https://blog.csdn.net/u012911347/article/details/87805783
那么参考前面删除规则的命令,这里添加-t参数来删除该表中的规则:
sudo iptables -t nat -D PREROUTING 1
sudo iptables -t nat -D POSTROUTING 1
这样前面重复的规则就处理掉了,通过下面的命令查看端口转发情况:
sudo iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 77 packets, 4658 bytes)
pkts bytes target prot opt in out source destination
158 8216 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:50001 to:149.8.8.3
Chain INPUT (policy ACCEPT 77 packets, 4658 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 37 packets, 2344 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 37 packets, 2344 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:50001
-v是verbose,显示详细信息。