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:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user