forked from Mehdi682007/Socat-Script
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstall.sh
361 lines (300 loc) · 12 KB
/
install.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
#!/bin/bash
# تنظیم مسیر فایل ذخیرهسازی پورتها و آدرسهای IPv6
PORTS_FILE="/etc/rc.local"
# تابع برای بررسی وجود netstat
check_netstat() {
if ! command -v netstat &> /dev/null; then
echo "netstat not found. Installing net-tools..."
sudo apt update
sudo apt install -y net-tools
fi
}
# تابع برای بررسی وضعیت اجرا
check_status() {
check_netstat # بررسی و نصب netstat در صورت نیاز
local running=false
for port in "${ports[@]}"; do
if sudo netstat -tuln | grep -q ":${port} .*LISTEN"; then
running=true
break
fi
done
if $running; then
echo -e "\033[0;32mRunning\033[0m"
else
echo -e "\033[0;31mNot Running\033[0m"
fi
}
# تابع برای نصب اسکریپت
install_script() {
echo "Enter the number of ports you want to use: "
read num_ports
ports=()
ipv6_addresses=()
for ((i=1; i<=num_ports; i++)); do
echo "Enter port number $i: "
read port
ports+=("$port")
echo "Enter the IPv6 address for port $port: "
read ipv6
ipv6_addresses+=("$ipv6")
done
# نصب socat در صورت عدم نصب
sudo apt update
sudo apt install -y socat
# بررسی و نصب netstat اگر لازم باشد
check_netstat
# بازنویسی /etc/rc.local با افزودن #!/bin/bash به بالا اگر وجود نداشته باشد
if ! sudo head -n 1 /etc/rc.local | grep -q "#!/bin/bash"; then
echo "#!/bin/bash" | sudo tee /etc/rc.local > /dev/null
fi
# افزودن دستورات socat برای هر پورت و IPv6
for index in "${!ports[@]}"; do
port=${ports[$index]}
ipv6=${ipv6_addresses[$index]}
echo "socat TCP4-LISTEN:${port},fork TCP6:[${ipv6}]:${port},ipv6only=1 &" | sudo tee -a /etc/rc.local > /dev/null
done
echo "exit 0" | sudo tee -a /etc/rc.local > /dev/null
# تنظیم مجوز اجرایی برای /etc/rc.local
sudo chmod +x /etc/rc.local
echo -e "\033[0;32m"
echo "Script installed successfully."
echo -e "\033[0m"
# افزودن کرون جاب برای ریستارت خودکار تانلها
add_cron_job
# ریبوت سیستم (پرسش از کاربر)
echo -n "Do you want to reboot the system now? (y/n): "
read -r reboot_choice
if [ "$reboot_choice" = "y" ]; then
echo "Rebooting system..."
sudo reboot
else
echo "You chose not to reboot the system. Please reboot manually later."
fi
exit 0
}
# تابع برای افزودن IPv6 لوکال
add_ipv6_local() {
sudo apt-get install -y iproute2
# بررسی و نصب Netplan اگر لازم باشد
if ! command -v netplan &> /dev/null; then
echo "Netplan not found. Installing netplan.io..."
sudo apt update
sudo apt install -y netplan.io
fi
# اطمینان از آنماسک، راهاندازی و فعالسازی systemd-networkd
echo "Ensuring systemd-networkd is unmasked, started, and enabled..."
sudo systemctl unmask systemd-networkd 2>/dev/null
sudo systemctl start systemd-networkd 2>/dev/null
sudo systemctl enable systemd-networkd 2>/dev/null
# بررسی اینکه آیا سرویس systemd-networkd بهدرستی شروع شده است یا خیر
if ! sudo systemctl is-active --quiet systemd-networkd; then
echo "Failed to start systemd-networkd. Please check your system's configuration."
exit 1
fi
echo "Enter local IPv4 address: "
read local_ipv4
echo "Enter remote IPv4 address: "
read remote_ipv4
echo "Enter your desired local IPv6 address: "
read local_ipv6
echo "Enter your desired remote IPv6 address: "
read remote_ipv6
# ساخت فایل پیکربندی netplan
sudo tee /etc/netplan/pdtun.yaml > /dev/null <<EOL
network:
version: 2
tunnels:
tunel01:
mode: sit
local: ${local_ipv4}
remote: ${remote_ipv4}
addresses:
- ${local_ipv6}/64
mtu: 1500
EOL
sudo netplan apply
# ساخت فایل پیکربندی systemd network
sudo tee /etc/systemd/network/tun0.network > /dev/null <<EOL
[Network]
Address=${local_ipv6}/64
Gateway=${remote_ipv6}
EOL
sudo systemctl restart systemd-networkd
echo "Local IPv6 address added successfully."
exit 0
}
# تابع برای افزودن IPv4 تونل
add_ipv4_tunnel() {
echo "Enter the number of ports you want to use: "
read num_ports
ports=()
destination_servers=()
for ((i=1; i<=num_ports; i++)); do
echo "Enter port number $i: "
read port
ports+=("$port")
echo "Enter the destination server IP for port $port: "
read destination_server
destination_servers+=("$destination_server")
done
# نصب socat در صورت عدم نصب
sudo apt update
sudo apt install -y socat
# بررسی و نصب netstat اگر لازم باشد
check_netstat
# بازنویسی /etc/rc.local با افزودن #!/bin/bash به بالا اگر وجود نداشته باشد
if ! sudo head -n 1 /etc/rc.local | grep -q "#!/bin/bash"; then
echo "#!/bin/bash" | sudo tee /etc/rc.local > /dev/null
fi
# افزودن دستور socat برای هر پورت و سرور مقصد
for index in "${!ports[@]}"; do
port=${ports[$index]}
destination_server=${destination_servers[$index]}
echo "socat TCP4-LISTEN:${port},fork TCP4:${destination_server}:${port} &" | sudo tee -a /etc/rc.local > /dev/null
done
# افزودن exit 0 اگر در فایل موجود نباشد
if ! sudo tail -n 1 /etc/rc.local | grep -q "exit 0"; then
echo "exit 0" | sudo tee -a /etc/rc.local > /dev/null
fi
# تنظیم مجوز اجرایی برای /etc/rc.local
sudo chmod +x /etc/rc.local
echo -e "\033[0;32m"
echo "IPv4 tunnel added successfully."
echo -e "\033[0m"
# افزودن کرون جاب برای ریستارت خودکار تانلها
add_cron_job
# ریبوت سیستم (پرسش از کاربر)
echo -n "Do you want to reboot the system now? (y/n): "
read -r reboot_choice
if [ "$reboot_choice" = "y" ]; then
echo "Rebooting system..."
sudo reboot
else
echo "You chose not to reboot the system. Please reboot manually later."
fi
}
uninstall_script() {
read -p "Are you sure you want to uninstall the script and remove local IPv6 settings? (yes/no): " confirm
if [[ "$confirm" == "yes" ]]; then
# توقف تمام فرآیندهای socat
sudo pkill -x socat
# حذف خطوط socat از /etc/rc.local
sudo sed -i '/socat TCP4-LISTEN/d' /etc/rc.local
# حذف خط #!/bin/bash از ابتدای فایل اگر موجود باشد
sudo sed -i '1d' /etc/rc.local
# حذف خط exit 0 اگر دیگر خطوطی باقی نمانده باشند
if ! sudo grep -q 'socat TCP4-LISTEN' /etc/rc.local; then
sudo sed -i '$d' /etc/rc.local
fi
# حذف فایلهای پیکربندی IPv6 لوکال
if [[ -f "/etc/netplan/pdtun.yaml" ]]; then
sudo rm /etc/netplan/pdtun.yaml
sudo netplan apply
fi
if [[ -f "/etc/systemd/network/tun0.network" ]]; then
sudo rm /etc/systemd/network/tun0.network
sudo systemctl restart systemd-networkd
fi
echo "Script and local IPv6 settings uninstalled successfully."
else
echo "Uninstallation canceled."
fi
exit 0
}
# تابع برای افزودن کرون جاب برای ریستارت تانلها
add_cron_job() {
echo "Adding cron job to restart tunnels every hour..."
# چک کردن اینکه کرون جاب قبلاً وجود دارد یا نه
(sudo crontab -l 2>/dev/null | grep -q "restart-tunnels") || {
# اضافه کردن کرون جاب برای ریستارت تانلها
(sudo crontab -l 2>/dev/null; echo "0 * * * * /etc/rc.local --restart-tunnels >> /var/log/tunnel_restart.log 2>&1") | sudo crontab -
}
echo "Cron job added successfully."
}
# تابع برای ریستارت تانلها
restart_tunnels() {
echo "Restarting tunnels..."
sudo systemctl restart systemd-networkd
sudo systemctl restart socat
echo "Tunnels restarted successfully."
}
# تابع برای بارگذاری پورتها
load_ports() {
if [[ -f "$PORTS_FILE" ]]; then
ports=($(grep -oP 'LISTEN:\K\d+' "$PORTS_FILE"))
else
ports=()
fi
}
# تابع برای نمایش منو و پردازش ورودی
show_menu() {
clear
# طراحی ASCII Art سبز
echo -e "\033[0;32m"
echo " _____ _____ _____ _____ _____ _____ _____ _______ _ _ "
echo " | __ \ /\ | __ \ / ____| | __ \ |_ _| / ____| |_ _| |__ __| /\ | | | | "
echo " | |__) | / \ | |__) | | (___ | | | | | | | | __ | | | | / \ | | | | "
echo " | ___/ / /\ \ | _ / \___ \ | | | | | | | | |_ | | | | | / /\ \ | | | | "
echo " | | / ____ \ | | \ \ ____) | | |__| | _| |_ | |__| | _| |_ | | / ____ \ | |____ | |____ "
echo " |_| /_/ \_\ |_| \_\ |_____/ |_____/ |_____| \_____| |_____| |_| /_/ \_\ |______| |______|"
echo " "
echo -e "\033[0m" # بازگشت به رنگ پیشفرض
# فاصله
echo ""
# طراحی ASCII Art آبی روشن
echo -e "\033[1;34m"
echo " _______ ______ _ ______ _____ _____ __ __ __ __ __ __ ____ _ _ _______ _ _ ____ "
echo " |__ __|| ____|| | | ____|/ ____|| __ \ /\ | \/ | _ ____ | \/ |\ \ / // __ \ | | | ||__ __|| | | || _ \ "
echo " | | | |__ | | | |__ | | __ | |__) | / \ | \ / | (_) / __ \ | \ / | \ \_/ /| | | || | | | | | | | | || |_) |"
echo " | | | __| | | | __| | | |_ || _ / / /\ \ | |\/| | / / _\ || |\/| | \ / | | | || | | | | | | | | || _ / "
echo " | | | |____ | |____ | |____| |__| || | \ \ / ____ \ | | | | _ | | (_| || | | | | | | |__| || |__| | | | | |__| || |_) |"
echo " |_| |______||______||______|\_____||_| \_\/_/ \_\|_| |_| (_) \ \__,_||_| |_| |_| \____/ \____/ |_| \____/ |____/ "
echo " \____/ "
echo -e "\033[0m" # بازگشت به رنگ پیشفرض
echo -e "\033[0;32m"
echo "***** ParsDigitall Script Management *****"
echo -e "\033[0m"
echo "=========================================="
echo -n "Status: "
load_ports # بارگذاری پورتها
check_status # اضافه کردن وضعیت سرویس
echo "=========================================="
echo "1) Install Script"
echo "2) Add Local IPv6"
echo "3) Add IPv4 Tunnel"
echo "4) Uninstall Script"
echo "5) Exit"
echo "=========================================="
echo -n "Please select an option [1-5]: "
}
# منو اصلی
show_menu
read choice
case $choice in
1)
install_script
;;
2)
add_ipv6_local
;;
3)
add_ipv4_tunnel
;;
4)
uninstall_script
;;
5)
echo "Exiting..."
exit 0
;;
*)
echo "Invalid option. Please select a valid option."
exit 1
;;
esac
# پردازش ورودی برای ریستارت تانلها در صورت نیاز
if [ "$1" == "--restart-tunnels" ]; then
restart_tunnels
exit 0
fi