防火墙设置:iptables
太烦?试试 Ubuntu 自带的 Uncomplicated Firewall 简易墙 吧。这篇文章讲解了简单的 ufw
配置及命令。本文基于 Ubuntu 16.04 LTS。
0x00 - 安装
Ubuntu 默认是有 ufw
的。如果因为种种原因没有的话:
$ sudo apt-get install ufw
0x01 - 初步配置
$ sudo nano /etc/default/ufw
a. 开启 ipv6 (optional)
IPV6=yes
b. 设置默认规则
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
0x02 - 设置 incoming 规则
a. 允许 ssh
$ sudo ufw allow 22/tcp
请自行替换成你的 ssh 端口,要不然锁外面了~
b. 允许 http, https
$ sudo ufw allow 80
$ sudo ufw allow 443
c. 允许端口段
$ sudo ufw allow 1000:2000/tcp
d. 允许 ip
$ sudo ufw allow from 192.168.100.2
e. 设置允许 ip / subnet 访问特定端口
$ sudo ufw allow from 192.168.100.0/24 to any port 3306
f. 设置禁止规则
修改 allow
为 deny
即可。
0x03 - 开启 UFW
$ sudo ufw enable
0x04 - 查看 UFW 状态
$ sudo ufw status [verbose|numbered]
0x05 - 删除规则
$ sudo ufw delete allow 1000:2000/tcp
或
$ sudo ufw status numbered
$ sudo ufw delete [number]
[number]
为上一条返回的规则号码
0x06 - 其他
a. 关闭 UFW
$ sudo ufw disable
b. 重设 UFW
$ sudo ufw reset
c. 开启关闭 Logging
$ sudo ufw logging [on|off]
0x07 - Docker 的坑
你开了个 Docker 容器,绑定了 -p 3306:3306
并开启了 ufw
。发现竟然外网可以直接访问!!
原来 Docker 会默认直接加规则到 iptables,所以 UFW 防火墙对 docker 无效。
解决方案请参考:「Docker 学习笔记(三) - Docker 端口映射与防火墙」
0x08 - 端口转发
中转服务器:4000 -> 目标服务器:5000
$ sudo ufw disable
$ sudo nano /etc/ufw/before.rules
在 * filter
之前加入
# SS Forwarding
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 4000 -j DNAT --to-destination <remote ip>:5000
-A PREROUTING -p udp --dport 4000 -j DNAT --to-destination <remote ip>:5000
-A POSTROUTING -p tcp -d <remote ip> --dport 4000 -j SNAT --to-source <server ip>
-A POSTROUTING -p udp -d <remote ip> --dport 4000 -j SNAT --to-source <server ip>
COMMIT
根据网络情况不同,这里填写的中转服务器(俗称跳板机)<server ip>
可能是公网 IP
(例:阿里云 ECS:经典网络)也可能是内网 IP
(例:阿里云 ECS:专用网络)。
注意: COMMIT
之后要空行。不需要再添加 ufw allow 4000
的规则。
之后开启 UFW:
$ sudo ufw enable
如果不通的话重新更改则需要 sudo reboot
重启,因为 iptables 会有重复的规则不方便测试。
可以通过这个来查看目前 iptables 的 nat 规则:
$ sudo iptables -L -t nat
Source:
Sources & Links:
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。