mostly fixes, a few improvements
[distro-setup] / trusted-network
1 #!/bin/bash
2
3 # Usage: run to trust or untrust dns. public wifi sometimes needs to
4 # trust dns initially to log in.
5
6
7 [[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@"
8
9 source /a/bin/bash-bear-trap/bash-bear
10
11 readonly this_file=$(readlink -f -- "${BASH_SOURCE[0]}")
12 readonly this_dir="${this_file%/*}"
13 script_name="${BASH_SOURCE[0]}"
14 script_name="${script_name##*/}"
15
16 # removes malware and adult content
17 servers=(1.1.1.3 1.0.0.3 2606:4700:4700::1113 2606:4700:4700::1003)
18
19 servers=(1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001)
20
21 ## trying out google
22 servers=(8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844)
23
24
25
26 m() { printf "%s\n" "$*"; "$@"; }
27 e() { printf "%s\n" "$@"; }
28 i() { # install file
29 local tmp tmpdir dest="$1"
30 local base="${dest##*/}"
31 mkdir -p ${dest%/*}
32 ir=false # i result
33 tmpdir=$(mktemp -d)
34 cat >$tmpdir/"$base"
35 tmp=$(rsync -ic $tmpdir/"$base" "$dest")
36 if [[ $tmp ]]; then
37 printf "%s\n" "$tmp"
38 ir=true
39 fi
40 rm -rf $tmpdir
41 }
42
43 # i symlinked the script to another name to make it work different
44 trust=true
45 case $script_name in
46 untrusted-network)
47 trust=false
48 ;;
49 esac
50
51
52 if $trust; then
53 if [[ -e /etc/NetworkManager/conf.d/dns.conf ]]; then
54 rm -fv /etc/NetworkManager/conf.d/dns.conf
55 if [[ $(systemctl is-active NetworkManager) == active ]]; then
56 m systemctl restart NetworkManager
57 fi
58 fi
59
60 # https://github.com/jonathanio/update-systemd-resolved
61 # suggests this will help prevent leakage into a vpn interface
62 cat >/etc/systemd/resolved.conf.d/untrusted-network.conf <<EOF
63 Domains=~.
64 EOF
65 else #untrusted
66 # https://wiki.archlinux.org/index.php/Systemd-resolved#Manually
67 cat >/etc/systemd/resolved.conf.d/untrusted-network.conf <<EOF
68 [Resolve]
69 DNS=${servers[@]}
70 Domains=~. b8.nz
71 DNSOverTLS=yes
72 EOF
73
74 i /etc/NetworkManager/conf.d/dns.conf <<'EOF'
75 [main]
76 dns=none
77 systemd-resolved=false
78 EOF
79
80 if $ir && [[ $(systemctl is-active NetworkManager) == active ]]; then
81 m systemctl restart NetworkManager
82 fi
83 fi
84
85 dhclient_restart=false
86 # man dhclient.conf
87 if ! grep -qP '\bdomain-name-servers\b' /etc/dhcp/dhclient.conf; then
88 sed -i 's/^ *request/request domain-name-servers,/' /etc/dhcp/dhclient.conf
89 dhclient_restart=true
90 e $0: dhclient_restart=true
91 fi
92
93
94 # wait for networkmanager to come back
95 for f in {1..20}; do
96 if read -r _ _ _ _ gateway_if _ < <(ip route get 8.8.8.8); then
97 break
98 fi
99 m sleep 2
100 done
101
102
103 if [[ $gateway_if ]]; then
104 # we could do this, but dhclient is still running and will use its old settings
105 # from dependencies of ifupdown,
106 # from man dhclient-script
107 # from /etc/dhcp/dhclient-enter-hooks.d/resolved
108 # rm -f /run/systemd/resolved.conf.d/*$gateway_if*
109
110
111 if $dhclient_restart && grep -Pq "^ *auto ($gateway_if|.* $gateway_if( |$))" /etc/network/interfaces; then
112 m ifdown $gateway_if
113 m ifup $gateway_if
114 fi
115
116 # At least on systemd 237 ifupdown it sets a global and this is not
117 # needed. we are way past that, but I dont think it hurts.
118 resolvectl revert $gateway_if
119 else
120 e $0: no gateway_if found
121 fi
122
123 m systemctl restart systemd-resolved
124
125
126
127 # just for curiosity i did a
128 # wrapper around dhclient, then ifdown eth0; ifup eth0:
129
130 # Tue Mar 9 18:29:05 EST 2021
131 # args -4 -v -r -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0
132 # env
133 # ADDRFAM=inet
134 # PHASE=pre-down
135 # VERBOSITY=0
136 # PWD=/sbin
137 # IFACE=eth0
138 # METHOD=dhcp
139 # SHLVL=1
140 # LOGICAL=eth0
141 # MODE=stop
142 # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
143 # IFUPDOWN_eth0=pre-down
144 # _=/usr/bin/env
145 # Tue Mar 9 18:29:07 EST 2021
146 # args -1 -4 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0
147 # env
148 # ADDRFAM=inet
149 # PHASE=post-up
150 # VERBOSITY=0
151 # PWD=/sbin
152 # IFACE=eth0
153 # METHOD=dhcp
154 # SHLVL=1
155 # LOGICAL=eth0
156 # MODE=start
157 # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
158 # IFUPDOWN_eth0=post-up
159 # _=/usr/bin/env