feat: add macro definitions for firewall rules and auto-fill functionality in rule form modal, enhancing user experience and simplifying configuration

This commit is contained in:
2025-12-04 20:28:00 -05:00
parent 2046505109
commit c735435690
2 changed files with 127 additions and 4 deletions

View File

@@ -124,6 +124,83 @@ class Firewall extends Component
'Whois' => 'Whois'
];
// Macro Definitions with ports and protocols (as per Proxmox)
protected array $macroDefinitions = [
'Amanda' => ['proto' => 'tcp', 'dport' => '10080,10081,10082,10083'],
'Auth' => ['proto' => 'tcp', 'dport' => '113'],
'BGP' => ['proto' => 'tcp', 'dport' => '179'],
'BitTorrent' => ['proto' => 'tcp', 'dport' => '6881:6889'],
'BitTorrent32' => ['proto' => 'tcp', 'dport' => '32768:65535'],
'Ceph' => ['proto' => 'tcp', 'dport' => '6789,6800:7300'],
'CVSup' => ['proto' => 'tcp', 'dport' => '5999'],
'DHCPfwd' => ['proto' => 'udp', 'dport' => '67:68'],
'DHCPv6fwd' => ['proto' => 'udp', 'dport' => '546:547'],
'DNS' => ['proto' => 'udp', 'dport' => '53'],
'Distcc' => ['proto' => 'tcp', 'dport' => '3632'],
'FTP' => ['proto' => 'tcp', 'dport' => '21'],
'Git' => ['proto' => 'tcp', 'dport' => '9418'],
'HKP' => ['proto' => 'tcp', 'dport' => '11371'],
'HTTP' => ['proto' => 'tcp', 'dport' => '80'],
'HTTPS' => ['proto' => 'tcp', 'dport' => '443'],
'ICPV2' => ['proto' => 'udp', 'dport' => '3130'],
'IMAP' => ['proto' => 'tcp', 'dport' => '143'],
'IMAPS' => ['proto' => 'tcp', 'dport' => '993'],
'IPsec' => ['proto' => 'udp', 'dport' => '500'],
'IPsecah' => ['proto' => 'ah', 'dport' => ''],
'IPsecnat' => ['proto' => 'udp', 'dport' => '4500'],
'IRC' => ['proto' => 'tcp', 'dport' => '6667'],
'Jetdirect' => ['proto' => 'tcp', 'dport' => '9100'],
'L2TP' => ['proto' => 'udp', 'dport' => '1701'],
'LDAP' => ['proto' => 'tcp', 'dport' => '389'],
'LDAPS' => ['proto' => 'tcp', 'dport' => '636'],
'MSNP' => ['proto' => 'tcp', 'dport' => '1863'],
'MSSQL' => ['proto' => 'tcp', 'dport' => '1433'],
'Mail' => ['proto' => 'tcp', 'dport' => '25,465,587'],
'NFS' => ['proto' => 'tcp', 'dport' => '111,2049'],
'NNTP' => ['proto' => 'tcp', 'dport' => '119'],
'NNTPS' => ['proto' => 'tcp', 'dport' => '563'],
'NTP' => ['proto' => 'udp', 'dport' => '123'],
'OSPF' => ['proto' => 'ospf', 'dport' => ''],
'OpenVPN' => ['proto' => 'udp', 'dport' => '1194'],
'PCA' => ['proto' => 'tcp', 'dport' => '5631'],
'PMG' => ['proto' => 'tcp', 'dport' => '26'],
'POP3' => ['proto' => 'tcp', 'dport' => '110'],
'POP3S' => ['proto' => 'tcp', 'dport' => '995'],
'PPtP' => ['proto' => 'tcp', 'dport' => '1723'],
'Ping' => ['proto' => 'icmp', 'dport' => ''],
'PostgreSQL' => ['proto' => 'tcp', 'dport' => '5432'],
'Printer' => ['proto' => 'tcp', 'dport' => '515'],
'RDP' => ['proto' => 'tcp', 'dport' => '3389'],
'RIP' => ['proto' => 'udp', 'dport' => '520'],
'RNDC' => ['proto' => 'tcp', 'dport' => '953'],
'Razor' => ['proto' => 'tcp', 'dport' => '2703'],
'Rsyncd' => ['proto' => 'tcp', 'dport' => '873'],
'SANE' => ['proto' => 'tcp', 'dport' => '6566'],
'SMB' => ['proto' => 'tcp', 'dport' => '445'],
'SMTP' => ['proto' => 'tcp', 'dport' => '25'],
'SMTPS' => ['proto' => 'tcp', 'dport' => '465'],
'SNMP' => ['proto' => 'udp', 'dport' => '161,162'],
'SPAMD' => ['proto' => 'tcp', 'dport' => '783'],
'SSH' => ['proto' => 'tcp', 'dport' => '22'],
'SVN' => ['proto' => 'tcp', 'dport' => '3690'],
'SixXS' => ['proto' => 'tcp', 'dport' => '3874'],
'SpiceProxy' => ['proto' => 'tcp', 'dport' => '3128'],
'Squid' => ['proto' => 'tcp', 'dport' => '3128'],
'Submission' => ['proto' => 'tcp', 'dport' => '587'],
'Syslog' => ['proto' => 'udp', 'dport' => '514'],
'TFTP' => ['proto' => 'udp', 'dport' => '69'],
'Telnet' => ['proto' => 'tcp', 'dport' => '23'],
'Telnets' => ['proto' => 'tcp', 'dport' => '992'],
'Time' => ['proto' => 'tcp', 'dport' => '37'],
'Trcrt' => ['proto' => 'udp', 'dport' => '33434:33524'],
'VNC' => ['proto' => 'tcp', 'dport' => '5900:5909'],
'VNCL' => ['proto' => 'tcp', 'dport' => '5500:5509'],
'Web' => ['proto' => 'tcp', 'dport' => '80,443'],
'Webcache' => ['proto' => 'tcp', 'dport' => '3128,8080'],
'Webmin' => ['proto' => 'tcp', 'dport' => '10000'],
'Whois' => ['proto' => 'tcp', 'dport' => '43'],
];
// IP Aliases
public array $aliases = [];
public bool $showAliasForm = false;
@@ -464,6 +541,22 @@ class Firewall extends Component
}
// ==================== RULES ====================
/**
* Get macro definitions for frontend use
*/
public function getMacroDefinitionsProperty(): array
{
return $this->macroDefinitions;
}
/**
* Get details for a specific macro
*/
public function getMacroDetails(string $macro): ?array
{
return $this->macroDefinitions[$macro] ?? null;
}
protected function loadFirewallRules(): void
{

View File

@@ -1116,7 +1116,25 @@
{{-- Rule Form Modal --}}
@if($showRuleForm)
<div class="fixed inset-0 z-50 bg-black/50 backdrop-blur-sm flex items-center justify-center p-4">
<div class="fixed inset-0 z-50 bg-black/50 backdrop-blur-sm flex items-center justify-center p-4"
x-data="{
macroDefinitions: @js($this->macroDefinitions),
currentMacro: @entangle('ruleMacro'),
handleMacroChange() {
if (this.currentMacro && this.currentMacro !== '' && this.macroDefinitions[this.currentMacro]) {
const macroDef = this.macroDefinitions[this.currentMacro];
// Auto-populate protocol
if (macroDef.proto) {
$wire.set('ruleProto', macroDef.proto);
}
// Auto-populate destination port
if (macroDef.dport) {
$wire.set('ruleDport', macroDef.dport);
}
}
}
}"
x-init="$watch('currentMacro', () => handleMacroChange())">
<div class="relative w-full max-w-4xl bg-background-secondary rounded-xl border border-neutral/20 shadow-2xl max-h-[90vh] overflow-y-auto">
<button wire:click="cancelRuleForm" class="absolute top-4 right-4 text-base/50 hover:text-base transition-colors z-10">
<x-ri-close-line class="size-5" />
@@ -1152,7 +1170,10 @@
<option value="{{ $value }}">{{ $label }}</option>
@endforeach
</select>
<p class="text-xs text-base/60 mt-1">Select a macro or leave as "None" for custom rules</p>
<p class="text-xs text-base/60 mt-1">
<x-ri-lightbulb-line class="size-3 inline mr-0.5" />
Selecting a macro will automatically set the protocol and port(s)
</p>
</div>
{{-- Interface --}}
@@ -1189,19 +1210,28 @@
{{-- Protocol --}}
<div>
<label class="block text-sm font-medium mb-2">Protocol</label>
<label class="block text-sm font-medium mb-2">
Protocol
<span class="text-xs font-normal text-base/50">(auto-filled by macro)</span>
</label>
<select wire:model="ruleProto" class="w-full px-3 py-2 border border-neutral rounded-lg bg-background text-sm">
<option value="">Any</option>
<option value="tcp">TCP</option>
<option value="udp">UDP</option>
<option value="icmp">ICMP</option>
<option value="igmp">IGMP</option>
<option value="ah">AH (IPsec Authentication Header)</option>
<option value="esp">ESP (IPsec Encapsulating Security Payload)</option>
<option value="ospf">OSPF</option>
</select>
</div>
{{-- Destination Port --}}
<div>
<label class="block text-sm font-medium mb-2">Destination Port</label>
<label class="block text-sm font-medium mb-2">
Destination Port
<span class="text-xs font-normal text-base/50">(auto-filled by macro)</span>
</label>
<input type="text" wire:model="ruleDport" placeholder="e.g., 80, 443, 1000:2000" class="w-full px-3 py-2 border border-neutral rounded-lg bg-background text-sm">
</div>