linux防火墙

概述

linux的防火墙有ufw和iptables两套命令,都是ip、url、端口的匹配规则

  • iptables:不仅仅能当防火墙,还能做端口转发、nat;但需要第三方软件 iptables-persistent 才能实现持久化规则
  • ufw:全称 ubuntu uncomplicated firewall,是Debian下的简化版iptables,ufw的规则会被记录到iptables中;自动持久化规则。

二者关系详见:参考

ufw

  • 查看防火墙状态,会显示<规则的编号>
sudo ufw  status numbered
  • 打开防火墙:刚配的诸规则立即生效,重启系统仍然开着服务器,规则都还在,即各规则均已自动持续化
sudo ufw enable
  • 关闭防火墙:重启系统仍然关闭
sudo ufw disable
  • 服务器重启:等价于先disable后enable
sudo ufw reload
  • 删除规则
sudo ufw delete <规则的编号>

iptables

参考:iptables常用命令及持久化 iptables原理及常用命令

基础命令

  • 开放端口出入
sudo iptables -A INPUT -p tcp --dport <端口> -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport <端口> -j ACCEPT
  • 查看规则列表
sudo iptables -L -n --line-number

输出

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            state NEW udp dpt:59828
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:59828
3    sshguard   all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:42038

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:42038

...
  • 查看规则命令
sudo iptables -S

输出例如

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N sshguard
-A INPUT -p udp -m state --state NEW -m udp --dport 59828 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 59828 -j ACCEPT
-A INPUT -j sshguard
-A INPUT -p tcp -m tcp --dport 42038 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 42038 -j ACCEPT
-A sshguard -s 77.81.229.207/32 -j DROP
-A sshguard -s 142.44.184.79/32 -j DROP
-A sshguard -s 211.159.150.10/32 -j DROP
...
  • 删除规则: sudo iptables -L -n --line-number 输出某个<Chain>的第<行号>行 的规则,删除之
sudo iptables -D <Chain> <行号>

例如 sudo iptables -D INPUT 2 删掉的是

...
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            state NEW udp dpt:59828
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:59828 # 删掉此规则
3    sshguard   all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:42038
...

规则的持久化

使用iptables-save iptables-restore 手动保存、加载规则;使用 iptables-persistent 来自动关闭保存、开机加载规则 【推荐】。

iptables-save

系统重启后 iptables不再有原来的规则。重启前可用使用iptables-save保存规则到文件,重启用iptables-restore加载文件中的规则。

  • 保存规则到文件

iptablbes-save 只是把当前iptables的规则,都以字符串形式输出到屏幕(标准输出)。需要手动重定向到任意自定文件,如 /etc/iptables.conf

sudo iptables-save | sudo tee /etc/iptables.conf
  • 加载文件中的规则

iptables-restore只是从标准输入读取规则,故需手动将自定文件重定向到此命令。

sudo iptables-restore < /etc/iptables.conf
  • 开机自动加载规则:可以自己写systemd service去执行上述加载命令,但不方便。推荐用iptables-persistent。

iptables-persistent 【推荐】

安装iptables-persistent,并开启其开机自启服务,可以实现持久化iptables的当前规则,并且重启后仍然保留。以下是详细介绍:

  • 安装iptables-persistent
sudo apt install iptables-persistent
  • 手动保存、加载规则

Ubuntu 14.04

sudo /etc/init.d/iptables-persistent save
sudo /etc/init.d/iptables-persistent reload

Ubuntu >=16.04

sudo netfilter-persistent save
sudo netfilter-persistent reload

保存、加载的规则的文件为

/etc/iptables/rules.v4  # ipv4的规则,对应iptables命令
/etc/iptables/rules.v6  # ipv6的规则,对应ip6tables命令

上述手动保存规则的命令等价于 iptables-save > /etc/iptables/rules.v4; ip6tables-save > /etc/iptables/rules.v6

上述手动加载规则的命令等价于 iptables-restore < /etc/iptables/rules.v4; ip6tables-restore < /etc/iptables/rules.v6

  • 开启开机项,以实现关机自动保存规则、开机自动加载规则,无需手动保存、加载了。

Ubuntu 14.04

sudo systemctl enable iptables-persistent.service

Ubuntu >=16.04

sudo systemctl enable netfilter-persistent.service

同样是加载、保存 /etc/iptables/rules.v{4,6} 文件。

防火墙的测试

  • 测试能否访问外部ip-端口
telnet <ip> <port>
  • 测试本地端口是否开放
telnet localhost <port>

上二命令,若能访问/本地端口开放,则返回

Trying <ip>...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

否则返回

Trying <ip>...
telnet: Unable to connect to remote host: Connection refused