-
Notifications
You must be signed in to change notification settings - Fork 2
Home
SgrAlpha edited this page Oct 3, 2019
·
19 revisions
搭建透明代理服务器的目的,主要是希望用它作为跳板(jumpbox),为内网的机器提供代理服务,同时解决潜在的DNS污染问题,这样内网的机器无需任何配置即可实现访问真・外网。
利用一台有两张网卡的机器,一张用于访问外网,一张用于内网,在上面假设DNS服务,并利用iptables将流量转发到外部代理上。
- 硬件
- 光猫,主要用于PPPoE拨号访问外网,不是光纤的话普通的也可以。
- 一台有两张网卡的机器,可以是小主机,也可以是其他闲置的旧电脑。笔者使用的是一台2011年的Mac Mini主机,Intel i5 2.3GHz + 8G 内存,其优点是性能其他路由,个头小,几乎可以放在任何地方,自带一个千兆网口和一个Thundbolt口,可以通过转接器扩展为两个千兆网口。
- 内网交换机/有线路由器/无线路由,任意一个即可。
- 内网主工作站,笔记本或者台式机一台。
- 六类网线若干
- 软件
- 服务器端
-
shadowsocks-libev,主要使用其中的
ss-server,可以自行搭建,也可以购买或者使用他人提供的。
-
shadowsocks-libev,主要使用其中的
- 跳板
- Ubuntu Server 18.04.3 LTS。
-
shadowsocks-libev,主要使用其中的
ss-redir。 - dnsmasq,用于缓存DNS以及为内网机器提供DHCP服务。
- overture,主要用来解决DNS污染问题。
- GFW list,潜在的被污染域名列表。
- 国内IP列表
- 服务器端
- 跳板机用于访问外网的网口 -> 光猫的LAN口(注意区分百兆口和千兆口,优先使用千兆口)。
- 跳板机用于内网的的网口 -> 内网交换机/有线路由器/无线路由的WAN口。
这部分需要在跳板机的命令行里进行操作,后面以 Ubuntu Server 18.04 为例,低版本或者桌面版可能会有些许不同,但基本原理类似。
运行 ifconfig -a 查看网卡信息,应该会看到三个或者以上的网卡,名称可能会不同,需要自行区分:
- enp2s0f0,这是连接光猫的网卡,视为外网网卡
- ens9,另一块网卡,视为内网网卡
- lo,本地
在新的 Ubuntu Server 18.04 TLS 中,控制网络组件是一个叫做netplan的东西,与之前大家熟悉的直接编辑/etc/network/interfaces不太一样。其配置文件在 /etc/netplan/ 目录下,通常以数字开头,数字越大权重越大。全新安装的系统通常是有一个配置文件,可以使用:
sudo ls /etc/netplan/
列出所有的配置文件,找其中最大的一个编辑,我这里是50-cloud-init.yaml。
sudo vi /etc/netplan/50-cloud-init.yaml
将其中的内容替换成:
network: ethernets: enp2s0f0: dhcp4: yes ens9: dhcp4: no addresses: [192.168.3.1/24, ] version: 2
其中对于外网网卡 enp2s0f0 我们使用了DHCP,接受由光猫动态分配的地址;而对于内网网卡 ens9 我们给他分配了一个静态的地址 192.168.3.1,这个地址将会成为内网机器的DHCP服务器地址、网关以及DNS服务器地址。保存之后运行下面的命令可以让配置马上生效:
sudo netplan apply
成功之后可以再运行 ifconfig -a 检查是否配置正确。
- 安装
dnsmasq:
sudo apt update && sudo apt install dnsmasq -y- 打开并编辑其配置文件:
sudo vi /etc/dnsmasq.conf
- 将内容替换成:
# 默认情况下 dnsmasq 会并发查询所有定义了上游 DNS,这里先改成按照制定顺序 strict-order # 添加若干上游 DNS 服务器 server=223.5.5.5#53 server=223.6.6.6#53 server=119.29.29.29#53 server=119.28.28.28#53 # 提供 DNS 服务的网卡,通常情况我们不需要为外网提供 DNS 服务,所以打开内网网卡即可 # interface=enp2s0f0 # Public ethernet interface interface=ens9 # Internal ethernet interface # 能用来收取 DNS 请求的 IP 地址,这里要加上内网网卡的 IP 和本地 IP # listen-address=10.1.100.1 # IP from public ethernet interface listen-address=192.168.3.1 # IP from internal ethernet interface listen-address=127.0.0.1 # Local IP # 禁止 dnsmasq 为外网网卡提供 DHCP 服务,否则会干扰外网网卡运行 no-dhcp-interface=enp2s0f0 # 绑定到网卡 bind-interfaces # 设置 DHCP 服务能够分配的 IP 地址段,需要与 netplan 中的地址在同一个网段 dhcp-range=192.168.3.50,192.168.3.150,24h
- 保存并重启服务
sudo systemctl restart dnsmasq.service
这时候连接到内网网卡的设备已经可以拿到自动分配的 IP 地址了,但暂时还上不了网。
- 下载 overture,我这里使用的是 v1.5
cd ~ wget https://github.com/shawn1m/overture/releases/download/v1.5/overture-linux-amd64.zip sudo apt install unzip -y sudo unzip overture-linux-amd64.zip -d /opt cd /opt/overture
- 打开并编辑配置文件
sudo vi /opt/overture/config.json
- 将内容替换成:
{
"BindAddress": ":5353",
"DebugHTTPAddress": "127.0.0.1:5555",
"PrimaryDNS": [
{
"Name": "AliDNS",
"Address": "223.5.5.5:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": "",
"NoCookie": true
}
},
{
"Name": "AliDNS2",
"Address": "223.6.6.6:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": "",
"NoCookie": true
}
},
{
"Name": "DNSPod",
"Address": "119.29.29.29:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": "",
"NoCookie": true
}
},
{
"Name": "DNSPod2",
"Address": "119.28.28.28:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": "",
"NoCookie": true
}
}
],
"AlternativeDNS": [
{
"Name": "OpenDNS",
"Address": "208.67.222.222:443",
"Protocol": "tcp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": "",
"NoCookie": true
}
},
{
"Name": "google",
"Address": "8.8.8.8:53",
"Protocol": "tcp",
"Timeout": 6,
"MinimumTTL": 0,
"CacheSize" : 0,
"EDNSClientSubnet":{
"Policy": "enable",
"ExternalIP": "",
"NoCookie": true
}
},
{
"Name": "google2",
"Address": "8.8.4.4:53",
"Protocol": "tcp",
"Timeout": 6,
"MinimumTTL": 0,
"CacheSize" : 0,
"EDNSClientSubnet":{
"Policy": "enable",
"ExternalIP": "",
"NoCookie": true
}
}
],
"OnlyPrimaryDNS": false,
"IPv6UseAlternativeDNS": false,
"WhenPrimaryDNSAnswerNoneUse": "PrimaryDNS",
"IPNetworkFile": {
"Primary": "/opt/overture/china_ip_list.txt",
"Alternative": "/opt/overture/ip_network_alternative_sample"
},
"DomainFile": {
"Primary": "/opt/overture/domain_primary_sample",
"Alternative": "/opt/overture/gfw_domain_list.txt"
},
"HostsFile": "/opt/overture/hosts_sample",
"MinimumTTL": 0,
"DomainTTLFile" : "/opt/overture/domain_ttl_sample",
"CacheSize" : 0,
"RejectQType": [255]
}- 其中的:
- BindAddress - 服务绑定的地址,我们把端口号换成 5353 以避免和 dnsmasq 冲突
- PrimaryDNS - 若干主 DNS 服务器,用于非污染域名解析,这里配置了几个阿里云的节点,速度还算不错
- AlternativeDNS - 若干次 DNS 服务器,主要用于防污染,原理是用 TCP 协议而非默认的 UDP,需要服务器本身支持才行,这里选用了 OpenDNS 和谷歌的两个节点
- IPNetworkFile.Primary - 这里选用了国内IP列表,一旦主 DNS 解析出来的地址是一个国内 IP,则无需等待次 DNS,直接返回,应该国内地址一般没有污染,这样速度更快。
- DomainFile.Alternative - 这里选用了来自GFW list的域名,一旦发现域名有潜在的污染风险,直接绕过主 DNS 走次 DNS 达到反污染的目的。
- 保存配置文件。
- 创建国内IP地址列表
curl https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt > /tmp/china_ip_list.txt
sudo mv /tmp/china_ip_list.txt /opt/overture/china_ip_list.txt- 创建潜在被污染域名列表
curl https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt | base64 -d | sort -u | sed '/^$\|@@/d'| sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' | sed '/\*/d; /apple\.com/d; /sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /qq\.com/d' | sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' | grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u > /tmp/temp_gfwlist.txt cat /tmp/temp_gfwlist.txt | sort -u > /tmp/gfw_all_domain.txt sudo mv /tmp/gfw_all_domain.txt /opt/overture/gfw_domain_list.txt
- 再次打开 dnsmasq 的配置文件
sudo vi /etc/dnsmasq.conf
- 删去或者注释掉所有之前添加的上游 DNS 服务器,改成:
server=127.0.0.1#5353 # 这里只保留 overture 的监听地址 #server=223.5.5.5#53 #server=223.6.6.6#53 #server=119.29.29.29#53 #server=119.28.28.28#53
- 重启服务
sudo systemctl restart overture.service sudo systemctl restart dnsmasq.service
- 测试
dig @127.0.0.1 -p 53 www.google.com