工作思路
dnsmasq
為局域網中客戶端提供DHCP服務和DNS解析緩存,在客戶機數量多(成百上千)的時候緩存的意義重大。將DNS轉發給Clash,由Clash來防止防止DNS被污染。
Clash
支持各種代理協議,支持各種分流規則,擁有防止DNS污染的解決途徑。
DNS污染對Clash的影響
淺談在代理環境中的 DNS 解析行為
Iptables
透明代理必備,將特定TCP請求和DNS請求按需轉發給Clash和dnsmasq。
Ipset
Iptables的功能插件可以按國家設置Iptables策略,我們在這里配合Iptables用來實現:國內IP地址直接NAT不進入代理,去訪問國外IP地址的時候再送給Clash。
數據流程圖
具體配置
以下都以Ubuntu2004為例。另外,不論在什么時候,你需要把自己的雙網卡先配置好IP地址,保證自己的服務器可以上網。再進行接下來的步驟。
前置任務
編輯配置文件優化內核參數(IPV6關閉功能無效,后續補充)
vi /etc/sysctl.conf
在末尾追加
在這里關於ip_forward是否打開網上說的貌似都不大對。我要說一說。如果只是Clash代理不用開啟IP包轉發功能,但是我為了能降低Clash的壓力,讓國內的IP地址不要進入Clash進行處理,直接NAT去訪問。那么此處就必須開啟IP包轉發。
代理這個功能本身根本用不到ip包轉發
#開啟流量轉發
net.ipv4.ip_forward=1
#增大打開文件數限制。請注意,該參數非常關鍵,否則將收到打開文件數量過多的提示錯誤,代理服務器將無法工作。
fs.file-max = 999999
#增大所有類型數據包的緩沖區大小(通用設置,其中default值會被下方具體類型包的設置覆蓋)
#最大緩沖區大小為64M,初始大小64K。下同
#此大小適用於一般的使用場景。如果場景偏向於傳輸大數據包,則可以按倍數擴大該值,去匹配單個包大小
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 6291456
net.core.wmem_default = 6291456
net.core.netdev_max_backlog = 65535
net.core.somaxconn = 262114
#增大TCP數據包的緩沖區大小,並優化連接保持
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_mem = 8192 131072 67108864
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_notsent_lowat = 16384
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans= 262114
net.ipv4.tcp_fastopen = 3
net.ipv4.ip_local_port_range = 1024 65000
#增大UDP數據包的緩沖區大小
net.ipv4.udp_mem = 8192 131072 67108864
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
# 關閉IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
重新加載內核配置參數
sysctl -p
dnsmasq
dnsmasq負責為客戶端分配IP地址的DHCP和域名解析DNS。
停用系統自帶dns服務
# 編輯配置文件
vi /etc/systemd/resolved.conf
# 取消注釋,修改yes為no
DNSStubListener=no
# 停用服務
systemctl stop systemd-resolved
systemctl disable systemd-resolved
# 系統將無法解析IP地址,這時候需要編輯配置文件
vi /etc/resolv.conf
# 將其中nameserver修改為如下:
nameserver 114.114.114.114
# 保存退出即可
安裝dnsmasq
apt install dnsmasq
修改配置文件
vi /etc/dnsmasq.conf
# 編輯配置文件在末尾添加。按需修改你自己的配置我的Lan地址為172.16.16.254。
# dnsmasq的上游服務器為本機853端口,這個是clash將要使用的dns域名解析服務端口。
bogus-priv
no-resolv
listen-address=127.0.0.1,172.16.16.254
#interface=ens38,lo
server=127.0.0.1#853
domain=lan,172.16.16.0/24
dhcp-range=172.16.16.11,172.16.16.240,12h
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
cache-size=2048
# 保存配置文件並開啟服務
systemctl enable dnsmasq
systemctl start dnsmasq
安裝Clash
Clash提供了兩個版本,這里我使用了閉源的,因為功能更多一些。到https://github.com/Dreamacro/clash/releases/tag/premium
下載最新版即可這里不再講述解壓縮啥的。
執行一次生成配置文件
./clash
一般會自行下載國家IP地址文件Country.mmdb
和生成配置文件config.yaml
。
ls ~/.config/clash
cache.db config.yaml Country.mmdb
移動文件位置
mkdir -p /usr/local/clash/conf
cp clash /usr/local/clash
cp ~/.config/clash/* /usr/local/clash/conf/
下載Clash管理面板yacd
到https://github.com/haishanh/yacd/releases
下載yacd.tar.xz
並且解壓縮復制到/usr/local/clash中。服務運行后可以通過http://172.16.16.254:9090/ui
來訪問yacd管理面板。
ls /usr/local/clash/
clash conf yacd
配置文件
vi /usr/local/clash/conf/config.yaml
# 刪掉所有內容,根據自己的需求修改
port: 7890
socks-port: 7891
redir-port: 7892
allow-lan: true
mode: Rule
log-level: info
external-controller: '172.16.16.254:9090'
secret: '7758521'
external-ui: '/usr/local/clash/yacd'
dns:
enable: true
ipv6: false
listen: 127.0.0.1:853
enhanced-mode: redir-host
nameserver:
- 'tls://dns.rubyfish.cn:853'
- '223.5.5.5'
fallback:
- 'tls://1.1.1.1:853'
- 'tls://dns.google'
proxies:
- 你的代理服務器配置,按需修改。
proxy-groups:
- 你的代理組配置
- 🔰國外流量
- 🚀直接連接
rules:
- 規則例如下面
- DOMAIN-KEYWORD,google,🔰國外流量
- DOMAIN-KEYWORD,ethermine,🔰國外流量
- DOMAIN-KEYWORD,whatismyipaddress,🔰國外流量
- MATCH,🚀直接連接
創建守護進程配置文件
vi /etc/systemd/system/clash.service
[Unit]
Description=Clash daemon, A rule-based proxy in Go.
After=network.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/local/clash/clash -d /usr/local/clash/conf
[Install]
WantedBy=multi-user.target
設置開機自動運行
systemctl daemon-reload
systemctl enable clash
systemctl start clash
journalctl -xe
配置Iptables
安裝需要的組件
apt install ipset iptables netfilter-persistent ipset-persistent iptables-persistent conntrack
停用自帶防火牆ufw
systemctl disable ufw
systemctl stop ufw
創建ipset規則
ipset -N cnip hash:net
wget -O ~/cn.txt http://www.ipdeny.com/ipblocks/data/countries/cn.zone
for ip in $(cat /root/cn.txt ); do ipset -A cnip $ip; done
# 查看導入的ipset規則
ipset list | more
# 測試IP是否命中
ipset test cnip 114.114.114.114
創建iptables規則
# 刪除所有已有規則
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -N CLASH
#排除環形地址與保留地址,匹配之后直接RETURN返還給PREROUTING鏈
iptables -t nat -A CLASH -d 0.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 10.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 127.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 169.254.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 172.16.0.0/12 -j RETURN
iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 224.0.0.0/4 -j RETURN
iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN
#重定向tcp流量到本機7892端口
iptables -t nat -A CLASH -s 172.16.16.0/24 -p tcp -j REDIRECT --to-port 7892
#在nat表中新建一個clash_dns規則鏈
iptables -t nat -N CLASH_DNS
#dnat劫持所有dns請求
iptables -t nat -A CLASH_DNS -p udp --dport 53 -j DNAT --to-destination 172.16.16.254:53
iptables -t nat -A CLASH_DNS -p tcp --dport 53 -j DNAT --to-destination 172.16.16.254:53
# 配置DNS請求劫持
iptables -t nat -A PREROUTING -p udp --dport 53 -j CLASH_DNS
iptables -t nat -A PREROUTING -p tcp --dport 53 -j CLASH_DNS
# 配置TCP協議請求非國內IP地址范圍劫持進入Clash
iptables -t nat -A PREROUTING -p tcp -m set ! --match-set cnip dst -g CLASH
# 國內IP地址范圍TCP和其他53端口之外的UDP進入系統NAT
iptables -t nat -A POSTROUTING -j MASQUERADE
保存配置
# 保存兩個
netfilter-persistent save
# 分別保存
dpkg-reconfigure ipset-persistent
dpkg-reconfigure iptables-persistent
主機加固
主要是使用Iptables
對外網WAN接口進行包過濾,丟棄所有。訪問WAN接口的請求。
# filter表中創建一個專門處理wan接口流量的鏈
iptables -t nat -N enp1s0
# 允許pingwan接口其他數據統統丟棄
-A enp1s0 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A enp1s0 -j DROP
# 已經建立的連接防止斷開,Lan接口和lo接口允許訪問
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i enp2s0 -j ACCEPT
-A INPUT -i lo -j ACCEPT
# 配置截獲所有到Wan接口的流量
-A INPUT -i enp1s0 -j enp1s0
補充知識
iptables相關
# 查看規則和計數
iptables -t filter -L -n -v
# 清空計數器
iptables -t filter -Z
# 帶編號顯示規則
iptables -t nat -nvL --line-number
# 添加到第3號,原來的3號變4號
iptables -t filter -I INPUT 3 -s 192.168.1.3 -j DROP
# 按編號刪除規則
iptables -t filter -D INPUT 2
# 查看會話表
conntrack -L