Export shadowsocks over cloak config support

This commit is contained in:
pokamest 2021-06-16 19:48:38 +03:00
parent 74a517d985
commit e7a22ad159
7 changed files with 170 additions and 43 deletions

View file

@ -16,6 +16,10 @@ RUN chmod a+x /opt/amnezia/start.sh
RUN curl -L https://github.com/cbeuw/Cloak/releases/download/v2.5.3/ck-server-linux-amd64-v2.5.3 > /usr/bin/ck-server RUN curl -L https://github.com/cbeuw/Cloak/releases/download/v2.5.3/ck-server-linux-amd64-v2.5.3 > /usr/bin/ck-server
RUN chmod a+x /usr/bin/ck-server RUN chmod a+x /usr/bin/ck-server
RUN curl -L https://github.com/shadowsocks/shadowsocks-rust/releases/download/v1.10.9/shadowsocks-v1.10.9.x86_64-unknown-linux-musl.tar.xz > /usr/bin/ss.tar.xz
RUN tar -Jxvf /usr/bin/ss.tar.xz -C /usr/bin/
RUN chmod a+x /usr/bin/ssserver
# Tune network # Tune network
RUN echo -e " \n\ RUN echo -e " \n\
fs.file-max = 51200 \n\ fs.file-max = 51200 \n\

View file

@ -39,6 +39,10 @@ echo -e "{\\n\
\"openvpn\": [\\n\ \"openvpn\": [\\n\
\"$OPENVPN_TRANSPORT_PROTO\",\\n\ \"$OPENVPN_TRANSPORT_PROTO\",\\n\
\"localhost:$OPENVPN_PORT\"\\n\ \"localhost:$OPENVPN_PORT\"\\n\
],\\n\
\"shadowsocks\": [\\n\
\"tcp\",\\n\
\"localhost:$SHADOWSOCKS_SERVER_PORT\"\\n\
]\\n\ ]\\n\
},\\n\ },\\n\
\"BypassUID\": [\\n\ \"BypassUID\": [\\n\
@ -51,3 +55,17 @@ echo -e "{\\n\
\"DatabasePath\": \"userinfo.db\",\\n\ \"DatabasePath\": \"userinfo.db\",\\n\
\"StreamTimeout\": 300\\n\ \"StreamTimeout\": 300\\n\
}" >/opt/amnezia/cloak/ck-config.json' }" >/opt/amnezia/cloak/ck-config.json'
# ShadowSocks config
sudo docker exec -i $CONTAINER_NAME bash -c '\
mkdir -p /opt/amnezia/shadowsocks; \
cd /opt/amnezia/shadowsocks || exit 1; \
SHADOWSOCKS_PASSWORD=$(openssl rand -base64 32 | tr "=" "A" | tr "+" "A" | tr "/" "A") && echo $SHADOWSOCKS_PASSWORD > /opt/amnezia/shadowsocks/shadowsocks.key; \
echo -e "{\\n\
\"local_port\": 8585,\\n\
\"method\": \"$SHADOWSOCKS_CIPHER\",\\n\
\"password\": \"$SHADOWSOCKS_PASSWORD\",\\n\
\"server\": \"0.0.0.0\",\\n\
\"server_port\": $SHADOWSOCKS_SERVER_PORT,\\n\
\"timeout\": 60\\n\
}" >/opt/amnezia/shadowsocks/ss-config.json'

View file

@ -21,9 +21,11 @@ iptables -t nat -A POSTROUTING -s $OPENVPN_SUBNET_IP/$OPENVPN_SUBNET_CIDR -o eth
# kill daemons in case of restart # kill daemons in case of restart
killall -KILL openvpn killall -KILL openvpn
killall -KILL ck-server killall -KILL ck-server
killall -KILL ssserver
# start daemons if configured # start daemons if configured
if [ -f /opt/amnezia/openvpn/ca.crt ]; then (openvpn --config /opt/amnezia/openvpn/server.conf --daemon); fi if [ -f /opt/amnezia/openvpn/ca.crt ]; then (openvpn --config /opt/amnezia/openvpn/server.conf --daemon); fi
if [ -f /opt/amnezia/shadowsocks/ss-config.json ]; then (ssserver -c /opt/amnezia/shadowsocks/ss-config.json &); fi
if [ -f /opt/amnezia/cloak/ck-config.json ]; then (ck-server -c /opt/amnezia/cloak/ck-config.json &); fi if [ -f /opt/amnezia/cloak/ck-config.json ]; then (ck-server -c /opt/amnezia/cloak/ck-config.json &); fi
tail -f /dev/null tail -f /dev/null

View file

@ -25,7 +25,7 @@ tls-server \\n\
tls-version-min 1.2 \\n\ tls-version-min 1.2 \\n\
$OPENVPN_TLS_AUTH" >/opt/amnezia/openvpn/server.conf' $OPENVPN_TLS_AUTH" >/opt/amnezia/openvpn/server.conf'
# Cloak config # ShadowSocks config
sudo docker exec -i $CONTAINER_NAME bash -c '\ sudo docker exec -i $CONTAINER_NAME bash -c '\
mkdir -p /opt/amnezia/shadowsocks; \ mkdir -p /opt/amnezia/shadowsocks; \
cd /opt/amnezia/shadowsocks || exit 1; \ cd /opt/amnezia/shadowsocks || exit 1; \

View file

@ -25,4 +25,5 @@ killall -KILL ssserver
# start daemons if configured # start daemons if configured
if [ -f /opt/amnezia/openvpn/ca.crt ]; then (openvpn --config /opt/amnezia/openvpn/server.conf --daemon); fi if [ -f /opt/amnezia/openvpn/ca.crt ]; then (openvpn --config /opt/amnezia/openvpn/server.conf --daemon); fi
if [ -f /opt/amnezia/shadowsocks/ss-config.json ]; then (ssserver -c /opt/amnezia/shadowsocks/ss-config.json &); fi if [ -f /opt/amnezia/shadowsocks/ss-config.json ]; then (ssserver -c /opt/amnezia/shadowsocks/ss-config.json &); fi
tail -f /dev/null tail -f /dev/null

View file

@ -1216,7 +1216,7 @@ void MainWindow::setupAppSettingsConnections()
connect(ui->pushButton_app_settings_open_logs, &QPushButton::clicked, this, [this](){ connect(ui->pushButton_app_settings_open_logs, &QPushButton::clicked, this, [this](){
Debug::openLogsFolder(); Debug::openLogsFolder();
QDesktopServices::openUrl(QUrl::fromLocalFile(Utils::systemLogPath())); //QDesktopServices::openUrl(QUrl::fromLocalFile(Utils::systemLogPath()));
}); });
} }
@ -1566,6 +1566,17 @@ void MainWindow::setupSharePageConnections()
}); });
}); });
connect(ui->pushButton_share_full_save, &QPushButton::clicked, this, [this](){
if (ui->textEdit_share_full_code->toPlainText().isEmpty()) return;
QString fileName = QFileDialog::getSaveFileName(this, tr("Save AmneziaVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.amnezia");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(ui->textEdit_share_full_code->toPlainText().toUtf8());
save.commit();
});
connect(ui->pushButton_share_amnezia_copy, &QPushButton::clicked, this, [this](){ connect(ui->pushButton_share_amnezia_copy, &QPushButton::clicked, this, [this](){
if (ui->textEdit_share_amnezia_code->toPlainText().isEmpty()) return; if (ui->textEdit_share_amnezia_code->toPlainText().isEmpty()) return;
@ -1606,14 +1617,14 @@ void MainWindow::setupSharePageConnections()
}); });
}); });
// connect(ui->pushButton_share_cloak_copy, &QPushButton::clicked, this, [this](){ connect(ui->pushButton_share_cloak_copy, &QPushButton::clicked, this, [this](){
// QGuiApplication::clipboard()->setText(ui->textEdit_share_openvpn_code->toPlainText()); QGuiApplication::clipboard()->setText(ui->plainTextEdit_share_cloak->toPlainText());
// ui->pushButton_share_cloak_copy->setText(tr("Copied")); ui->pushButton_share_cloak_copy->setText(tr("Copied"));
// QTimer::singleShot(3000, this, [this]() { QTimer::singleShot(3000, this, [this]() {
// ui->pushButton_share_cloak_copy->setText(tr("Copy")); ui->pushButton_share_cloak_copy->setText(tr("Copy"));
// }); });
// }); });
connect(ui->pushButton_share_amnezia_generate, &QPushButton::clicked, this, [this](){ connect(ui->pushButton_share_amnezia_generate, &QPushButton::clicked, this, [this](){
ui->pushButton_share_amnezia_generate->setEnabled(false); ui->pushButton_share_amnezia_generate->setEnabled(false);
@ -2129,22 +2140,11 @@ void MainWindow::updateSharingPage(int serverIndex, const ServerCredentials &cre
ui->pushButton_share_openvpn_copy->setEnabled(false); ui->pushButton_share_openvpn_copy->setEnabled(false);
ui->pushButton_share_openvpn_save->setEnabled(false); ui->pushButton_share_openvpn_save->setEnabled(false);
// QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::OpenVpn);
// QString cfg = protoConfig.value(config_key::last_config).toString();
// if (!cfg.isEmpty()) {
// // TODO add redirect-gateway def1 bypass-dhcp here and on click Generate config
// ui->textEdit_share_openvpn_code->setPlainText(cfg);
// }
// else {
// cfg = tr("Press Generate config");
// ui->textEdit_share_openvpn_code->setPlainText(cfg);
// ui->pushButton_share_openvpn_copy->setEnabled(false);
// ui->pushButton_share_openvpn_save->setEnabled(false);
// }
ui->toolBox_share_connection->setCurrentWidget(ui->page_share_openvpn); ui->toolBox_share_connection->setCurrentWidget(ui->page_share_openvpn);
} }
if (container == DockerContainer::OpenVpnOverShadowSocks) { if (container == DockerContainer::OpenVpnOverShadowSocks ||
container == DockerContainer::OpenVpnOverCloak) {
ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client")); ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client"));
ui->toolBox_share_connection->addItem(ui->page_share_shadowsocks, tr(" Share for ShadowSocks client")); ui->toolBox_share_connection->addItem(ui->page_share_shadowsocks, tr(" Share for ShadowSocks client"));
@ -2185,7 +2185,27 @@ void MainWindow::updateSharingPage(int serverIndex, const ServerCredentials &cre
} }
if (container == DockerContainer::OpenVpnOverCloak) { if (container == DockerContainer::OpenVpnOverCloak) {
ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client")); //ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client"));
ui->toolBox_share_connection->addItem(ui->page_share_cloak, tr(" Share for Cloak client"));
ui->plainTextEdit_share_cloak->setPlainText(QString(""));
QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::Cloak);
QString cfg = protoConfig.value(config_key::last_config).toString();
if (cfg.isEmpty()) {
const QJsonObject &containerConfig = m_settings.containerConfig(serverIndex, container);
ErrorCode e = ErrorCode::NoError;
cfg = CloakConfigurator::genCloakConfig(credentials, container, containerConfig, &e);
ui->pushButton_share_cloak_copy->setEnabled(true);
}
QJsonObject cloakConfig = QJsonDocument::fromJson(cfg.toUtf8()).object();
cloakConfig.remove(config_key::transport_proto);
cloakConfig.insert("ProxyMethod", "shadowsocks");
ui->plainTextEdit_share_cloak->setPlainText(QJsonDocument(cloakConfig).toJson());
} }
// Full access // Full access

View file

@ -274,7 +274,7 @@ QPushButton:hover {
<string notr="true"/> <string notr="true"/>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>8</number> <number>17</number>
</property> </property>
<widget class="QWidget" name="page_start"> <widget class="QWidget" name="page_start">
<widget class="QLabel" name="label_25"> <widget class="QLabel" name="label_25">
@ -5815,7 +5815,7 @@ QToolBox::tab:hover {
<number>0</number> <number>0</number>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>3</number>
</property> </property>
<property name="tabSpacing"> <property name="tabSpacing">
<number>6</number> <number>6</number>
@ -5825,8 +5825,8 @@ QToolBox::tab:hover {
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>100</width> <width>360</width>
<height>30</height> <height>360</height>
</rect> </rect>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
@ -5884,7 +5884,7 @@ p, li { white-space: pre-wrap; }
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>180</y> <y>260</y>
<width>341</width> <width>341</width>
<height>111</height> <height>111</height>
</rect> </rect>
@ -5947,14 +5947,50 @@ background: #282932;
<string>Copy</string> <string>Copy</string>
</property> </property>
</widget> </widget>
<widget class="QPushButton" name="pushButton_share_full_save">
<property name="geometry">
<rect>
<x>10</x>
<y>180</y>
<width>341</width>
<height>40</height>
</rect>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-size: 13pt;
font: &quot;Open Sans Semibold&quot;;
color:rgb(212, 212, 212);
background: #181922;
border-radius: 4px;
font-family: Lato;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
}
QPushButton:hover {
background: #282932;
}</string>
</property>
<property name="text">
<string>Save file</string>
</property>
</widget>
</widget> </widget>
<widget class="QWidget" name="page_share_amnezia"> <widget class="QWidget" name="page_share_amnezia">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>100</width> <width>360</width>
<height>30</height> <height>360</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
@ -6149,8 +6185,8 @@ background: #282932;
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>100</width> <width>360</width>
<height>30</height> <height>360</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
@ -6315,8 +6351,8 @@ background: #282932;
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>100</width> <width>360</width>
<height>30</height> <height>360</height>
</rect> </rect>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
@ -6493,10 +6529,10 @@ background: #282932;
<widget class="QLabel" name="label_share_ss_qr_code"> <widget class="QLabel" name="label_share_ss_qr_code">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>65</x> <x>85</x>
<y>250</y> <y>235</y>
<width>240</width> <width>200</width>
<height>240</height> <height>200</height>
</rect> </rect>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
@ -6539,13 +6575,59 @@ color: #15CDCB;
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>100</width> <width>360</width>
<height>30</height> <height>360</height>
</rect> </rect>
</property> </property>
<attribute name="label"> <attribute name="label">
<string> Share for Cloak client</string> <string> Share for Cloak client</string>
</attribute> </attribute>
<widget class="QPushButton" name="pushButton_share_cloak_copy">
<property name="geometry">
<rect>
<x>10</x>
<y>290</y>
<width>331</width>
<height>40</height>
</rect>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-size: 13pt;
font: &quot;Open Sans Semibold&quot;;
color:rgb(212, 212, 212);
background: #181922;
border-radius: 4px;
font-family: Lato;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 21px;
}
QPushButton:hover {
background: #282932;
}</string>
</property>
<property name="text">
<string>Copy</string>
</property>
</widget>
<widget class="QPlainTextEdit" name="plainTextEdit_share_cloak">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>331</width>
<height>221</height>
</rect>
</property>
</widget>
</widget> </widget>
</widget> </widget>
</widget> </widget>