Gần đây, tôi đã mua một chiếc điện thoại Xiaomi và hài lòng với mọi thứ, ngoại trừ quảng cáo trong các ứng dụng có thương hiệu. Vâng, có một chức năng nên vô hiệu hóa nó, nhưng bạn hoàn toàn không thể thoát khỏi nó. Do đó, tôi gần như không sử dụng điện thoại để xem các trang web, bởi vì trong các trình duyệt di động, bạn hoàn toàn có thể cài đặt các trình chặn quảng cáo nhưng các apps thì không
Ai đó sẽ nói rằng quảng cáo giúp hỗ trợ các dự án miễn phí và có thể đây là một lần, nhưng bây giờ quảng cáo đang thu thập thông tin về bạn, thói quen của bạn, truy vấn tìm kiếm và hơn thế nữa: chỉ cần xem lưu lượng truy cập mà điện thoại của bạn tạo ra thời gian sử dụng bình thường. Tôi đã trang bị trình duyệt máy tính để bàn của mình với các plugin như NoScript và uBlock trong một thời gian dài, tôi gần như quên mất quảng cáo, nhưng điện thoại liên tục nhắc nhở tôi về nó.
Rơm rạ cuối cùng là tôi đã quyết định nghiên cứu lưu lượng của ứng dụng Xiaomi MiFit và tìm thấy các liên kết đến các tệp APK lạ trong các phản hồi của máy chủ (tôi sẽ không mô tả chúng, điều này nằm ngoài phạm vi của bài viết). Những người muốn có thể độc lập chặn các yêu cầu xấu, đặc biệt là khi họ đi qua HTTP thông thường.
Tôi không phải suy nghĩ lâu, đã có một máy chủ miễn phí với IP trắng trong tay. Tôi quyết định sử dụng nó để triển khai VPN, đồng thời thiết lập ở đó để chặn tất cả những gì không cần thiết - một lần cho tất cả các thiết bị được kết nối.
Giai đoạn chuẩn bị
Giả định rằng bạn đã có một máy chủ có địa chỉ IP công cộng nơi cài đặt Linux: trong trường hợp của tôi, đó là Ubuntu 16.10. Các ví dụ được trình bày sẽ hoạt động trên các bản phân phối Linux khác, với sự khác biệt là sẽ cần thiết để điều chỉnh việc cài đặt các gói cho trình quản lý gói của bạn.
Cài đặt OpenVPN
Có hai cách:
+ đơn giản - sử dụng hình ảnh Docker được tạo sẵn (dành cho những người không muốn làm phiền và đào sâu vào cấu hình OpenVPN);
+ phức tạp - với cài đặt thủ công và cấu hình của OpenVPN.
Chúng tôi sẽ xem xét cả hai lựa chọn và bắt đầu với một lựa chọn đơn giản.
Docker hình ảnh với OpenVPN
$ docker pull kylemanna/openvpn
Chúng tôi sẽ sử dụng nó. Đầu tiên chúng ta cần tạo một tệp cấu hình cho máy chủ VPN.
$ docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_genconfig -u udp://192.168.0.183
Ở đây giao thức trong đó lưu lượng và IP của máy chủ của bạn sẽ được lọc. Hãy nhìn vào cấu hình nhận được.
$ cat /etc/openvpn/openvpn.conf
server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/192.168.0.183.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/192.168.0.183.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun
proto udp
## Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log
user nobody
group nogroup
comp-lzo no
#### Route Configurations Below
route 192.168.254.0 255.255.255.0
#### Push Configurations Below
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "comp-lzo no"
Nếu bạn cần thay đổi cổng thay đổi nó trong tệp này, cũng như trong /etc/openvpn/ovpn_env.sh
. Chúng tôi tiến hành việc tạo chứng chỉ ssl, tls
$ docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_initpki
Một mật khẩu sẽ được yêu cầu để tạo khóa ủy quyền chứng chỉ
Bây giờ, chứng chỉ và khóa máy chủ được tạo, các khóa giao thức Diffie-Hellman, cũng như chữ ký HMAC để xác minh tính toàn vẹn của TLS.
Sau đó chúng ta phải thêm người dùng. Điều này thật dễ dàng.
$ docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
Vì CLIENTNAME
tôi sẽ sử dụng tên máy chủ của mình (sau này bạn sẽ tìm hiểu lý do tại sao điều này là cần thiết). tôi tạo chứng chỉ cho người dùng user-pc
, tôi sẽ ngay lập tức được yêu cầu chỉ ra mật khẩu cho chứng chỉ. Chứng chỉ đã sẵn sàng, nhưng chúng ta cần lấy tệp cấu hình cho OpenVPN. tôi thực hiện lệnh sau.
$ docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_getclient user-pc > /root/user-pc.ovpn
tôi nhìn vào kết quả.
$ cat /root/user-pc.ovpn
client
nobind
dev tun
remote-cert-tls server
remote 192.168.0.183 1194 udp
<key>
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
</key>
<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>
<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
key-direction 1
<tls-auth>
#
## 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
...
-----END OpenVPN Static key V1-----
</tls-auth>
redirect-gateway def1
Các khóa ở định dạng Base64 được cố ý xóa khỏi đầu ra để giảm nội dung của nó. Đó là: chạy OpenVPN trong chế độ daemon.
$ docker run -v /etc/openvpn:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
Về phía khách hàng, tôi đang cố gắng kết nối.
sudo openvpn --config user-pc.ovpn
Nếu mọi thứ đều ổn, thì ở cuối log, bạn sẽ thấy một dòng chữ Initialization Sequence Completed
và trong danh sách các giao diện, nó sẽ xuất hiện tun0
với địa chỉ IP từ mạng con 192.168.255.0/24. Đối với mục đích của tôi, điều này là khá đủ, bạn chỉ cần thêm lệnh để khởi động container để tự động tải và đi đến phần có cài đặt DNS.
Cấu hình thủ công của OpenVPN
Tùy chọn thứ hai là cấu hình OpenVPN hoàn toàn thủ công. Hãy đi các bước.
1 . Cài đặt OpenVPN.
$ sudo apt install -y openvpn
2 . Tải về dễ dàng rsa.
$ sudo git clone https://github.com/OpenVPN/easy-rsa.git /etc/openvpn/easy-rsa
3 . tôi đặt các biến cho easy-rsa trong tệp /etc/openvpn/easy-rsa/easyrsa3/vars
, phần còn lại là tùy chọn. Các tập tin /etc/openvpn/easy-rsa/easyrsa3/vars.example
chứa một danh sách đầy đủ các biến có sẵn, nhưng điều này là đủ cho tôi.
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 3650
4 . Khởi tạo PKI.
$ cd /etc/openvpn/easy-rsa/easyrsa3 && ./easyrsa init-pki
5 . Thành lập một tls. Chỉ định mật khẩu và Tên login.
$ ./easyrsa build-ca
6 . Tạo khóa máy chủ. Ở mọi nơi tôi sử dụng tên máy chủ làm Tên chung để tạo chứng chỉ.
$ ./easyrsa build-server-full vpnserver nopass
7 . Tạo khóa client
$ ./easyrsa build-client-full user-pc nopass
8 . Tùy chọn: nếu bạn cần tạo khóa Diffie-Hellman và TLS.
$ ./easyrsa gen-dh
$ openvpn --genkey --secret /etc/openvpn/easy-rsa/easyrsa3/pki/ta.key
Điều này hoàn thành việc tạo chứng chỉ, tiến hành viết cấu hình cho máy chủ VPN /etc/openvpn/server.conf
:
local 192.168.0.183
port 3333
mode server
proto udp
dev tun
ca /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt
cert /etc/openvpn/easy-rsa/easyrsa3/pki/issued/vpnserver.crt
key /etc/openvpn/easy-rsa/easyrsa3/pki/private/vpnserver.key
dh /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem
server 10.8.0.0 255.255.255.0
push "route 10.8.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"
client-to-client
comp-lzo
keepalive 10 120
persist-key
persist-tun
log openvpn.log
verb 0
mute 20
Ưu điểm của việc cài đặt OpenVPN từ kho lưu trữ là nó cũng đăng ký như một dịch vụ trong systemctl
. Hãy sửa nó để làm việc với cấu hình của chúng tôi.
$ systemctl cat openvpn.service
## /lib/systemd/system/openvpn.service
## This service is actually a systemd target,
## but we are using a service since targets cannot be reloaded.
[Unit]
Description=OpenVPN service
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/etc/openvpn
[Install]
WantedBy=multi-user.target
Nhận được đường dẫn đến tệp, tôi sẽ sửa đổi một chút theo nhu cầu của tôi.
## /lib/systemd/system/openvpn.service
## This service is actually a systemd target,
## but we are using a service since targets cannot be reloaded.
[Unit]
Description=OpenVPN service
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/openvpn --config server.conf --daemon
ExecReload=/usr/sbin/openvpn --config server.conf --daemon
WorkingDirectory=/etc/openvpn
RestartSec=5s
Restart=on-failure
[Install]
WantedBy=multi-user.target
tôi bắt đầu dịch vụ.
$ sudo systemctl enable openvpn.service && sudo systemctl start openvpn.service
Và kiểm tra lỗi.
$ journalctl -uxe openvpn.service
Trong ví dụ cuối cùng với Docker, chúng tôi đã có cơ hội nhận cấu hình máy client với một lệnh. Đã đến lúc viết kịch bản cho việc này.
#!/bin/bash
USERNAME=$1
EASYRSA_PKI="/etc/openvpn/easy-rsa/easyrsa3/pki"
echo "
client
nobind
dev tun
remote 192.168.0.183 3333
proto udp
comp-lzo yes
auth-nocache
script-security 2
persist-key
persist-tun"
echo "<key>
$(cat ${EASYRSA_PKI}/private/${USERNAME}.key)
</key>
<cert>
$(openssl x509 -in ${EASYRSA_PKI}/issued/${USERNAME}.crt)
</cert>
<ca>
$(cat $EASYRSA_PKI/ca.crt)
</ca>
"
Tôi không thấy sự cần thiết phải mô tả nó: mọi thứ đều giống nhau ở đây, nhưng để biết chi tiết bạn có thể xem
man openvpn
Bây giờ chúng ta đã có máy chủ VPN sẵn sàng và kết nối máy khách được định cấu hình, đã đến lúc bắt đầu định cấu hình máy chủ DNS.
Biên dịch DNS
tải về bản Unbound
$ git clone https://github.com/NLnetLabs/unbound.git /opt/unbound
$ sudo apt install -y protobuf-c-compiler libevent-dev libssl-dev libsodium-dev libfstrm-dev
Bây giờ bạn có thể bắt đầu biên dịch.
$ cd /opt/unbound
$ ./configure \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--sbindir=/usr/bin \
--disable-rpath \
--enable-dnscrypt \
--enable-dnstap \
--enable-pie \
--enable-relro-now \
--enable-subnet \
--enable-tfo-client \
--enable-tfo-server \
--with-conf-file=/etc/unbound/unbound.conf \
--with-pidfile=/run/unbound.pid \
--with-rootkey-file=/etc/trusted-key.key \
--with-libevent
$ make
$ sudo make install
Ở đây tôi chỉ ra:
- đường dẫn chuẩn đến tệp cấu hình; --with-conf-file
- kích hoạt hỗ trợ dnssec; --enable-dnscrypt
- đường dẫn đến tệp với các khóa đáng tin cậy; --with-rootkey-file
- kích hoạt hỗ trợ dnstap. --enable-dnstap
Sau khi build thành công, chúng ta cần thêm một vài cấu hình. Đầu tiên, tạo một người dùng.
$ sudo useradd -s /bin/false -d /etc/unbound unbound
Thứ hai, chạy service
/lib/systemd/system/unbound.service
. Nội dung của nó sẽ như thế này
## /lib/systemd/system/unbound.service
[Unit]
Description=Unbound DNS Resolver
Wants=nss-lookup.target
Before=network-online.target nss-lookup.target
After=network.target
[Service]
ExecStart=/usr/bin/unbound
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
Thêm neo vào
tmpfiles.d
$ echo 'C /etc/unbound/trusted-key.key - - - - /etc/trusted-key.key' > /usr/lib/tmpfiles.d/unbound.conf
Cấu hình DNS qua TLS
DoT sẽ thêm quyền riêng tư và bảo vệ chống giả mạo. Dưới đây là một tập tin cấu hình ví dụ
/etc/unbound/unbound.conf
server:
interface: 0.0.0.0
interface: ::0
use-syslog: yes
do-daemonize: no
username: "unbound"
num-threads: 2
verbosity: 2
access-control: 0.0.0.0/0 refuse
access-control: ::0/0 refuse
access-control: 127.0.0.1 allow
access-control: ::1 allow
access-control: 10.8.0.0/24 allow
hide-identity: yes
hide-version: yes
private-address: 127.0.0.1
private-address: ::1
# Сеть VPN
private-address: 10.8.0.0/24
private-address: fe80::/24
directory: "/etc/unbound"
trust-anchor-file: trusted-key.key
tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
cache-max-ttl: 86400
cache-min-ttl: 3600
include: /etc/unbound/local.d/*.conf
forward-zone:
name: "."
forward-tls-upstream: yes
## Cloudflare DNS
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
## IPv6 Cloudflare DNS over TLS
forward-addr: 2606:4700:4700::1111@853#cloudflare-dns.com
forward-addr: 2606:4700:4700::1001@853#cloudflare-dns.com
remote-control:
control-enable: yes
# Разрешаем запросы только из локальной сети
control-interface: 127.0.0.1
control-interface: ::1
control-port: 8953
control-use-cert: no
Các cấu hình đã sẵn sàng! Tạo một tệp chính /etc/unbound/trusted-key.key
kích hoạt DNSSEC
$ sudo unbound-anchor -a /etc/unbound/trusted-key.key
Liên kết với NetworkManager
Không có nhận xét nào:
Đăng nhận xét