diff --git a/wg_dashboard_backend/const.py b/wg_dashboard_backend/const.py index 1ae9cdb..06126c5 100644 --- a/wg_dashboard_backend/const.py +++ b/wg_dashboard_backend/const.py @@ -43,8 +43,6 @@ else: DEFAULT_CONFIG_DIR = "/config" os.makedirs(DEFAULT_CONFIG_DIR, exist_ok=True) -PEER_DEFAULT_ALLOWED_IPS = ["0.0.0.0/0", "::/0"] - ENV_CONFIG_DIR = os.getenv("ENV_CONFIG_DIR", DEFAULT_CONFIG_DIR) os.makedirs(ENV_CONFIG_DIR, exist_ok=True) diff --git a/wg_dashboard_backend/migrations/versions/008_create_allowed_ips.py b/wg_dashboard_backend/migrations/versions/008_create_allowed_ips.py new file mode 100644 index 0000000..ba654bb --- /dev/null +++ b/wg_dashboard_backend/migrations/versions/008_create_allowed_ips.py @@ -0,0 +1,21 @@ +from sqlalchemy import * +from migrate import * + + +def upgrade(migrate_engine): + try: + meta = MetaData(bind=migrate_engine) + server = Table('server', meta, autoload=True) + allowed_ips = Column('allowed_ips', Text) + allowed_ips.create(server) + except: + pass + + +def downgrade(migrate_engine): + try: + meta = MetaData(bind=migrate_engine) + server = Table('server', meta, autoload=True) + server.c.allowed_ips.drop() + except: + pass diff --git a/wg_dashboard_backend/migrations/versions/009_create_keep_alive.py b/wg_dashboard_backend/migrations/versions/009_create_keep_alive.py new file mode 100644 index 0000000..e5f3ae7 --- /dev/null +++ b/wg_dashboard_backend/migrations/versions/009_create_keep_alive.py @@ -0,0 +1,21 @@ +from sqlalchemy import * +from migrate import * + + +def upgrade(migrate_engine): + try: + meta = MetaData(bind=migrate_engine) + server = Table('server', meta, autoload=True) + keep_alive = Column('keep_alive', Integer) + keep_alive.create(server) + except: + pass + + +def downgrade(migrate_engine): + try: + meta = MetaData(bind=migrate_engine) + server = Table('server', meta, autoload=True) + server.c.keep_alive.drop() + except: + pass diff --git a/wg_dashboard_backend/models.py b/wg_dashboard_backend/models.py index 0c7ef68..4452be2 100644 --- a/wg_dashboard_backend/models.py +++ b/wg_dashboard_backend/models.py @@ -41,6 +41,8 @@ class WGServer(Base): public_key = Column(sqlalchemy.String) endpoint = Column(sqlalchemy.String) dns = Column(sqlalchemy.String) + allowed_ips = Column(sqlalchemy.String) + keep_alive = Column(sqlalchemy.Integer, default=0) read_only = Column(sqlalchemy.Integer, default=0) post_up = Column(sqlalchemy.String) @@ -63,6 +65,7 @@ class WGPeer(Base): shared_key = Column(sqlalchemy.Text) dns = Column(sqlalchemy.Text) allowed_ips = Column(sqlalchemy.String) + keep_alive = Column(sqlalchemy.Integer, default=0) read_only = Column(sqlalchemy.Integer, default=0) server_id = Column(Integer, sqlalchemy.ForeignKey('server.id', ondelete="CASCADE", onupdate="CASCADE")) diff --git a/wg_dashboard_backend/requirements.txt b/wg_dashboard_backend/requirements.txt index 3c3a41f..bd12c6a 100644 --- a/wg_dashboard_backend/requirements.txt +++ b/wg_dashboard_backend/requirements.txt @@ -13,4 +13,6 @@ sqlalchemy_utils sqlalchemy-migrate requests uvicorn +uvloop +httptools qrcode[pil] diff --git a/wg_dashboard_backend/routers/v1/peer.py b/wg_dashboard_backend/routers/v1/peer.py index 7bc8949..6f07958 100644 --- a/wg_dashboard_backend/routers/v1/peer.py +++ b/wg_dashboard_backend/routers/v1/peer.py @@ -64,8 +64,8 @@ def add_peer( peer.private_key = keys["private_key"] peer.public_key = keys["public_key"] - # Set 0.0.0.0/0, ::/0 as default allowed ips - peer.allowed_ips = ', '.join(const.PEER_DEFAULT_ALLOWED_IPS) + peer.allowed_ips = server.allowed_ips + peer.keep_alive = server.keep_alive # Set unnamed peer.name = "Unnamed" if not peer_add.name else peer_add.name diff --git a/wg_dashboard_backend/schemas.py b/wg_dashboard_backend/schemas.py index 2e71529..b5836d4 100644 --- a/wg_dashboard_backend/schemas.py +++ b/wg_dashboard_backend/schemas.py @@ -132,6 +132,7 @@ class WGPeer(GenericModel): server_id: str dns: str = None allowed_ips: str = None + keep_alive: int = None configuration: str = None class Meta: @@ -169,6 +170,8 @@ class WGServer(GenericModel): post_up: str = None post_down: str = None dns: str = None + allowed_ips: str = None + keep_alive: int = None read_only: int = None peers: pydantic.typing.List['WGPeer'] = [] diff --git a/wg_dashboard_backend/templates/peer.j2 b/wg_dashboard_backend/templates/peer.j2 index a4b9b42..5f0a91f 100644 --- a/wg_dashboard_backend/templates/peer.j2 +++ b/wg_dashboard_backend/templates/peer.j2 @@ -9,6 +9,5 @@ DNS = {{ data.peer.dns }} PublicKey = {{ data.server.public_key }} AllowedIPs = {{ data.peer.allowed_ips }} Endpoint = {{ data.server.endpoint }}:{{ data.server.listen_port }} -{% if data.peer.shared_key %} -PresharedKey = {{ data.peer.shared_key }} -{% endif %} +{% if data.peer.shared_key %}PresharedKey = {{ data.peer.shared_key }}{% endif %} +{% if data.peer.keep_alive %}PersistentKeepalive = {{data.peer.keep_alive}}{% endif %} diff --git a/wg_dashboard_frontend/src/app/interfaces/peer.ts b/wg_dashboard_frontend/src/app/interfaces/peer.ts index c96cb1d..9e58eec 100644 --- a/wg_dashboard_frontend/src/app/interfaces/peer.ts +++ b/wg_dashboard_frontend/src/app/interfaces/peer.ts @@ -7,6 +7,7 @@ export interface Peer { shared_key: string; dns: string; allowed_ips: string; + keep_alive: number; name: string; configuration: string; stats: { diff --git a/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.html b/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.html index f5c8882..af13857 100644 --- a/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.html +++ b/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.html @@ -107,7 +107,24 @@ - + + + + + Default allowed IPs + + + + + + + + Default PersistentKeepalive interval + + + + +

Keys

diff --git a/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.ts b/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.ts index 0227145..c8c534e 100644 --- a/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.ts +++ b/wg_dashboard_frontend/src/app/page/dashboard/add-server/add-server.component.ts @@ -44,6 +44,8 @@ export class AddServerComponent implements OnInit { defaultIPv4Address = "10.0.200.1" defaultDNS = this.defaultIPv4Address + ",8.8.8.8" defaultIPv6Address = "fd42:42:42::1" + defaultAllowedIPs = "0.0.0.0/0, ::/0" + defaultPersistentKeepalive = 0; serverForm: FormGroup = null; @@ -60,11 +62,13 @@ export class AddServerComponent implements OnInit { listen_port: new FormControl(this.defaultListenPort, [Validators.required, NumberValidator.stringIsNumber]), endpoint: new FormControl('', Validators.required), dns: new FormControl(this.defaultDNS), + allowed_ips: new FormControl(this.defaultAllowedIPs), + keep_alive: new FormControl(this.defaultPersistentKeepalive), private_key: new FormControl('' ), public_key: new FormControl('' ), post_up: new FormControl(''), post_down: new FormControl(''), - read_only: new FormControl(''), + read_only: new FormControl(0), // Unused on backend configuration: new FormControl(''), @@ -224,18 +228,17 @@ export class AddServerComponent implements OnInit { const idx = this.servers.indexOf(this.editServer); this.serverAPI.editServer(this.editServer, form).subscribe((server: Server) => { this.servers[idx] = server; + this.resetForm(); }); } else { this.serverAPI.addServer(form).subscribe((server: Server) => { this.servers.push(server); + this.resetForm(); }); } - - this.resetForm(); - } getKeyPair() { diff --git a/wg_dashboard_frontend/src/app/page/dashboard/peer/peer.component.html b/wg_dashboard_frontend/src/app/page/dashboard/peer/peer.component.html index bfca94a..da7af02 100644 --- a/wg_dashboard_frontend/src/app/page/dashboard/peer/peer.component.html +++ b/wg_dashboard_frontend/src/app/page/dashboard/peer/peer.component.html @@ -40,6 +40,13 @@

+

+ + PersistentKeepalive interval + + +

+

Keys