分类 Linux 下的文章

之前介绍过通过 dnsmasq 配合 iptables 实现对 ip 地址的流量过滤,dnsmasq 获取到流量后标记 ipset 然后通过 iptables 识别 ipset 然后将流量送往指定地址。

通过 dnsmasq ipset 和 iptables 对域名流量的控制
iptables 使用教程

这里面存在一个问题就是流量回环问题,如果处理不好回导致 iptables 规则无限循环,尤其是在配置透明代理时候。

iptables -t mangle -A PREROUTING -p tcp -m set --match-set gfwlist dst -j TPROXY --on-port 1081 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -m set --match-set gfwlist dst -j TPROXY --on-port 1081 --tproxy-mark 1
iptables -t mangle -A OUTPUT -p tcp -m set --match-set gfwlist dst -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p udp -m set --match-set gfwlist dst -j MARK --set-mark 1

以上规则会将 指定 list 的流量发送到指定端口并打上 mark 标记,但是从目标地址返回数据后,数据流会再次匹配到以上规则导致再次将流量送往指定端口,导致无限循环。

处理方法就是在目标地址获取到流量后,给流量打上 mark 标记,然后在 iptables 的最前面加上一条规则识别从目标地址返回的流量,直接 return 流量即可。

例如目标地址处理后的流量标记为 mark 2,iptables 规则最前面增加一条规则:

iptables -t mangle -I OUTPUT -j RETURN -m mark --mark 0x02

-I 参数就是将规则放在在路由链的最前面。

如果是通过脚本的方式配置 iptables,将开始的脚本内容修改如下即可:

iptables -t mangle -A OUTPUT -j RETURN -m mark --mark 0x02

iptables -t mangle -A PREROUTING -p tcp -m set --match-set gfwlist dst -j TPROXY --on-port 1081 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -m set --match-set gfwlist dst -j TPROXY --on-port 1081 --tproxy-mark 1
iptables -t mangle -A OUTPUT -p tcp -m set --match-set gfwlist dst -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p udp -m set --match-set gfwlist dst -j MARK --set-mark 1

这样就可以避免流量回环问题。




昨天决定把服务器的系统从 Ubuntu 18.04 升级到 Ubuntu 20.04,其中经历了不少问题点,下面记录下处理过程。

首先就是升级当前系统所有包到最新:

apt update && apt upgrade -y
apt autoremove && apt purge

然后安装升级需要的管理包,不过一般系统都是自带的:

apt install update-manager-core

然后就可以更新系统了:

do-release-upgrade

标准流程就是以上几步,但是在最后一步的时候问题就开始出现了。

阅读全文


我的服务器上在使用 wget 或者 curl 等网络工具时,每次都提示类似下面的报错:

ERROR: cannot verify github.com's certificate, issued by ‘CN=DigiCert High Assurance TLS Hybrid ECC SHA256 2020 CA1,O=DigiCert\\, Inc.,C=US’:
  Unable to locally verify the issuer's authority.
To connect to github.com insecurely, use `--no-check-certificate'.

需要通过参数跳过证书检查,但是这样又有了安全风险。

首先尝试更新本地证书文件:

update-ca-certificates --verbose --fresh

发现问题没有解决,原来是系统缺少了一个指向证书路径 /etc/ssl/certs 的环境变量,尝试添加:

export SSL_CERT_DIR=/etc/ssl/certs

再次测试 wget 命令,发现问题的确没有了。

可以将上面的环境变量添加到系统 shell 配置文件中,我这里是 ~/.bashrc,添加后刷新一下即可:

source ~/.bashrc

在更新 Ubuntu18.04 到 20.04 时,也是这个问题导致的报错。